Google neden (1)? JSON yanıtlarına?


4076

Google neden while(1);(özel) JSON yanıtlarına öncelik veriyor?

Örneğin, Google Takvim'de bir takvimi açıp kapatırken yanıt :

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

Bunun insanların bunu yapmasını önlemek olduğunu varsayıyorum eval(), ama gerçekten yapmanız gereken tek şey değiştirmek whileve sonra ayarlanmış olacaksınız. Değerlendirme önleme insanların güvenli JSON ayrıştırma kodu yazmak emin olmak olduğunu varsayalım.

Ben de başka yerlerde, bir çift kullanılan bu gördüm, ama çok daha böylece Google (Gmail, Takvim, Kişiler vs.) Gariptir ki, Google Dokümanlar ile başlar &&&START&&&yerine ve Google İletişim ile başlamak gibi görünüyor while(1); &&&START&&&.

Burada neler oluyor?


45
İlk izlenimin doğru olduğuna inanıyorum. Kod aramaya başlar ve giriş akışını kaynağa bağlı olarak kesmeye çalışırsanız, yeniden düşünür ve bunu güvenli (ve Google'ın eylemleri nedeniyle daha kolay) şekilde yaparsınız.
Esteban Küber

34
muhtemelen bir takip sorusu: Google neden )]}'şimdi niçin başını çekiyor while(1);? Cevaplar aynı mı olurdu?
Gizmo

3
Değerlendirmeyi önleyecekti, ama sonsuz bir döngü ile değil.
Mardoxx

9
Bu )]}', for(;;);bir bayt kaydeden kullanılan facebook gibi baytları kurtarmak için de olabilir :)
Gras Double

3
Json JSON hijacking
ie'nin

Yanıtlar:


4293

ECMAScript 5 ile 2011'den beri resmi olarak tüm büyük tarayıcılarda düzeltilen büyük bir JSON güvenlik sorunu olan JSON ele geçirmesini önler .

Onaylanmış örnek: Google'ın, mail.google.com/json?action=inboxgelen kutunuzun ilk 50 mesajını JSON biçiminde döndüren bir URL'si olduğunu varsayalım . Diğer etki alanlarındaki kötü web siteleri, aynı köken politikası nedeniyle bu verileri almak için AJAX istekleri yapamaz, ancak URL'yi bir <script>etiket yoluyla ekleyebilirler . URL ile ziyaret edilir sizin çerezler ve tarafından Global dizi yapıcısı veya erişim yöntemine geçersiz kılma onları JSON içeriğini okumak için izin, bir yöntem bir nesne (dizi veya karma) özniteliği ayarlanmış her çağrıda olabilir.

Bunu önler while(1);veya &&&BLAH&&&önler: adresindeki bir AJAX isteği mail.google.commetin içeriğine tam erişime sahip olur ve bu içeriği kaldırabilir. Ancak bir <script>etiket ekleme, JavaScript'i herhangi bir işlem yapmadan körü körüne yürütür ve sonsuz bir döngüye veya sözdizimi hatasına neden olur.

Bu, siteler arası istek sahteciliği sorununu ele almaz .


228
Bu verileri elde etme isteği neden CSRF jetonu gerektirmiyor?
Jakub P.

235
Does for(;;);aynı işi yapmak? Bunu facebook'un ajax yanıtlarında gördüm.
Kral Julien

183
@JakubP. CSRF tokenlerini Google ölçeğinde saklamak ve korumak büyük miktarda altyapı ve maliyet gerektirir.
abraham

127
@JakubP. anti-CSRF önbellekleme ile karışıklığı token eder ve sunucu tarafında bir miktar kriptografik değerlendirme gerektirir. Google ölçeğinde, bu çok fazla CPU gerektirir. Bu tür istemciye aktarır.
bluesmoon

96
Bana sadece doğru başlık ayarlanmışsa sunucunun JSON 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. Bu şekilde, hassas bilgiler hiçbir zaman gönderilmez ve tarayıcı tarafı güvenliğe güvenmeniz gerekmez.
mcv

574

Yanıtın JSON ele geçirme yoluyla ifşa edilmesini önler.

