Omfattande prototyp av föroreningsprylar PortSwigger forskning

Visar robotar med webbläsarikoner för att representera prylar

Vi är nya Lanserade en ny version av DOM Invader Vem kan hitta prototypinfektion på klientsidan (CSPP).

Om du ännu inte är bekant med prototypinfektionen på klientsidan, se inlägget ovan. Bara för att sammanfatta, ett framgångsrikt utnyttjande av CSPP kräver två komponenter:

  • Ett sätt att förgifta prototypen, känd som en prototypinfektionskälla.
  • Ett sätt att använda en förgiftad prototyp för faktisk exploatering, känd som en prototyp för en infektionsgadget.

I det här inlägget ska vi prata om CSPP-prylar i webbläsar-API:er och hur vi hittade dem i vanliga kataloger också.

Prototyp av infektionsprylar i webbläsarens JavaScript-gränssnitt

Jag blev ganska förvånad när jag upptäckte att några av JavaScript API:erna i webbläsaren innehåller en prototyp av infektionsprylar. Funktioner som accepterar objekt som argument kan vara lika förorenade som alla andra objekt. Gud Hämtning funktion Är ett sådant exempel. När du anropar en hämtning finns det ett valfritt argument som accepterar ett objekt – det låter dig styra rubriker, kroppsparametrar och så vidare. Om en webbplats inte specificerar en av dessa egenskaper kan en prototypinfektion användas för att kontrollera dem förutsatt att det finns en prototypinfektionskälla:

Object.prototype.body = "foo=bar";
fetch("https://news.google.com/", {method:"POST"})

Även ES5 funktioner som t.ex Object.defineProperty Sårbar – Om en utvecklare inte anger ett tillgångs-“värde”, kan prototypkontaminationskällor användas för att ersätta tillgångar! Tänk på följande exempel:

let myObject = {property:"Existing property value"};
Object.defineProperty(myObject,'property', {configurable:false,writable:false} );
myObject.property = 'Should fail';
alert(myObject.property);//Existing property value

Om du använder en prototypkontamination på värdeegenskapen kan du ersätta “egenskapen” även om den är definierad som oskrivbar:

Object.prototype.value="overwritten";
let myObject = {property: "Existing property value"};
Object.defineProperty(myObject,'property', {configurable:false,writable:false});
alert(myObject.property);//overwritten!

Så även om egendomen har blivit odefinierbar och oskriven, genom att använda en källa till prototypkontamination kan vi förgifta konturerna som används av Object.defineProperty För att ersätta fastighetens värde. Detta beror på att om du inte anger ett “värde”-attribut i dispositionen, använder JavaScript-motorn Object.prototype.

Googles dataanalys

När DOM Invader granskade olika bountysajter rapporterade DOM Invader om en gadget som heter “hitCallback“Skickad till”setTimeoutVi spårar det till Google Analytics med hjälp av setTimeout Att sjunka och upptäckte att “c“Innehåller värdet från prototypen för infektionsgadgeten:

this.Ja = function() {
   !b.fb && c && setTimeout(c, 10)
}

DOM Invader visar “hitCallback“Gadget inuti”setTimeout“Tvättställ:

Skärmbild som visar den förstorade DOM Invader DOM-skärmen med setTimeout-sink visas

Så för alla webbplatser som använder den här versionen av Google Analytics och har en prototyp av en källa på klientsidan, kommer det att vara möjligt att använda denna gadget för att uppnå DOM XSS på målwebbplatsen. Vi har framgångsrikt använt denna gadget på en välkänd och annan spelsajt.

Google Tag Manager

Vi har sett många webbplatser som använder Google Tag Manager skapa en sårbar gadget som ett resultat.”sequence“Det slutar i eval Tvättställ. Det finns också en annan gadget som heter “event_callback“Slutar i”setTimeoutTvättställ. Vi rapporterade dessa till Google men de hävdar att det är kundens ansvar att skicka kod som inte innehåller prototypkällor för kontaminering. Personligen tycker jag att de också ska fixa prylar så mycket som möjligt som djupskydd. Ganska lustigt, vår webbplats på akademin för internetsäkerhet har en av dessa prylar, men lyckligtvis finns det ingen källa till prototypinfektion. Vi har framgångsrikt använt denna gadget i den för närvarande fixade WordPress-domänen såväl som på flera andra webbplatser.

Exploateringen av WordPress ser ut så här:

https://es.wordpress.org/patterns/?__proto__%5Bsequence%5D=alert%28document.domain%29-

Det avslutande “-” krävs eftersom värdet slutar i ett JavaScript-uttryck bredvid ett heltal.

Skärmdump som visar DOM Invaders förstorade DOM-skärm med eval-sinken visad

Adobe Dynamic Tag Management

Sergej Bobrov Gjorde ett bra jobb med att dokumentera olika CSPP-sårbarheter. På Github-sidan märkte jag Adobe Dynamic Tag Management-skript Och bestämde sig för att skanna dem efter prylar. DOM Invader har hittat ett antal odokumenterade prylar såväl som befintliga. GadgetencspNonce“Använd i innerHTML Handfat också”bodyHiddenStyle“, Det slog innerHTML Även diskbänk men det finns