πPrototype pollution
property: thuα»c tΓnh, object: Δα»i tượng
Prototype pollution là gì ?
Prototype pollution lΓ lα» hα»ng mΓ kαΊ» tαΊ₯n cΓ΄ng cΓ³ thα» thΓͺm bαΊ₯t kα»³ thuα»c tΓnh nΓ o vΓ o cΓ‘c global object prototype.

MαΊ·c dΓΉ lα» hα»ng nΓ y thΖ°α»ng khΓ΄ng thα» khai thΓ‘c nhΖ° mα»i lα» hα»ng Δα»c lαΊp, nΓ³ Δα» cho kαΊ» tαΊ₯n cΓ΄ng. NαΊΏu α»©ng dα»₯ng sau ΔΓ³ xα» lΓ½ mα»t property(mα»t thuα»c tΓnh) cα»§a kαΊ» tαΊ₯n cΓ΄ng kiα»m soΓ‘t theo mα»t cΓ‘ch khΓ΄ng an toΓ n, Δiα»u nΓ y cΓ³ khαΊ£ nΔng chain tα»i lα» hα»ng khΓ‘c.
Trong lα» hα»ng client Javascript, nΓ³ mang dαΊ«n ΔαΊΏn lα» hα»ng DOM XSS, trong khi prototype pollution phΓa server side thΓ¬ dαΊ«n tα»i RCE(ΡΠ΄Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄).
Javascript prototypes and inheritance
α» phαΊ§n nΓ y chΓΊng ta sαΊ½ xem xΓ©t prototypes vΓ tΓnh kαΊΏ thα»«a cα»§a Javascript.
Object trong Javascript
NhΖ° cΓ‘c ngΓ΄n ngα»― cΓ‘ch chΓΊng ta Δược hα»c thΓ¬ cΓ³ mΓ΄n hα»c OOP (LαΊp trΓ¬nh hΖ°α»ng Δα»i tượng). ThΖ°α»ng sαΊ½ cΓ³ hai thα»© bαΊ‘n thΖ°α»ng Δược tiαΊΏp cαΊn nhiα»u nhαΊ₯t ΔΓ³ lΓ class vΓ object . CΓ³ thα» hiα»u ΔΖ‘n giαΊ£n rαΊ±ng class chΓnh lΓ mα»t cΓ‘i khung dα»±ng sαΊ΅n lΓͺn cΓ‘c yαΊΏu tα» cαΊ§n thiαΊΏt cho mα»t object , con object sαΊ½ kαΊΏ thα»«a lαΊ‘i tαΊ₯t cαΊ£ cΓ‘c property vΓ method

Mα»t object cα»§a javascript cΖ‘ bαΊ£n lΓ mα»t tαΊp hợp cα»§a key:value Δược biαΊΏn ΔΓͺn lΓ properties .
VΓ dα»₯ ΔΓ’y lΓ mα»t ΔoαΊ‘n object:
Khi ΔΓ³ Δα» truy cαΊp Δược giΓ‘ trα» thuα»c tΓnh trong object nΓ y, chΓΊng ta sαΊ½ cΓ³ hai cΓ‘ch thΖ°α»ng dΓΉng nhΖ° sau: user.roldAdmin , user['roleAdmin']

CΕ©ng nhΖ° data thΓ¬ properties cΕ©ng cΓ³ thα» chα»©a executable function hay cΓ²n gα»i lΓ hΓ m thα»±c thi. Khi ΔΓ³ nΓ³ Δược gα»i lΓ method
Prototypes trong Javascript là gì?
Mα»i object trong javascript Δược liΓͺn kαΊΏt vα»i cΓ‘c object khΓ‘c Δược biαΊΏn ΔαΊΏn lΓ prototype. Theo mαΊ·c Δα»nh Javascript sαΊ½ tα»± Δα»ng gαΊ―n object mα»i cho mα»t trong cΓ‘c built-in prototypes(cΓ‘c nguyΓͺn mαΊ«u Δược tΓch hợp sαΊ΅n) cα»§a nΓ³.
HΓ£y xem vΓ dα»₯:
Object tα»± Δα»ng kαΊΏt thα»«a tαΊ₯t cαΊ£ nhα»―ng thuα»c tΓnh cα»§a cΓ‘c prototypes Δược gΓ‘n, trα»« khi chΓΊng ΔΓ£ cΓ³ thuα»c tΓnh(properties) riΓͺng vα»i cΓΉng mα»t khΓ³a. Δiα»u nΓ y cho phΓ©p cΓ‘c nhΓ phΓ‘t triα»n tαΊ‘o cΓ‘c Δα»i tượng mα»i cΓ³ thα» sα» dα»₯ng lαΊ‘i cΓ‘c thuα»c tΓnh vΓ phΖ°Ζ‘ng thα»©c cα»§a cΓ‘c Δα»i tượng hiα»n cΓ³.
CΓ‘ch Object enheritance hoαΊ‘t Δα»ng?
BαΊ₯t cα»© khi nΓ o chΓΊng ta tham khαΊ£o thuα»c tΓnh cα»§a mα»t object thΓ¬ javascript enginer sαΊ½ ΔΖ°a cho chΓΊng ta cΓ‘c thuα»c tΓnh mΓ chΖ°a Δược Δα»nh nghΔ©a α» trong object ΔΓ³.
NαΊΏu khΓ³ hiα»u chΓΊng ta hΓ£y xem xΓ©t vΓ dα»₯ nhΖ° sau:

