Soru Google neden hazırlanır (1); onların JSON yanıtları için?


Google neden ilk kez hazırlanıyor? while(1); (özel) JSON cevaplarına mı?

Örneğin, bir takvimi açıp kapatacağınız sırada bir yanıt. Google Takvim:

while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
  ['remindOnRespondedEventsOnly','true'],
  ['hideInvitations_remindOnRespondedEventsOnly','false_true'],
  ['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]

Bunun insanların yapmasını engellemek olduğunu varsayalım eval() Bunun üzerine, gerçekten yapmanız gereken tek şey yerine while ve sonra sen ayarlanacaksın. Değerlendirmenin önlenmesinin, kullanıcıların güvenli JSON ayrıştırma kodu yazmasını sağlamak olduğunu varsayardım.

Bunu diğer birkaç yerde de gördüm, ama Google ile çok daha fazla (Posta, Takvim, Kişiler, vb.) Garip bir şekilde, Google Dokümanlar ile başlar &&&START&&& bunun yerine Google Kişiler ile başlıyor gibi görünüyor while(1); &&&START&&&.

Burada neler oluyor?


3491
2018-04-19 18:00


Menşei


İlk izlenimin doğru olduğuna inanıyorum. Kod aramaya başlarsanız ve giriş kaynağını kaynağa bağlı olarak kırpmaya çalışırsanız, bunu tekrar gözden geçirip güvenli bir şekilde (ve Google'ın eylemleri, daha kolay olması nedeniyle) gerçekleştirirsiniz. - Esteban Küber
Muhtemelen bir takip sorusu: Neden Google hazırla? )]}' şimdi yerine while(1);? Cevaplar aynı mıdır? - Gizmo
Değerlendirmeyi önler, ancak sonsuz bir döngüde olmaz. - Mardoxx
Bu )]}' kullanılan facebook gibi baytları da kaydetmek olabilir for(;;); hangi bir byte kaydeder :) - Gras Double
Json'un açıklanmasını önlemek için JSON hijacking - Ashraf.Shk786


Cevaplar:


Engeller JSON kaçırma.

Gönüllü örnek: Google’ın mail.google.com/json?action=inbox gelen kutunuzun ilk 50 iletisini JSON biçiminde döndürür. Diğer etki alanlarındaki kötü web siteleri, AJAX isteklerinin aynı kaynak politikası nedeniyle bu verileri almasını sağlayamaz, ancak URL'yi bir <script> etiket. URL ile ziyaret edildi sizin kurabiyeler global dizi kurucu veya erişimci yöntemleri geçersiz kılma Bir nesne (dizi veya karma) özniteliği ayarlandığında, JSON içeriğini okumalarına izin veren bir yöntem olabilir.

while(1); veya &&&BLAH&&& bunu engeller: bir AJAX isteği mail.google.com metin içeriğine tam erişime sahip olacak ve onu uzaklaştırabilecektir. Ancak <script> etiket ekleme, herhangi bir işlem yapmadan JavaScript'i körü körüne yürütür, bu da sonsuz bir döngü veya bir sözdizimi hatasıyla sonuçlanır.

Bu sorunu ele almıyor siteler arası talep sahteciliği.


3770
2018-04-19 18:11



Bu verileri alma isteği neden bir CSRF belirteci gerektirmiyor? - Jakub P.
does for(;;); aynı işi yapmak Bunu facebook'un ajax yanıtlarında gördüm. - King Julien
@JakubP. CSRF jetonlarını Google’ın ölçeğinde saklamak ve sürdürmek, büyük miktarda altyapı ve maliyet gerektirir. - abraham
@JakubP. anti-CSRF tokenleri, önbelleğe alma ile karışıklık içerisindedir ve sunucu tarafında bir miktar kriptografik değerlendirme gerektirir. Google ölçeğinde, çok fazla CPU gerektirir. Bu çeşit, müşteriye yükler. - bluesmoon
Bana doğru bir üstbilgi ayarlanmışsa sunucunun sadece JSON'u göndermesine izin vermek daha iyi bir yol gibi görünüyor. Bunu AJAX çağrısında yapabilirsiniz, ancak komut dosyası etiketleriyle yapamazsınız. Böylelikle, hassas bilgiler asla gönderilmez ve tarayıcı tarafındaki güvenliğe güvenmeniz gerekmez. - mcv


JSON ele geçirme yoluyla yanıtın açıklanmasını önler.

