23 KiB
DOM XSS
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!
- Werk jy in 'n cybersecurity-maatskappy? Wil jy jou maatskappy adverteer in HackTricks? Of wil jy toegang hê tot die nuutste weergawe van die PEASS of laai HackTricks af in PDF-formaat? Kyk na die SUBSCRIPTION PLANS!
- Ontdek The PEASS Family, ons versameling eksklusiewe NFTs
- Kry die amptelike PEASS & HackTricks swag
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg my op Twitter 🐦@carlospolopm.
- Deel jou hacking-truuks deur PR's in te dien by die hacktricks-repo en hacktricks-cloud-repo.
DOM Kwesbaarhede
DOM-kwesbaarhede kom voor wanneer data vanaf aanvaller-beheerde bronne (soos location.search
, document.referrer
, of document.cookie
) onveilig oorgedra word na sinks. Sinks is funksies of objekte (bv. eval()
, document.body.innerHTML
) wat skadelike inhoud kan uitvoer of vertoon as dit kwaadwillige data ontvang.
- Bronne is insette wat deur aanvallers gemanipuleer kan word, insluitend URL's, koekies, en webboodskappe.
- Sinks is potensieel gevaarlike eindpunte waar kwaadwillige data kan lei tot nadelige gevolge, soos skripsie-uitvoering.
Die risiko ontstaan wanneer data vanaf 'n bron na 'n sink vloei sonder behoorlike validering of sanitisering, wat aanvalle soos XSS moontlik maak.
{% hint style="info" %} Jy kan 'n meer bygewerkte lys van bronne en sinks vind in https://github.com/wisec/domxsswiki/wiki {% endhint %}
Gewone bronne:
document.URL
document.documentURI
document.URLUnencoded
document.baseURI
location
document.cookie
document.referrer
window.name
history.pushState
history.replaceState
localStorage
sessionStorage
IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
Database
Gewone Sinks:
Oop Herlei | Javascript Injeksie | DOM-data manipulasie | jQuery |
---|---|---|---|
location |
eval() |
scriptElement.src |
add() |
location.host |
Function() konstrukteur |
scriptElement.text |
after() |
location.hostname |
setTimeout() |
scriptElement.textContent |
append() |
location.href |
setInterval() |
scriptElement.innerText |
animate() |
location.pathname |
setImmediate() |
someDOMElement.setAttribute() |
insertAfter() |
location.search |
execCommand() |
someDOMElement.search |
insertBefore() |
location.protocol |
execScript() |
someDOMElement.text |
before() |
location.assign() |
msSetImmediate() |
someDOMElement.textContent |
html() |
location.replace() |
range.createContextualFragment() |
someDOMElement.innerText |
prepend() |
open() |
crypto.generateCRMFRequest() |
someDOMElement.outerText |
replaceAll() |
domElem.srcdoc |
``Plaaslike lêerpad manipulasie | someDOMElement.value |
replaceWith() |
XMLHttpRequest.open() |
FileReader.readAsArrayBuffer() |
someDOMElement.name |
wrap() |
XMLHttpRequest.send() |
FileReader.readAsBinaryString() |
someDOMElement.target |
wrapInner() |
jQuery.ajax() |
FileReader.readAsDataURL() |
someDOMElement.method |
wrapAll() |
$.ajax() |
FileReader.readAsText() |
someDOMElement.type |
has() |
``Ajax versoek manipulasie | FileReader.readAsFile() |
someDOMElement.backgroundImage |
constructor() |
XMLHttpRequest.setRequestHeader() |
FileReader.root.getFile() |
someDOMElement.cssText |
init() |
XMLHttpRequest.open() |
FileReader.root.getFile() |
someDOMElement.codebase |
index() |
XMLHttpRequest.send() |
Skakel manipulasie | someDOMElement.innerHTML |
jQuery.parseHTML() |
jQuery.globalEval() |
someDOMElement.href |
someDOMElement.outerHTML |
$.parseHTML() |
$.globalEval() |
someDOMElement.src |
someDOMElement.insertAdjacentHTML |
Kliëntkant JSON injeksie |
``HTML5-opberg manipulasie | someDOMElement.action |
someDOMElement.onevent |
JSON.parse() |
sessionStorage.setItem() |
XPath injeksie | document.write() |
jQuery.parseJSON() |
localStorage.setItem() |
document.evaluate() |
document.writeln() |
$.parseJSON() |
**[**`Dienste weier`**](dom-xss.md#denial-of-service)** |
someDOMElement.evaluate() |
document.title |
``Koekie manipulasie |
requestFileSystem() |
``Dokument-domein manipulasie | document.implementation.createHTMLDocument() |
document.cookie |
RegExp() |
document.domain |
history.pushState() |
WebSocket-URL vergiftiging |
Kliëntkant SQL injeksie | Web-boodskap manipulasie | history.replaceState() |
WebSocket |
executeSql() |
postMessage() |
`` | `` |
Die innerHTML
sink aanvaar nie script
elemente op enige moderne blaaier nie, en svg onload
gebeure sal ook nie plaasvind nie. Dit beteken dat jy alternatiewe elemente soos img
of iframe
sal moet gebruik.
Hierdie tipe XSS is waarskynlik die moeilikste om te vind, aangesien jy binne-in die JS-kode moet kyk, sien of dit enige objek gebruik waarvan jy die waarde beheer, en in daardie geval sien of daar enige manier is om dit te misbruik om willekeurige JS uit te voer.
Gereedskap om hulle te vind
Voorbeelde
Oop Herlei
Van: https://portswigger.net/web-security/dom-based/open-redirection
Oop herlei kwesbaarhede in die DOM kom voor wanneer 'n skripsie data skryf, wat 'n aanvaller kan beheer, na 'n sink wat in staat is om navigasie oor domeine te begin.
Dit is van kritieke belang om te verstaan dat die uitvoering van willekeurige kode, soos javascript:alert(1)
, moontlik is as jy beheer het oor die begin van die URL waar die herleiding plaasvind.
Sinks:
location
location.host
location.hostname
location.href
location.pathname
location.search
location.protocol
location.assign()
location.replace()
open()
domElem.srcdoc
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.ajax()
$.ajax()
Koekie manipulasie
Vanaf: https://portswigger.net/web-security/dom-based/cookie-manipulation
DOM-gebaseerde koekie-manipulasie kwesbaarhede kom voor wanneer 'n skripsie data insluit, wat deur 'n aanvaller beheer kan word, in die waarde van 'n koekie. Hierdie kwesbaarheid kan lei tot onverwagte gedrag van die webbladsy as die koekie binne die webwerf gebruik word. Daarbenewens kan dit uitgebuit word om 'n sessie-fixatie-aanval uit te voer as die koekie betrokke is by die volg van gebruikersessies. Die primêre sink wat met hierdie kwesbaarheid geassosieer word, is:
Sinks:
document.cookie
JavaScript Injeksie
Vanaf: https://portswigger.net/web-security/dom-based/javascript-injection
DOM-gebaseerde JavaScript-injeksiekwesbaarhede word geskep wanneer 'n skrips data uitvoer, wat deur 'n aanvaller beheer kan word, as JavaScript-kode.
Sinks:
eval()
Function() constructor
setTimeout()
setInterval()
setImmediate()
execCommand()
execScript()
msSetImmediate()
range.createContextualFragment()
crypto.generateCRMFRequest()
Dokument-domein manipulasie
Vanaf: https://portswigger.net/web-security/dom-based/document-domain-manipulation
Dokument-domein manipulasie kwesbaarhede kom voor wanneer 'n skripsie die document.domain
eienskap stel deur gebruik te maak van data wat 'n aanvaller kan beheer.
Die document.domain
eienskap speel 'n sleutelrol in die handhawing van die selfde-oorsprong beleid deur webblaaier. Wanneer twee bladsye vanaf verskillende oorspronge hul document.domain
na dieselfde waarde stel, kan hulle sonder beperkings met mekaar interaksie hê. Alhoewel webblaaier sekere grense opleg op die waardes wat toegewys kan word aan document.domain
, om die toewysing van heeltemal onverwante waardes aan die werklike bladsy-oorsprong te voorkom, bestaan daar uitsonderings. Gewoonlik laat webblaaier die gebruik van kind of ouer domeine toe.
Sinks:
document.domain
WebSocket-URL vergiftiging
Van: https://portswigger.net/web-security/dom-based/websocket-url-poisoning
WebSocket-URL vergiftiging vind plaas wanneer 'n skrip beheerbare data as die teiken-URL vir 'n WebSocket-verbinding gebruik.
Sinks:
Die WebSocket
konstrukteur kan lei tot WebSocket-URL vergiftigingskwesbaarhede.
Skakel manipulasie
Van: https://portswigger.net/web-security/dom-based/link-manipulation
DOM-gebaseerde skakel-manipulasiekwesbaarhede ontstaan wanneer 'n skrip aanvaller-beheerbare data na 'n navigasie-teiken binne die huidige bladsy skryf, soos 'n kliekbare skakel of die indienings-URL van 'n vorm.
Sinks:
someDOMElement.href
someDOMElement.src
someDOMElement.action
Ajax versoek manipulasie
Vanaf: https://portswigger.net/web-security/dom-based/ajax-request-header-manipulation
Ajax versoek manipulasie kwesbaarhede ontstaan wanneer 'n skripsie aanvaller-beheerbare data in 'n Ajax versoek skryf wat uitgereik word met behulp van 'n XmlHttpRequest
objek.
Sinks:
XMLHttpRequest.setRequestHeader()
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.globalEval()
$.globalEval()
Plaaslike lêerpad-manipulasie
Van: https://portswigger.net/web-security/dom-based/local-file-path-manipulation
Plaaslike lêerpad-manipulasie kwesbaarhede ontstaan wanneer 'n skripsie aanvaller-beheerbare data aan 'n lêerhanterings-API deurgee as die filename
parameter. Hierdie kwesbaarheid kan deur 'n aanvaller uitgebuit word om 'n URL te konstrueer wat, as dit deur 'n ander gebruiker besoek word, kan lei tot die gebruiker se blaaier wat 'n willekeurige plaaslike lêer oopmaak of skryf.
Sinks:
FileReader.readAsArrayBuffer()
FileReader.readAsBinaryString()
FileReader.readAsDataURL()
FileReader.readAsText()
FileReader.readAsFile()
FileReader.root.getFile()
FileReader.root.getFile()
Kliëntkant SQL-inspuiting
Van: https://portswigger.net/web-security/dom-based/client-side-sql-injection
Kliëntkant SQL-inspuitingskwetsbaarhede kom voor wanneer 'n skripsie aanvaller-beheerbare data op 'n onveilige manier in 'n kliëntkant SQL-navraag inkorporeer.
Sinks:
executeSql()
HTML5-opbergingsmanipulasie
Van: https://portswigger.net/web-security/dom-based/html5-storage-manipulation
HTML5-opbergingsmanipulasie kwesbaarhede ontstaan wanneer 'n skripsie aanvaller-beheerbare data in die webblaaier se HTML5-opberging (localStorage
of sessionStorage
) stoor. Alhoewel hierdie aksie nie inherent 'n sekuriteitskwesbaarheid is nie, word dit problematies as die toepassing vervolgens die gestoorde data lees en dit onveilig verwerk. Dit kan 'n aanvaller in staat stel om die opbergingsmeganisme te gebruik om ander DOM-gebaseerde aanvalle uit te voer, soos kruissite-skripsing en JavaScript-inspuiting.
Sinks:
sessionStorage.setItem()
localStorage.setItem()
XPath-inspuiting
Vanaf: https://portswigger.net/web-security/dom-based/client-side-xpath-injection
DOM-gebaseerde XPath-inspuitingskwetsbaarheden kom voor wanneer 'n skripsie aanvaller-beheerbare data in 'n XPath-navraag inkorporeer.
Sinks:
document.evaluate()
someDOMElement.evaluate()
Kliëntkant JSON-injeksie
Vanaf: https://portswigger.net/web-security/dom-based/client-side-json-injection
DOM-gebaseerde JSON-injeksie kwesbaarhede kom voor wanneer 'n skripsie aanvaller-beheerbare data inkorporeer in 'n string wat as 'n JSON-datastruktuur geïnterpreteer word en dan deur die toepassing verwerk word.
Sinks:
JSON.parse()
jQuery.parseJSON()
$.parseJSON()
Web-boodskap manipulasie
Vanaf: https://portswigger.net/web-security/dom-based/web-message-manipulation
Web-boodskap kwesbaarhede ontstaan wanneer 'n skripsie aanvaller-beheerbare data as 'n web-boodskap na 'n ander dokument binne die blaaier stuur. 'n Voorbeeld van 'n kwesbare Web-boodskap manipulasie kan gevind word by PortSwigger se Web Security Academy.
Sinks:
Die postMessage()
metode vir die stuur van web-boodskappe kan kwesbaarhede veroorsaak as die gebeurtenisluisteraar vir die ontvangs van boodskappe die inkomende data op 'n onveilige manier hanteer.
DOM-data manipulasie
Vanaf: https://portswigger.net/web-security/dom-based/dom-data-manipulation
DOM-data manipulasie kwesbaarhede ontstaan wanneer 'n skripsie aanvaller-beheerbare data na 'n veld binne die DOM skryf wat gebruik word binne die sigbare UI of kliëntkant-logika. Hierdie kwesbaarheid kan deur 'n aanvaller uitgebuit word om 'n URL te konstrueer wat, as dit deur 'n ander gebruiker besoek word, die voorkoms of gedrag van die kliëntkant UI kan verander.
Sinks:
scriptElement.src
scriptElement.text
scriptElement.textContent
scriptElement.innerText
someDOMElement.setAttribute()
someDOMElement.search
someDOMElement.text
someDOMElement.textContent
someDOMElement.innerText
someDOMElement.outerText
someDOMElement.value
someDOMElement.name
someDOMElement.target
someDOMElement.method
someDOMElement.type
someDOMElement.backgroundImage
someDOMElement.cssText
someDOMElement.codebase
document.title
document.implementation.createHTMLDocument()
history.pushState()
history.replaceState()
Weiering van Diens
Vanaf: https://portswigger.net/web-security/dom-based/denial-of-service
DOM-gebaseerde weiering van diens kwesbaarhede kom voor wanneer 'n skripsie aanvaller-beheerbare data onveilig deurgee na 'n problematiese platform API. Dit sluit API's in wat, wanneer dit aangeroep word, kan lei tot die gebruiker se rekenaar wat oormatige hoeveelhede CPU- of skyfspasie verbruik. Sulke kwesbaarhede kan beduidende newe-effekte hê, soos die webblaaier wat die webwerf se funksionaliteit beperk deur pogings om data in localStorage
te stoor te verwerp of besige skripsies te beëindig.
Sinks:
requestFileSystem()
RegExp()
Dom Clobbering
{% content-ref url="dom-clobbering.md" %} dom-clobbering.md {% endcontent-ref %}
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!
- Werk jy in 'n cybersecurity-maatskappy? Wil jy jou maatskappy adverteer in HackTricks? Of wil jy toegang hê tot die nuutste weergawe van die PEASS of laai HackTricks in PDF af? Kyk na die SUBSCRIPTION PLANS!
- Ontdek The PEASS Family, ons versameling eksklusiewe NFTs
- Kry die amptelike PEASS & HackTricks swag
- Sluit aan by die 💬 Discord-groep of die telegram-groep of volg my op Twitter 🐦@carlospolopm.
- Deel jou hacking-truuks deur PR's in te dien by die hacktricks-repo en hacktricks-cloud-repo.