ChΓΊng ta thαΊ₯y rαΊ±ng α» Object admin chΓΊng ta khai bΓ‘o khΓ΄ng hα» cΓ³ thuα»c tΓnh nΓ o nhΖ°ng khi kiα»m tra thΓ¬ nΓ³ cΓ³ rαΊ₯t nhiα»u thuα»c tΓnh vΓ method trong ΔΓ³ vΓ nhα»―ng thuα»c tΓnh trΓͺn Δα»u Δược kαΊΏ thα»« tα»« Object.prototype
Prototype chain
Prototype chain lΓ mα»t tΓnh nΔng quan trα»ng trong JavaScript cho phΓ©p cΓ‘c Δα»i tượng kαΊΏ thα»«a cΓ‘c tΓnh nΔng tα»« cΓ‘c Δα»i tượng khΓ‘c. Mα»i Δα»i tượng trong JavaScript Δα»u cΓ³ mα»t thuα»c tΓnh prototype, cho biαΊΏt Δα»i tượng kαΊΏ thα»«a cΓ‘c tΓnh nΔng tα»« Δα»i tượng nΓ o.

Δiα»u quan trα»ng lΓ cΓ‘c object kαΊΏ thα»«a cΓ‘c properties khΓ΄ng chα» tα»« prototype trα»±c tiαΊΏp cα»§a chΓΊng mΓ cΓ²n tα»« tαΊ₯t cαΊ£ cΓ‘c object phΓa trΓͺn chΓΊng trong prototype chain. Trong vΓ dα»₯ trΓͺn, Δiα»u nΓ y cΓ³ nghΔ©a lΓ object username cΓ³ quyα»n truy cαΊp vΓ o cΓ‘c properties vΓ method cα»§a cαΊ£ String.prototype vΓ Object.prototype. CΓ‘c object khΓ‘c cΕ©ng tΖ°Ζ‘ng tα»± nhΖ° vαΊy.
Truy cαΊp prototype cα»§a object bαΊ±ng __proto__
ThαΊt ra cΓ³ thα» truy cαΊp prototype cα»§a object bαΊ±ng hai cΓ‘ch, ngoΓ i dΓΉng __proto__ thΓ¬ cΓ³ thα» dΓΉng function constructor()
α» phαΊ§n nΓ y chΓΊng ta sαΊ½ nΓ³i tα»i __proto__ . ThΓ¬ mα»i object cΓ³ mα»t property ΔαΊ·c biα»t mΓ bαΊ‘n cΓ³ thα» sα» dα»₯ng Δα» truy cαΊp prototype chΓnh nΓ³.
Dα»
hiα»u hΖ‘n thΓ¬: __proto__ cho phΓ©p mα»t object truy cαΊp thαΊ³ng vΓ o property prototype cα»§a cha nΓ³.
Vα»i bαΊ₯t kα»³ thuα»c tΓnh nΓ o bαΊ‘n chα» cαΊ§n truy cαΊp tα»i __proto__ bαΊ±ng cΓ‘ch sα» dα»₯ng dot nonation hoαΊ·c bracket