Teorik olarak, HTTP yanıtlarının içeriği Aynı Köken Politikası ile korunur: bir alandaki sayfalar, diğer alandaki sayfalardan herhangi bir bilgi parçası alamaz (açıkça izin verilmedikçe).

Bir saldırgan sizin adınıza başka alan adlarında sayfa isteyebilir, örneğin bir <script src=...>veya <img>etiket kullanarak , ancak sonuç (üstbilgiler, içerik) hakkında herhangi bir bilgi alamaz.

Böylece, bir saldırganın sayfasını ziyaret ederseniz, e-postanızı gmail.com'dan okuyamazdı.

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

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

Birden fazla önlem var:

JSON'un hiçbir zaman çalışmadığından emin olmak

while(1);Google, JSON verilerinden önce bir ifade yerleştirerek JSON verilerinin hiçbir zaman Javascript olarak yürütülmemesini sağlar.

Yalnızca meşru bir sayfa tüm içeriği alabilir while(1);, kalanını çıkarabilir ve geri kalanını JSON olarak ayrıştırabilir.

for(;;);Örneğin Facebook'ta benzer sonuçlar elde edilen şeyler görülüyor.

JSON'un geçerli değil Javascript olduğundan emin olun

Benzer şekilde, JSON'dan önce geçersiz jetonlar eklemek &&&START&&&, bunun asla yürütülmediğinden emin olur.

JSON'u daima dışarıda bir Nesne ile döndürün

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

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

Geçerli bir JSON nesnesi, hiçbir şey içine alınmadığında Javascript'te geçerli değildir:

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

Ancak bu geçerli JSON'dur:

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

Bu nedenle, her zaman yanıtın en üst düzeyinde bir Nesne döndürdüğünüzden emin olun, yine de geçerli JSON olurken, JSON'un geçerli Javascript olmadığından emin olun.

Yorumlarda @hvd tarafından belirtildiği gibi, boş nesne {}geçerli Javascript'tir ve nesnenin boş olduğunu bilmek değerli bilgiler olabilir.

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

OWASP yolu, istemci kitaplığı değişikliği gerektirmediği ve geçerli JSON'u aktardığı için daha az müdahaleci. Bununla birlikte, geçmiş veya gelecekteki tarayıcı hatalarının bunu yenip geçemeyeceği kesin değildir. @Oriadam tarafından belirtildiği gibi, verilerin bir hata işleme yoluyla ayrıştırma hatasıyla sızdırıp sızmayacağı belirsizdir (örn. Window.onerror).

Google'ın yolu, otomatik serileştirmeyi desteklemesi için istemci kitaplığının kullanılmasını gerektirir ve tarayıcı hataları hakkında daha güvenli olduğu düşünülebilir.

Her iki yöntem de, geliştiricilerin yanlışlıkla savunmasız JSON göndermelerini önlemek için sunucu tarafı değişiklikleri gerektirir.


23
OWASP önerisi basitliği nedeniyle ilginçtir. Google'ın yolunun daha güvenli olmasının bir nedenini bilen var mı?
14'te

18
Hiçbir şekilde daha güvenli olmadığına inanıyorum . OWASP'yi burada sağlamak +1 için yeterince iyi bir neden gibi görünüyor.

30
Bir nesne hazır bilgisinin döndürülmesinin nedenscript etiketi veya evalişlevi bozduğunu belirtmek faydalı olabilir . Parantezler {}bir kod bloğu veya bir nesne değişmezi olarak yorumlanabilir ve kendi başına JavaScript öncekini tercih eder. Bir kod bloğu olarak, elbette geçersizdir. Bu mantıkla, gelecekteki tarayıcı davranışlarında öngörülebilir değişiklikler göremiyorum.
Manngo

16
Kötü kod yeterli değildir bir saldırgan ayrıca tarayıcının komut dosyası hata işleyiciyi ele geçirmek ( window.onerror) onerrorsözdizimi hataları ile davranış ne olduğundan emin değilim . Sanırım Google da emin değildi.
oriadam

12
"Geçerli bir JSON nesnesi, hiçbir şey içine alınmadığında Javascript'te geçerli değildir:" - {}Geçerli bir boş blok olan boş bir nesnenin ( ) önemsiz durumu hariç . Nesnenin boş olduğunu bilmek değerli bir bilgi olabilirse, bu istismar edilebilir.