Teorik olarak, HTTP yanıtlarının içeriği Aynı Kaynak Politikası tarafından korunur: bir alandaki sayfalar, başka bir alandaki sayfalardan herhangi bir bilgi alamaz (açıkça izin verilmedikçe).

Bir saldırgan, sizin adınıza başka alan adlarında sayfalar isteyebilir, ör. kullanarak <script src=...> veya <img>etiketi, ancak sonuç hakkında herhangi bir bilgi alamaz (üstbilgiler, içerikler).

Dolayısıyla, bir saldırganın sayfasını ziyaret ederseniz, e-postanızı gmail.com adresinden okuyamadı.

JSON içeriği talep etmek için bir komut dosyası etiketi kullanıldığında, JSON saldırganın kontrollü ortamında Javascript olarak yürütülür. Saldırgan, Dizi veya Nesne yapıcısını veya nesne yapımı sırasında kullanılan başka bir yöntemi değiştirebilirse, JSON içerisindeki herhangi bir şey saldırganın kodundan geçer ve açıklanır.

JSON'un, ayrıştırıldığı anda değil, Javascript olarak yürütüldüğü zamanda gerçekleştiğini unutmayın.

Birden fazla karşı önlem var:

JSON'un asla çalışmadığından emin olmak

Bir yerleştirerek while(1); JSON verisinden önce yapılan açıklamada, Google, JSON verilerinin hiçbir zaman Javascript olarak çalıştırılmadığından emin olur.

Sadece meşru bir sayfa aslında tüm içeriği alabilir, while(1);ve kalanını JSON olarak ayrıştırın.

Gibi şeyler for(;;); Örneğin, aynı sonuçlarla Facebook'ta görüldü.

JSON'un geçerli Javascript olmadığından emin olmak

Benzer şekilde, JSON'dan önce geçersiz jeton ekleyerek, &&&START&&&, hiçbir zaman idam edilmediğinden emin olur.

Her zaman JSON'u dışarıdaki bir Nesne ile döndür

Bu OWASP önerilen yol JSON kaçırma korumak için ve daha az müdahaleci olanıdır.

Önceki karşı önlemlere benzer şekilde, JSON'un hiçbir zaman Javascript olarak çalıştırılmamasını sağlar.

Geçerli bir JSON nesnesi, herhangi bir şeyle kapatılmadığında, Javascript'te geçerli değildir:

eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :

Ancak bu geçerli bir JSON:

JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}

Bu nedenle, her zaman bir Nesneyi yanıtın en üst düzeyine döndürdüğünüzden emin olmak, JSON'un geçerli bir JSON olmasına rağmen geçerli bir Javascript olmadığından emin olur.

Açıklamalarda @hvd ile belirtildiği gibi, boş nesne {} geçerli Javascript ve nesnenin boş olduğunu bilerek değerli bilgiler olabilir.

Yukarıdaki yöntemlerin karşılaştırılması

İstemci kitaplığı değişikliklerine gerek duymadığından ve geçerli JSON'u aktardığından, OWASP yöntemi daha az müdahaleci olur. Bununla birlikte, geçmiş veya gelecekteki tarayıcı hatalarının bunu yenebileceğinden emin değilsiniz. @Oriadam tarafından belirtildiği gibi, bir hata işleme yoluyla veya değilken (örneğin, window.onerror) bir ayrıştırma hatası içinde verinin sızdırılıp sızmayacağı açık değildir.

Google'ın yolu, otomatik serileştirmeyi desteklemek için istemci kitaplığı gerektirir ve tarayıcı hataları açısından daha güvenli sayılabilir.

Her iki yöntem de geliştiricilerin kazaya neden olan JSON'u yanlışlıkla göndermelerini önlemek için sunucu tarafında değişiklik yapılmasını gerektirir.


445
2018-02-02 12:09



OWASP önerisi, sadeliği nedeniyle ilgi çekicidir. Google'ın yolu daha güvenli olduğunu bilen var mı? - funroll
inanıyorum değil herhangi bir şekilde daha güvenli. OWASP'ın burada sağlanması, +1 için yeterince iyi bir neden gibi görünüyor. - vaxquis
2014'te hangi tarayıcılar Dizi veya Nesne yapıcısını değiştirmenize izin verir? - Filipe Giusti
Not etmek önemli olabilir niye ya bir nesneyi döndürmek, başarısız olur script etiket veya eval işlevi. Diş telleri {} bir kod bloğu veya bir nesne değişmezi olarak yorumlanabilir ve kendisi tarafından JavaScript, önceleri tercih eder. Bir kod bloğu olarak, elbette, geçersizdir. Bu mantıkla, gelecekteki tarayıcı davranışlarında öngörülebilir herhangi bir değişiklik göremiyorum. - Manngo
Kötü kod yeterli değildir, bir saldırgan da tarayıcının komut dosyası hata işleyicisini ele geçirebilir (window.onerror) Davranışının ne olduğundan emin değilim onerror sözdizimi hataları ile. Sanırım Google da emin değildi. - oriadam