Modifying prototypes
Sα»a Δα»i prototype, mαΊ·c dΓΉ nΓ³ thΖ°α»ng Δược coi lΓ mα»t cΓ‘ch lΓ m khΓ΄ng tα»t, nhΖ°ng vαΊ«n cΓ³ thα» sα»a Δα»i cΓ‘c built-in prototype cα»§a JavaScript giα»ng nhΖ° bαΊ₯t kα»³ object nΓ o khΓ‘c. Δiα»u nΓ y cΓ³ nghΔ©a lΓ cΓ‘c nhΓ phΓ‘t triα»n cΓ³ thα» tΓΉy chα»nh hoαΊ·c ghi ΔΓ¨ hΓ nh vi cα»§a cΓ‘c built-in methods vΓ thαΊm chΓ thΓͺm cΓ‘c mothods mα»i Δα» thα»±c hiα»n cΓ‘c thao tΓ‘c hα»―u Γch.
VΓ dα»₯: JavaScript hiα»n ΔαΊ‘i cung cαΊ₯p phΖ°Ζ‘ng thα»©c trim() cho cΓ‘c chuα»i, cho phΓ©p bαΊ‘n dα»
dΓ ng xΓ³a mα»i khoαΊ£ng trαΊ―ng α» ΔαΊ§u hoαΊ·c cuα»i. TrΖ°α»c khi built-in methods nΓ y Δược giα»i thiα»u, ΔΓ΄i khi cΓ‘c nhΓ phΓ‘t triα»n ΔΓ£ thΓͺm triα»n khai tΓΉy chα»nh cα»§a riΓͺng hα» Δα»i vα»i hΓ nh vi nΓ y vΓ o object String.prototype bαΊ±ng cΓ‘ch thα»±c hiα»n nhΖ° sau:
CΓ‘ch cΓ‘c lα» hα»ng prototype pollution xαΊ£y ra
CΓ‘c lα» hα»ng gΓ’y prototype pollution thΖ°α»ng phΓ‘t sinh khi mα»t hΓ m JavaScript chα»©a cΓ‘c properties do ngΖ°α»i dΓΉng kiα»m soΓ‘t vΓ o mα»t object hiα»n cΓ³ mΓ khΓ΄ng cαΊ§n lα»c trΖ°α»c ΔαΊ§u vΓ o. Δiα»u nΓ y cΓ³ thα» cho phΓ©p kαΊ» tαΊ₯n cΓ΄ng ΔΖ°a vΓ o mα»t property bαΊ±ng cΓ‘ch dΓΉng nhΖ° __proto__, constructor().
Khai thΓ‘c thΓ nh cΓ΄ng prototype pollution yΓͺu cαΊ§u cΓ‘c thΓ nh phαΊ§n chΓnh sau:
A prototype pollution source - ΔΓ’y lΓ bαΊ₯t kα»³ ΔαΊ§u vΓ o nΓ o cho phΓ©p bαΊ‘n ΔαΊ§u Δα»c cΓ‘c Δα»i tượng nguyΓͺn mαΊ«u bαΊ±ng cΓ‘c thuα»c tΓnh tΓΉy Γ½.
A SINK - NΓ³i cΓ‘ch khΓ‘c, mα»t function JavaScript hoαΊ·c DOM element cho rce.
An exploitable gadget - ΔΓ’y lΓ bαΊ₯t kα»³ properties nΓ o Δược ΔΖ°a vΓ o sink mΓ khΓ΄ng Δược lα»c.
Prototype pollution sources
Prototype pollution source lΓ bαΊ₯t kα»³ ΔαΊ§u vΓ o nΓ o ngΖ°α»i dΓΉng cΓ³ thα» kiα»m soΓ‘t mΓ bαΊ‘n cΓ³ thα» thΓͺm bαΊ₯t kα»³ properties nΓ o tα»i prototype object.
Prototype pollution via the URL
Xem xΓ©t ΔoαΊ‘n URL sau, nΓ³ chα»©a chuα»i truy vαΊ₯n mΓ kαΊ» tαΊ₯n cΓ΄ng tαΊ‘o ra.
Khi chΓΊng ta phΓ’n tΓ‘ch ΔoαΊ‘n payload trΓͺn dΖ°α»i dαΊ‘ng key vΓ value thΓ¬ chΓΊng ta sαΊ½ cΓ³ ΔoαΊ‘n sau:
Tuy nhiΓͺn trong mα»t sα» trΖ°α»ng hợp phαΊ£i back tα»« object Δược target tα»i Object.prototype.
Prototype pollution via JSON input
CΓ‘c object do ngΖ°α»i dΓΉng kiα»m soΓ‘t thΖ°α»ng Δược lαΊ₯y tα»« mα»t chuα»i JSON bαΊ±ng method JSON.parse().
JSON.parse() cΕ©ng coi bαΊ₯t kα»³ key nΓ o trong Object JSON lΓ mα»t string, bao gα»m nhα»―ng thα»© nhΖ° __proto__. Δiα»u nΓ y cung cαΊ₯p mα»t vectΖ‘ tiα»m nΔng khΓ‘c cho prototype pollution.
VΓ dα»₯: giαΊ£ sα» kαΊ» tαΊ₯n cΓ΄ng tiΓͺm JSON Δα»c hαΊ‘i sau qua mα»t thΓ΄ng bΓ‘o trΓͺn web:
NαΊΏu Δiα»u nΓ y Δược chuyα»n Δα»i thΓ nh mα»t object JavaScript thΓ΄ng qua method JSON.parse(), thΓ¬ trΓͺn thα»±c tαΊΏ, object kαΊΏt quαΊ£ sαΊ½ cΓ³ property vα»i key __proto__, khi ΔΓ³ __proto__ lΓ thuα»c tΓnh riΓͺng cα»§a objectFromJson :
ChΓΊng ta cΓ³ thα» hiα»u rΓ΅ hΖ‘n bαΊ±ng hΓ¬nh αΊ£nh dΖ°α»i ΔΓ’y: Khi objectLiteral Δược tαΊ‘o nhΖ° dΖ°α»i thΓ¬ khi ΔΓ³ property evilProperty Δược gΓ‘n vΓ o Object.property.

CΓ²n dΓΉng JSON.parse() Δα» chuyα»n mα»t string -> object khi ΔΓ³ cΓ³ mα»t property lΓ __proto__ vΓ nΓ³ lΓ mα»t object cΓ³ property lΓ evilProperty vα»i value lΓ payload.