371

Bu, başka bir sitenin verilerinizi çalmaya çalışmak için kötü hileler yapamamasını sağlamaktır. Örneğin , dizi yapıcısını değiştirip ardından bu JSON URL'sini bir <script>etiketle ekleyerek, kötü amaçlı bir üçüncü taraf sitesi JSON yanıtındaki verileri çalabilir. A while(1);başlangıcında, komut dosyası bunun yerine askıda kalır.

Öte yandan, XHR ve ayrı bir JSON ayrıştırıcı kullanan aynı site isteği while(1);öneki kolayca yok sayabilir .


6
Teknik olarak, ön ekiniz varsa "normal" JSON ayrıştırıcısı hata vermelidir.
Matthew Crumley

12
Saldırganlar XHR'yi değil, sadece düz eski bir <script>eleman kullanırlardı .
Laurence Gonsalves

9
@Matthew, elbette, ancak verileri JSON ayrıştırıcısına geçirmeden önce kaldırabilirsiniz. Bunu bir <script>etiketle
yapamazsın

7
Bunun örnekleri var mı? Dizi yapıcısının değiştirilmesine tekrar başvurulur, ancak bu bir hata uzun süredir düzeltilmiştir. Bir komut dosyası etiketi üzerinden alınan verilere nasıl erişebileceğini anlamıyorum. Son tarayıcıda çalışan kukla bir uygulama görmek isterim.
Dennis G

7
@joeltine, hayır, değil. Bkz. Stackoverflow.com/questions/16289894/… .

111

Bu, üçüncü bir tarafın JSON yanıtını <script>etiketli bir HTML belgesine eklemesini zorlaştırmak olacaktır . <script>Etiketin Aynı Köken Politikasından muaf olduğunu unutmayın .


21
Bu sadece yarım cevap. ObjectVe Arrayyapıcılarını geçersiz kılma hilesi olmasaydı , geçerli bir JSON yanıtı JavaScriptmiş gibi yürütmek her durumda tamamen zararsız olurdu. Evet, while(1);bir <script>etiket tarafından hedeflendiğinde yanıtın JavaScript olarak yürütülmesini engeller , ancak yanıtınız bunun neden gerekli olduğunu açıklamaz.
Mark Amery

ama iframe'leri nasıl önleyecek
Ravinder Payal

Komut dosyası etiketi hiçbir zaman aynı köken politikasından muaf değildir. Bunu benim için temizleyebilir misin?
Suraj Jain

82

Not : 2019 itibariyle, bu soruda tartışılan önleyici tedbirlere yol açan eski güvenlik açıklarının çoğu artık modern tarayıcılarda bir sorun değildir. Aşağıdaki cevabı tarihsel bir merak olarak bırakacağım, ancak gerçekten tüm konu, bu sorulduğunda 2010'dan (!!) radikal bir şekilde değişti.


Basit bir <script>etiketin hedefi olarak kullanılmasını engeller . (Peki, bunu engellemez, ancak tatsız hale getirir.) Bu şekilde kötü adamlar, bu komut dosyası etiketini kendi sitelerine koyamaz ve içeriğinizi getirmeyi mümkün kılmak için aktif bir oturuma güvenemezler.

edit - yorumu (ve diğer yanıtları) not edin. Sorun yıkılmış yerleşik tesisler, özellikle Objectve Arrayinşaatçılar ile ilgilidir. Bunlar, ayrıştırıldığında zararsız JSON'un saldırgan kodunu tetikleyebileceği şekilde değiştirilebilir.


17
Bu sadece yarım cevap. ObjectVe Arrayyapıcılarını geçersiz kılma hilesi olmasaydı , geçerli bir JSON yanıtı JavaScriptmiş gibi yürütmek her durumda tamamen zararsız olurdu. Evet, while(1);bir <script>etiket tarafından hedeflendiğinde yanıtın JavaScript olarak yürütülmesini engeller , ancak yanıtınız bunun neden gerekli olduğunu açıklamaz.
Mark Amery

11

Yana <script>etiket web dünyasında bir güvenlik zorunluluktur Aynı Kökeni Politikası muaf olup, while(1)JSON yanıtı önler eklendiğinde içinde bunu kötüye <script>etiketi.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.