Bu, başka bir sitenin verilerinizi çalmaya çalışmak için kötü hileler yapmamasını sağlamaktır. Örneğin, dizi kurucunun değiştirilmesidaha sonra bu JSON URL'sini <script> etiketi, kötü amaçlı bir üçüncü taraf sitesi JSON yanıtındaki verileri çalabilir. Koyarak while(1); başlangıçta, betik yerine asılacaktır.

Diğer taraftan, XHR ve ayrı bir JSON ayrıştırıcısını kullanan aynı site isteği, while(1); önek.


344
2018-05-16 02:08



Teknik olarak, bir "normal" JSON ayrıştırıcı, bir öneki varsa, bir hata vermelidir. - Matthew Crumley
Saldırganlar sadece düz bir eski kullanırdı <script> eleman, bir XHR değil. - Laurence Gonsalves
@Matthew, elbette, ancak verileri JSON ayrıştırıcısına iletmeden önce kaldırabilirsiniz. Bunu bir ile yapamazsın <script> etiket - bdonlan
Bunun bir örneği var mı? Dizi yapıcısını değiştirmek tekrar başvurulur, ancak bu uzun bir hata düzeltildi. Komut dosyası etiketi aracılığıyla alınan verilere nasıl erişileceğini anlamıyorum. Son tarayıcıda çalışan bir kukla uygulama görmek isterim. - Dennis G
@joeltine, hayır, değil. Görmek stackoverflow.com/questions/16289894/... .


Bu, bir üçüncü tarafın JSON yanıtını bir HTML belgesine ekleyebilmesini zorlaştırmaktı. <script> etiket. Unutmayın ki <script> etiketinden muaf Aynı Menşe Politikası.


98
2018-04-19 18:04



Bu sadece bir cevap. Eğer geçersiz kılma hilesi olmasaydı Object ve ArrayJavaScript gibi geçerli bir JSON cevabı yürüten kurucular, tüm koşullarda tamamen zararsız olacaktır. Evet while(1); tarafından hedeflenen yanıtın JavaScript olarak yürütülmesini önler <script> etiket, ama cevabınız neden gerekli olduğunu açıklamıyor. - Mark Amery
ancak iframe'leri nasıl önleyeceği - Ravinder Payal
@RavinderPayal <iframe> etiketler Aynı Kaynak Politikası'ndan muaf değildir ... - YoYoYonnY
Komut dosyası etiketi aynı başlangıç ​​politikasından asla muaf değildir. Bunu benim için açabilir misin? - Suraj Jain


Basit bir hedef olarak kullanılmasını önler <script> etiket. (Pekala, bunu engellemez, ama bu onu tatsız hale getirir.) Bu şekilde kötü adamlar bu script etiketini kendi sitelerine koyamazlar ve içeriğinizi getirmeyi mümkün kılmak için aktif bir oturuma güvenemezler.

Düzenle - Yorum (ve diğer cevaplar) dikkat edin. Sorun, özellikle alt yapıdaki yerleşik tesislerle ilgili olmalı Object ve Array kurucular. Aksi takdirde zararsız JSON, saldırıda bulunulduğunda, saldırganın kodunu tetikleyebilecek şekilde değiştirilebilir.


65
2018-04-19 18:02



Bu sadece bir cevap. Eğer geçersiz kılma hilesi olmasaydı Object ve ArrayJavaScript gibi geçerli bir JSON cevabı yürüten kurucular, tüm koşullarda tamamen zararsız olacaktır. Evet while(1); tarafından hedeflenen yanıtın JavaScript olarak yürütülmesini önler <script> etiket, ama cevabınız neden gerekli olduğunu açıklamıyor. - Mark Amery


Beri <script> etiketi, web dünyasında bir güvenlik gerekliliği olan Aynı Kaynak Politikası'ndan muaf tutulurken, (1) JSON yanıtına eklendiğinde, <script>etiket.


3
2017-08-18 04:14