Prototype pollution sinks
Prototype pollution sinks vα» cΖ‘ bαΊ£n chα» lΓ mα»t function JavaScript hoαΊ·c DOM Element mΓ bαΊ‘n cΓ³ thα» truy cαΊp thΓ΄ng qua prototype pollution, cho phΓ©p bαΊ‘n thα»±c thi cΓ‘c system commands hoαΊ·c JavaScript tΓΉy Γ½.
VΓ¬ prototype pollution cho phΓ©p bαΊ‘n kiα»m soΓ‘t cΓ‘c properties mΓ nαΊΏu khΓ΄ng thΓ¬ khΓ΄ng thα» truy cαΊp Δược, Δiα»u nΓ y cΓ³ khαΊ£ nΔng cho phΓ©p bαΊ‘n tiαΊΏp cαΊn mα»t sα» phαΊ§n bα» sung trong α»©ng dα»₯ng. CΓ‘c nhΓ phΓ‘t triα»n khΓ΄ng quen vα»i tΓ¬nh trαΊ‘ng prototype pollution cΓ³ thα» cho rαΊ±ng ngΖ°α»i dΓΉng khΓ΄ng thα» kiα»m soΓ‘t cΓ‘c propert, Δiα»u ΔΓ³ cΓ³ nghΔ©a lΓ cΓ³ thα» chα» cΓ³ khαΊ£ nΔng lα»c α» mα»©c tα»i thiα»u.
Prototype pollution gadgets
Mα»t gadget cung cαΊ₯p mα»t phΖ°Ζ‘ng tiα»n Δα» biαΊΏn lα» hα»ng prototype pollution thΓ nh mα»t khai thΓ‘c thα»±c tαΊΏ.
Ứng dα»₯ng xα» lΓ½ khΓ΄ng an toΓ n, nhΖ° lΓ cΓ³ thα» pass qua sink mΓ khΓ΄ng Δược filter Δi.
KαΊ» tαΊ₯n cΓ΄ng cΓ³ thα» kiα»m soΓ‘t thΓ΄ng qua prototype pollution. NΓ³i cΓ‘ch khΓ‘c, Object phαΊ£i cΓ³ khαΊ£ nΔng inherit property do kαΊ» tαΊ₯n cΓ΄ng thΓͺm vΓ o propotype.
Example of a prototype pollution gadget
Nhiα»u thΖ° viα»n JavaScript chαΊ₯p nhαΊn mα»t object mΓ nhΓ phΓ‘t triα»n cΓ³ thα» sα» dα»₯ng Δα» ΔαΊ·t cΓ‘c tΓΉy chα»n cαΊ₯u hΓ¬nh khΓ‘c nhau. NαΊΏu khΓ΄ng cΓ³ property ΔαΊ‘i diα»n cho mα»t tΓΉy chα»n cα»₯ thα», thΓ¬ mα»t tΓΉy chα»n mαΊ·c Δα»nh Δược xΓ‘c Δα»nh trΖ°α»c thΖ°α»ng Δược sα» dα»₯ng Δα» thay thαΊΏ. Mα»t vΓ dα»₯ ΔΖ‘n giαΊ£n hΓ³a cΓ³ thα» trΓ΄ng giα»ng nhΖ° thαΊΏ nΓ y:
BΓ’y giα» hΓ£y xem code thΖ° viα»n sα» dα»₯ng transport_url nΓ y Δα» thΓͺm script reference vΓ o trang:
NαΊΏu nhΓ phΓ‘t triα»n website khΓ΄ng set transport_url property α» config object cα»§a hα», thΓ¬ ΔΓ’y lΓ mα»t gadget chΓΊng ta cΓ³ thα» khai khΓ‘c. Trong trΖ°α»ng hợp kαΊ» tαΊ₯n cΓ΄ng cΓ³ thα» injection Object.prototype globbal bαΊ±ng property transport_url cα»§a riΓͺng chΓΊng, property nΓ y sαΊ½ Δược config object inherit vΓ do ΔΓ³, Δược ΔαΊ·t lΓ m src cho tαΊp lα»nh nΓ y thΓ nh miα»n do kαΊ» tαΊ₯n cΓ΄ng chα»n.
VΓ dα»₯: nαΊΏu propotype cΓ³ thα» polluted thΓ΄ng qua mα»t query parameter, thΓ¬ kαΊ» tαΊ₯n cΓ΄ng chα» cαΊ§n dα»₯ nαΊ‘n nhΓ’n truy cαΊp mα»t URL Δược tαΊ‘o ΔαΊ·c biα»t Δα» khiαΊΏn trΓ¬nh duyα»t cα»§a hα» nhαΊp tα»p JavaScript Δα»c hαΊ‘i tα»« domain do kαΊ» tαΊ₯n cΓ΄ng kiα»m soΓ‘t:
BαΊ±ng cΓ‘ch cung cαΊ₯p data: URL, kαΊ» tαΊ₯n cΓ΄ng cΕ©ng cΓ³ thα» inject payload XSS vΓ o trong query parameter nhΖ° sau:
Client-side prototype pollution vulnerabilities
---- Exploiting prototype pollution for DOM XSS
Finding client-side prototype pollution sources manually
TΓ¬mclient-side prototype pollution sources theo cΓ‘ch thα»§ cΓ΄ng phαΊ§n lα»n lΓ mα»t trΖ°α»ng hợp thα» vΓ lα»i. NΓ³i tΓ³m lαΊ‘i, bαΊ‘n cαΊ§n thα» nhiα»u cΓ‘ch khΓ‘c nhau Δα» thΓͺm mα»t property tΓΉy Γ½ vΓ o Object.prototype cho ΔαΊΏn khi tΓ¬m Δược source phΓΉ hợp.
When testing for client-side vulnerabilities, this involves the following high-level steps:
Try to inject an arbitrary property via the query string, URL fragment, and any JSON input. For example:
vulnerable-website.com/?__proto__[foo]=bar
Khi test cho lα» hα»ng phΓa client, thα»±c hiα»n cΓ‘c bΖ°α»c sau:
Cα» gαΊ―ng inject bαΊ₯t kα»³ thuα»c tΓnh nΓ o qua chuα»i truy vαΊ₯n, url vΓ bαΊ₯t kα»³ ΔαΊ§u vΓ o JSON nΓ o. VΓ dα»₯ sau:
vulnerable-website.com/?proto[foo]=barVΓ o console cα»§a trΓ¬nh duyα»t, hΓ£y xem Object.prototype ΔΓ£ Δược inject thΓ nh cΓ΄ng hay chΖ°a.
NαΊΏu khΓ΄ng thΓ nh cΓ΄ng thΓ¬ cΓ³ thα» dΓΉng cΓ‘c kα»Ή thuαΊt khΓ‘c Δα» add Δược property vΓ o nhΖ° dot notation tα»« bracket notation:
vulnerable-website.com/?proto.foo=bar
Finding sources using DOM Invader
Vα» phαΊ§n nΓ y bαΊ‘n cΓ³ thα» sα» dα»₯ng extension cα»§a Burp suite, Δα»c α» ΔΓ’y.
Finding gadgets manually
Khi bαΊ‘n ΔΓ£ xΓ‘c Δα»nh Δược source cho phΓ©p bαΊ‘n thΓͺm cΓ‘c property tΓΉy Γ½ vΓ o Object.prototype global, bΖ°α»c tiαΊΏp theo lΓ tΓ¬m mα»t gadget phΓΉ hợp mΓ bαΊ‘n cΓ³ thα» sα» dα»₯ng Δα» tαΊ‘o ra mα»t khai thΓ‘c. TrΓͺn thα»±c tαΊΏ, chΓΊng ta nΓͺn sα» dα»₯ng DOM Invader Δα» thα»±c hiα»n viα»c nΓ y nhΖ°ng sαΊ½ hα»―u Γch nαΊΏu xem xΓ©t quy trΓ¬nh thα»§ cΓ΄ng vΓ¬ nΓ³ cΓ³ thα» giΓΊp cα»§ng cα» hiα»u biαΊΏt vα» lα» hα»ng bαΊ£o mαΊt.
Xem qua source code vΓ xΓ‘c Δα»nh bαΊ₯t kα»³ property nΓ o Δược α»©ng dα»₯ng sα» dα»₯ng hoαΊ·c bαΊ₯t kα»³ thΖ° viα»n nΓ o mΓ α»©ng dα»₯ng import vΓ o.
Trong Burp, bαΊt interception (Proxy > Options > Intercept server responses) vΓ chαΊ·n response cΓ³ chα»©a JavaScript mΓ bαΊ‘n muα»n kiα»m tra.
ThΓͺm mα»t cΓ’u lα»nh
debuggerα» ΔαΊ§u script, sau ΔΓ³forwardmα»i request vΓ response cΓ²n lαΊ‘i.Trong trΓ¬nh duyα»t cα»§a burp, Δi tα»i trang mΓ target script Δược load. CΓ’u lα»nh
debuggerdα»«ng thα»±c thi script.Trong khi script vαΊ«n pause,chuyα»n sang console vΓ nhαΊp ΔoαΊ‘n code dΖ°α»i ΔΓ’y, thay thαΊΏ
YOUR-PROPERTYvα»i mα»t trong cΓ‘c property mΓ bαΊ‘n nghΔ© sαΊ½ lΓ mα»t gadget cΓ³ tiα»m nΔng Δα» inject:
Property Δược add vΓ o global Object.prototype vΓ trΓ¬nh duyα»t sαΊ½ log mα»t stack trace tα»i console bαΊ₯t cα»© khi nΓ o nΓ³ Δược truy cαΊp
NhαΊ₯n vΓ o nΓΊt Δα» tiαΊΏp tα»₯c thα»±c thi lα»nh vΓ theo dΓ΅i console. NαΊΏu stack trace xuαΊ₯t hiα»n, Δiα»u nΓ y xΓ‘c nhαΊn rαΊ±ng property ΔΓ£ Δược truy cαΊp α» nΖ‘i nΓ o ΔΓ³ trong α»©ng dα»₯ng
Mα» rα»ng stack trace vΓ dΓΉng link Δược cung cαΊ₯p chuyα»n ΔαΊΏn dΓ²ng code mΓ property Δang Δược Δα»c
Sα» dα»₯ng cΓ‘c debugger controls cα»§a trΓ¬nh duyα»t, duyα»t qua tα»«ng giai ΔoαΊ‘n thα»±c thi Δα» xem liα»u property cΓ³ Δược chuyα»n ΔαΊΏn sink hay khΓ΄ng, chαΊ³ng hαΊ‘n nhΖ°
innerHTML()hoαΊ·ceval().LαΊ·p lαΊ‘i quy trΓ¬nh nΓ y cho bαΊ₯t kα»³ property nΓ o mΓ bαΊ‘n cho lΓ gadget tiα»m nΔng.
Finding gadgets using DOM Invader
Δα»c α» ΔΓ’y.
Prototype pollution via the constructor
NgoΓ i __proto__ thΓ¬ chΓΊng ta cΓ³ thα» truy cαΊp prototype object thΓ΄ng qua thuα»c tΓnh cΓ³ sαΊ΅n ΔΓ³ lΓ constructor
Constructor lΓ mα»t thuα»c tΓnh ΔαΊ·c biα»t trαΊ£ vα» hΓ m ΔΓ£ Δược dΓΉng Δα» tαΊ‘o ra Δα»i tượng ΔΓ³. Prototype object cΓ³ constructor chα» ΔαΊΏn hΓ m ΔΓ³ vΓ constructor cα»§a constructor sαΊ½ lΓ hΓ m constructor toΓ n cα»₯c (global).

