Modern tarayıcılarda JSON Hijacking hala bir sorun mu var?


149

Backbone.js ve Tornado web sunucusunu kullanıyorum. Omurgada toplama verilerini almak için standart davranış JSON Dizisi olarak gönderilmektir.

Öte yandan, Tornado'nun standart davranışı, aşağıdaki güvenlik açığı nedeniyle JSON Dizisine izin vermemektir:

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

İlgili bir konu: http://haacked.com/archive/2009/06/25/json-hijacking.aspx

Gerçekten bir nesne listesi olduğunda JSON'umu bir nesneye sarmak zorunda kalmam daha doğal geliyor.

Bu saldırıları modern tarayıcılarda (mevcut Chrome, Firefox, Safari ve IE9) yeniden üretemedim. Aynı zamanda modern tarayıcıların bu sorunları ele aldığını hiçbir yerde doğrulayamadım.

Ne olası kötü programlama becerileri ne de kötü googling becerileri tarafından yanıltılmamı sağlamak için:

Bu JSON Hijacking saldırıları bugün modern tarayıcılarda hala sorun mu oluşturuyor?

(Not: Olası kopya için özür dilerim: Modern tarayıcıda 'JSON korsanlığı' yapmak mümkün mü? Ama kabul edilen cevap soruyu cevaplamadığı için - tekrar sormanın ve daha net açıklamalar yapmanın zamanı geldiğini düşündüm. .)


eval kullanıyor? o zaman aksi takdirde mümkün değil. Hayır. Hiçbir şey omurga tepkisini ayrıştırma biçiminde değiştirmediyse veya değiştirmediyse güvende olmalısınız
Deeptechtons

10
Genel olarak konuşursak, web güvenliğine asla "modern" bir tarayıcı kullanacağı varsayımıyla yaklaşmamalısınız.
Luke

7
@Luke - Reid için aşağıya bakınız. Genel olarak harika bir nokta - ama genel bir güvenlik sorusu sormuyorum. (Kullanıcılarım yalnızca modern bir tarayıcı kullanıyorlarsa kimlik doğrulaması yapabilecekler.)
Rocketman

4
@Luke, bazen devam etmeli ve modern kalıplarla (bu durumda REST gibi: geliştirmemize izin vermeliyiz: veri elde etmek bir GET işlemidir ve başka bir şey olmamalıdır), yalnızca şimdi uygulandıkları takdirde eski tehditlere karşı koruma sağlamadan küçük bir kitleye. Bu yüzden bu soru, başvurusu için bu tehdidi görmezden gelip gelmeyeceğini değerlendirmek için gerçekten değerlidir. Bir noktada, çok eski bir yazılıma sahip olan kullanıcının, onları yine de koruyamayacağımız başka tür tehditlere (kötü amaçlı yazılım) sahip olması muhtemeldir.
Frédéric

2
@jpaugh, bu varsayımları nerede görüyorsunuz? Bu tür eski yazılımlara sahip insanların zaten "korunamaz" olduğunu varsayıyorum. (Patenlerimin maliyetini haklı çıkarmak için, fiyatlarının üçte birini şimdiki patenlerimi giymem gerektiğinde üçte birinden daha az bir sürede giyilen karbon sürat patenlerine koymaya zaten alışmıştım. Sanırım buna değer, onlara binmek gibi, benim durumum.)
Frédéric

Yanıtlar:


112

Hayır, artık Firefox 21, Chrome 27 veya IE 10'da []veya {}kuruculara iletilen değerleri yakalamak mümkün değil . İşte, http://www.thespanner.co.uk adresinde açıklanan ana saldırılara dayanan küçük bir test sayfası. / 2011/05/30 / json kaçırma / :

( http://jsfiddle.net/ph3Uv/2/ )

var capture = function() {
    var ta = document.querySelector('textarea')
	ta.innerHTML = '';
	ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments)));
	return arguments;
}
var original = Array;

var toggle = document.body.querySelector('input[type="checkbox"]');
var toggleCapture = function() {
    var isOn = toggle.checked;
    window.Array = isOn ? capture : original;
    if (isOn) {
        Object.defineProperty(Object.prototype, 'foo', {set: capture});    
    } else {
        delete Object.prototype.foo;
    }
};
toggle.addEventListener('click', toggleCapture);
toggleCapture();

[].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) {
    el.addEventListener('click', function() {
        document.querySelector('textarea').innerHTML = 'Safe.';
        eval(this.value);
    });
});
<div><label><input type="checkbox" checked="checked"> Capture</label></div>
<div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div>
<div><textarea></textarea></div>

Kısa ve uzun formlar aracılığıyla dizileri ve nesneleri window.Arraybaşlatan bir ayarlayıcıyı geçersiz kılar ve Object.prototype.footest eder.

Bölüm 1.5'teki ES4 spesifikasyonu , nesne ve dizi başlatıcılar için yeni nesneler oluşturmak için nesne ve dizinin genel, standart bağlantılarının kullanılmasını gerektirir "ve" Internet Explorer 6, Opera 9.20 ve Safari 3 " Object ve Array'ın yerel veya global yeniden yayımlarına saygı göstermez, ancak orijinal Object ve Array yapıcılarını kullanır. " Bu, ES5, bölüm 11.1.4'te korunur .

Allen Wirfs-Brock , ES5'in aynı zamanda DefineOwnProperty kullandığından nesne başlatmanın ayarlayıcıları tetiklememesi gerektiğini belirttiğini açıkladı . MDN: Nesnelerle Çalışma , "JavaScript 1.8.1'den başlayarak, nesne ve dizi başlatıcılarda özellikler ayarlanırken ayarlayıcıların artık çağrılmadığını" belirtir. Bu, V8 sayı 1015'te giderildi .


28
2009'da Brendan Eich, tarayıcıların bana hala iyi bir fikir gibi görünen application / json ( bugzilla.mozilla.org/show_bug.cgi?id=376957#c75 ) olarak sunulan komut dosyalarını değerlendirmemelerini önerdi .

2
Kör POST CSRF'nin, özellikle metin / düz kodlama ile formlar kullanılarak hala mümkün olduğunu ve tokenler / nonce'ler kullanılarak yenilmesi gerektiğini unutmayın.

1
POST CSRF'ye evet. Buradaki tüm harika bilgileriniz için teşekkürler.
Rocketman

5
İfadeniz, yalnızca Array yapıcısının üzerine yazmak anlamına geldiğinde doğrudur. Mikrosoft IE ve Edge yine de UTF-7 JSON Hijacking'e karşı savunmasızdır. Son zamanlarda test etti (ve bugün tekrar eğlence için) ve hala çalışıyor.
user857990

2
UTF-16BE, Gareth Heyes
eel ghEEz
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.