VΓ ngoΓ i ra persion.constructor.prototype sαΊ½ nhΖ° person.__proto__
Bypassing flawed key sanitization
Mα»t cΓ‘ch rΓ΅ rΓ ng Δα» mα»t website ngΔn chαΊ·n lα» hα»ng prototype pollution lΓ lα»c property key Δược khi cho nΓ³ vΓ o mα»t object. Tuy nhiΓͺn mα»t lα» chung lΓ khΓ΄ng lαΊ·p lαΊ‘i quΓ‘ trΓ¬nh lα»c mα»t lαΊ§n nα»―a.
VΓ dα»₯ trong mα»t trang web sαΊ½ filter Δi __proto__ α» ΔαΊ§u vΓ o nαΊΏu cΓ³ nΓ³ xuαΊ₯t hiα»n thΓ¬ α» ΔΓ’y dev chα» lα»c duy nhαΊ₯t mα»t lαΊ§n mΓ khΓ΄ng kiα»m tra lαΊ‘i.


Khi ΔΓ³ nΓ³ sαΊ½ trα» thΓ nh ?proto.gadget=payload vΓ vαΊ«n exploit bΓ¬nh thΖ°α»ng.
Prototype pollution in external libraries
Prototype pollution via browser APIs
PPlution qua method fetch()
Fetch API cΕ©ng cαΊ₯p cho cΓ‘c nhΓ phΓ‘t triα»n Δα» trigger HTTP Request sα» dα»₯ng JS. Fetch() gα»m 2 tham sα»:
URL mΓ muα»n gα»i request tα»i
Mα»t object tα»± chα»n mΓ nΓ³ lΓ mα»t phαΊ§n cα»§a request nhΖ° lΓ method, header, body, parameter ...
ChΓΊng ta sαΊ½ xem xΓ©t ΔoαΊ‘n code JS sau:
PPution qua property Δược xΓ‘c Δα»nh cα»§a Object
CΓ‘c nhΓ phΓ‘t triα»n hiα»n tαΊ‘i ΔΓ£ block cΓ‘c gadgets tiα»m nΔng Δα» exploit. Xem vΓ dα»₯ nhΖ° nΓ y:

Δα»c α» ΔΓ’y
CΓ³ thα» dΓΉng key value mαΊ·c Δα»nh Δα» inject thay cho transport_url
Server-side prototype pollution
Detecting server-side prototype pollution via polluted property reflection
ChΓΊng ta sαΊ½ xem xΓ©t vΓ dα»₯ sau:

Xem vΓ dα»₯ trΓͺn chΓΊng ta thαΊ₯y rαΊ±ng cΓ³ mα»t Object lΓ Person cΓ³ 2 proprerties keys lΓ name vΓ age. NhΖ°ng sau ΔΓ³ thΓͺm mα»t property admin vΓ o Object.prototype, tiαΊΏn theo ΔΓ³ kiα»m tra xem admin cΓ³ phαΊ£i property thuα»c Object Person khΓ΄ng thΓ¬ nhαΊn vα»
false. Δiα»u Δang nΓ³i α» ΔΓ’y khi chΓΊng ta dΓΉng vΓ²ng lαΊ·p for Δα» in ra key thΓ¬ nΓ³ cΓ³ property admin. CΓ³ nghΔ©a lΓ Object Person ΔΓ£ kαΊΏ thα»«a property admin tα»« Object.prototype.

VαΊy lΓΊc nΓ y Δang false thΓ¬ inject thΓ nh true qua __proto__

Detecting server-side prototype pollution without polluted property reflection
ThΖ°α»ng thΓ¬ lα» hα»ng prototype pollution nΓ³ sαΊ½ khΓ΄ng reflect ra ngoΓ i nhΖ°ng khΓ΄ng cΓ³ nghΔ©a chΓΊng ta khΓ΄ng cΓ³ cΔn cΔn gΓ¬ Δα» khai thΓ‘c nΓ³.
ChΓΊng ta sαΊ½ xem xΓ©t 3 kα»Ή thuαΊt sau:
Status code override
JSON spaces override
Charset override
Status code override
Server-side Javascript frameworks nhΖ° lΓ Express cho phΓ©p cΓ‘c dev tαΊ‘o HTTP response status. Trong trΖ°α»ng hợp lα»i thΓ¬ phΓa server cΓ³ thα» ΔΖ°a ra mα»t HTTP response chung, nhΖ°ng nΓ³ bao gα»m mα»t object lα»i vα»i Δα»nh dαΊ‘ng JSON α» body, nΓ³ cung cαΊ₯p chi tiαΊΏt lα»i xαΊ£y xa.
α» ΔΓ’y khi nhαΊ―c tα»i lα»i thΓ¬ cΓ³ nΓ³ nghΔ©a lΓ bαΊ‘n nhαΊp sai thα»© gΓ¬ ΔΓ³ khΓ΄ng cho phΓ©p hoαΊ·c khΓ΄ng Δược phΓ©p truy cαΊp mα»t path nΓ o ΔΓ³ cα»§a trang web ...
VΓ dα»₯ mα»t trang web vαΊ«n trαΊ£ vα» status 200 nhΖ°ng Δi kΓ¨m mα»t object JSON bΓ‘o lα»i kΓ¨m status α» trong JSON lΓ 400
Δiα»u nΓ y Δược sinh ra vΓ¬ trong NodeJS cΓ³ mα»t module tΓͺn lΓ http-errors cΓ³ chα»©a ΔoαΊ‘n code sau:
NhΓ¬n sΖ‘ qua ΔoαΊ‘n code thΓ¬ chΓΊng ta cΓ³ thα» thαΊ₯y status nαΊΏu khΓ΄ng Δược lα»c kα»Ή cΓ ng thi chΓΊng ta cΓ³ thα» polluted status
JSON spaces override
Express Framework cung cΓ’p mα»t option lΓ json space , nΓ³ cho phΓ©p sα» lượng space Δα» thα»₯t lΓ¨ bαΊ₯t cα»© mα»t JSON data nΓ o cΓ³ trong response. HΓ£y thα» inject xem nΓ³ cΓ³ bα» αΊ£nh hΖ°α»ng hay khΓ΄ng?
Charset override
Express server sαΊ½ Δα» middleware xα» lΓ½ cΓ‘c request trΖ°α»c khi nΓ³ Δược server xα» lΓ½. Cho mα»t vΓ dα»₯ mα»t module body-parse thΖ°α»ng Δược sα» dα»₯ng Δα» parse phαΊ§n body trong request gα»i tα»i Δα» generate mα»t req.body object.

LΖ°u Γ½ rαΊ±ng sau ΔΓ³ ΔoαΊ‘n mΓ£ dΖ°α»i ΔΓ’y sαΊ½ pases mα»t object bαΊ₯t kα»³ tα»i hΓ m read() , cΓ‘i mΓ Δα»c phαΊ§n body cα»§a request Δα» parse. Mα»t trong nhΖ°ng tΓΉy chα»n lΓ encoding , xΓ‘c Δα»nh nhα»―ng kΓ½ tα»± encode Δα» dΓΉng. Δiα»u nΓ y Δược bαΊ―t nguα»n tα»« request ΔΓ³ thΓ΄ng qua hΓ m Δược gα»i lΓ getCharset(req) hoαΊ·c default lΓ UTF-8
Xem xΓ©t kα»Ή hΓ m getCharset() dΖ°α»ng nhΖ° cΓ‘c dev ΔΓ£ dα»± kiαΊΏn Content-Type header cΓ³ thα» chα»©a cΓ‘c charset khΓ΄ng rΓ΅ rΓ ng bα»i vαΊy hα» ΔΓ£ thα»±c hiα»n mα»t sα» logic Δα» revert mα»t chuα»i trα»ng trong trΖ°α»ng hợp nΓ y.
VΓ dα»₯ trong UTF-7 thΓ¬
foolΓ+AGYAbwBv-
{ "sessionId":"0123456789", "username":"wiener", "role":"+AGYAbwBv-" }
Gα»i request Δi mΓ server khΓ΄ng sα» dα»₯ng UTF-7 encode theo default bα»i vαΊy chuα»i string trΓͺn sαΊ½ xuαΊ₯t hiα»n α» dαΊ‘ng Δược encode.
Thα» polluted prototype qua
content-typeproperty bαΊ±ng cΓ‘c charset UFT-7:
{ "sessionId":"0123456789", "username":"wiener", "role":"default", "proto":{ "content-type": "application/json; charset=utf-7" }
Gα»i lαΊ‘i request α» ΔαΊ§u tiΓͺn. nαΊΏu cΓ³ thα» polluted
content-typetheo UTF-7 vα»«a Δược inject thΓ¬ res sαΊ½ nhΖ° nΓ y:
{ "sessionId":"0123456789", "username":"wiener", "role":"foo" }
Do mα»t bug trong _http_incoming module mΓ Δiα»u nΓ y vαΊ«n hoαΊ‘t Δα»ng ngay cαΊ£ khi loαΊ‘i bα» header Content-Type . Δα» trΓ‘ng overwrite properties thΓ¬ hΓ m _addHeaderLine() sαΊ½ check xem cΓ³ property nΓ o trΓΉng lαΊ·p khΓ΄ng Δược khi chuyα»n tα»i IncomingMessage Object
@protection: Khi nΓ y header sαΊ½ Δược xα» lΓ½ loαΊ‘i bα» mα»t cΓ‘ch hiα»u quαΊ£.
Scanning for server-side prototype pollution sources
ChΓΊng ta cΓ³ thα» sα» dα»₯ng Burp suite vα»i extension Server-Side Prototype Pollution Scanner Δα» quΓ©t.

Bypassing input filters for server-side prototype pollution
CΓ‘c trang web thΖ°α»ng cα» gαΊ―ng ngΔn chαΊ·n hoαΊ·c vΓ‘ cΓ‘c lα» hα»ng prototype pollution bαΊ±ng cΓ‘ch filter cΓ‘c key ΔΓ‘ng ngα» nhΖ° __proto__, nhΖ°ng nΓ³ cΓ³ thα» bα» bypass
VΓ dα»₯, kαΊ» tαΊ₯n cΓ΄ng cΓ³ thα»:
Obfuscate cΓ‘c tα»« khΓ³a bα» cαΊ₯m Δα» chΓΊng bα» bα» sΓ³t trong quΓ‘ trΓ¬nh filter. Bypassing flawed key sanitization.
Truy cαΊp prototype thΓ΄ng qua constructor thay vΓ¬
__proto__.
CΓ‘c App code tα»« nodejs cΓ³ thα» xΓ³a hoαΊ·c tαΊ―t hoΓ n toΓ n __proto__ bαΊ±ng cΓ‘ch sα» dα»₯ng command-line flags --disable-proto=delete hoαΊ·c --disable-proto=throw tΖ°Ζ‘ng α»©ng. Tuy nhiΓͺn, Δiα»u nΓ y cΕ©ng cΓ³ thα» Δược bypass bαΊ±ng cΓ‘ch sα» dα»₯ng constructor.
"constructor":{ "prototype":{ "isAdmin":true}}
Remote code execution via server-side prototype pollution
Identifying a vulnerable request
Δα» exec shell trong Node,cΓ³ thα» sα» dα»₯ng mΓ΄-Δun child_ process. child_process lΓ mα»t module trong Node.js, cho phΓ©p tαΊ‘o ra cΓ‘c tiαΊΏn trΓ¬nh con (child process) Δα» thα»±c hiα»n cΓ‘c tΓ‘c vα»₯ bαΊ₯t Δα»ng bα» (asynchronous) mΓ khΓ΄ng αΊ£nh hΖ°α»ng ΔαΊΏn tiαΊΏn trΓ¬nh chΓnh (main process).
BiαΊΏn mΓ΄i trΖ°α»ng NODE_OPTIONS cho xΓ‘c Δα»nh mα»t chuα»i command-line arguments sαΊ½ Δược sα» dα»₯ng theo mαΊ·c Δα»nh bαΊ₯t cα»© khi nΓ o bαΊ―t ΔαΊ§u Node process mα»i. VΓ¬ ΔΓ’y cΕ©ng lΓ property trΓͺn object env, cΓ³ thα» pollution Δược.
Mα»t sα» functions cα»§a Node Δα» tαΊ‘o cΓ‘c child processes mα»i chαΊ₯p nhαΊn shell property tΓΉy chα»n, cho phΓ©p cΓ‘c dev ΔαΊ·t mα»t shell cα»₯ thα», chαΊ³ng hαΊ‘n nhΖ° bash, Δα» chαΊ‘y cΓ‘c lα»nh trong ΔΓ³. BαΊ±ng cΓ‘ch kαΊΏt hợp Δiα»u nΓ y vα»i property NODE_OPTIONS ,cΓ³ thα» lΓ m pollution bαΊ±ng cΓ‘c res vα» server hacker.
Remote code execution via child_process.fork() and child_process.execSync()
CΓ‘c methods nhΖ° child_ process.spawn() vΓ child_ process.fork() cho phΓ©p cΓ‘c dev tαΊ‘o cΓ‘c child process Node mα»i. PhΖ°Ζ‘ng thα»©c fork() chαΊ₯p nhαΊn mα»t object tΓΉy chα»n trong ΔΓ³ mα»t trong cΓ‘c tΓΉy chα»n tiα»m nΔng lΓ execArgv property. ΔΓ’y lΓ mα»t araycΓ‘c chuα»i chα»©a cΓ‘c command-line arguments nΓͺn Δược sα» dα»₯ng khi sinh ra child process.
VΓ¬ gadget nΓ y cho phΓ©p kiα»m soΓ‘t trα»±c tiαΊΏp command-line arguments, Δiα»u nΓ y cho phΓ©p truy cαΊp vΓ o mα»t sα» vectΖ‘ tαΊ₯n cΓ΄ng khΓ΄ng thα» thα»±c hiα»n Δược khi sα» dα»₯ng NODE_OPTIONS.
Quan tΓ’m ΔαΊ·c biα»t lΓ Δα»i sα» --eval, cho phΓ©p bαΊ‘n chuyα»n JavaScript tΓΉy Γ½ sαΊ½ Δược child process thα»±c thi.
Ngoà i fork() thì còn có execSync() có thỠRCE.

Preventing prototype pollution vulnerabilities
Δα» khαΊ―c phα»₯c lα» hα»ng prototype pollution thΓ¬ cΓ³ thα» cΓ³ mα»t sα» cΓ‘ch sau:
ΔΓ³ng bΔng cΓ‘c properties bαΊ±ng
Object.freeze(Object.prototype)Thα»±c hiα»n validation trΓͺn cΓ‘c input JSON theo ΔΓΊng schema cα»§a α»©ng dα»₯ng
TrΓ‘nh sα» dα»₯ng cΓ‘c hΓ m cΓ³ ghΓ©p Δα» quy (recursive merge) cΓ‘c Δα»i tượng mα»t cΓ‘ch khΓ΄ng an toΓ n
Sα» dα»₯ng Δα»i tượng khΓ΄ng cΓ³ thuα»c tΓnh prototype, vΓ dα»₯
Object.create(null)Δα» trΓ‘nh αΊ£nh hΖ°α»ng ΔαΊΏn prototype chain
Sα» dα»₯ng
Mapthay vìObject
Tα»ng kαΊΏt
CαΊ£m Ζ‘n cΓ‘c bαΊ‘n ΔΓ£ Δα»c bΓ i viαΊΏt, tα»« cΓ‘c bΓ i sau mΓ¬nh sαΊ½ chα» note lαΊ‘i kiαΊΏn thα»©c chΓnh vΓ sαΊ½ k viαΊΏt chi tiαΊΏt nα»―a thay vΓ o ΔΓ³ viαΊΏt cΓ‘ch solve cΓ‘c bΓ i lab.
Last updated