Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

dohki

SSCTF 2016 Quals: Web 200 - Can You Hit Me? 본문

Hacking/CTF write up

SSCTF 2016 Quals: Web 200 - Can You Hit Me?

dohki 2016. 3. 1. 01:34

Description


Hit Hit Hit









Write-up



description이 되게 명확하지 않은데, $_GET['xss']를 통하여 alert나 prompt나 confirm을 실행할 수 있는 payload를 찾아서 그것을 증명하는 사진과 함께 mail을 보내면 flag를 준다. <, > 등 다양한 문자가 _로 치환되고 on, alert 등 다양한 keyword가 공백으로 치환된다.



payload가 injection되는 부분을 보면 꼭 tag를 하나라도 만들기 위해 <와 >의 사용이 불가피한 상황이었다. 그래서 맨 처음에는 'xss without angle bracket' 같은 걸로 googling을 했었다. 계속 attribute를 통한 XSS만 나오길래 일반적인 XSS는 절대 불가능할 거라고 생각하고 혹시나 해서 XXN을 찾아 보았다. 그런데 생각해보니 어차피 XXN은 browser의 문제이고 이미 patch가 되었기 때문에 아닐 거라는 생각을 하게 되었다. 더 이상 방법을 찾지 못하여 포기를 하고 있던 도중 html source를 보고 있다가 ng-app이라는 것을 발견했고 AngularJS 위에서 돌아가고 있다는 사실을 알게 되었다. 하지만 AngularJS가 뭔지 몰랐고 js.js의 source가 너무 길어 읽기 싫어서 아무것도 없을 것이라는 가정을 해 버리고 포기해 버렸다. 한참 뒤에 팀원인 Qwaz가 AngularJS에는 Two-way data binding이라는 게 있다는 것을 알려 주었다. 듣는 순간 감이 와서 'angularjs xss'라고 googling 하고 다음과 같은 post를 발견했다.


XSS without HTML: Client-Side Template Injection with AngularJS


이 안에 있는 많고 많은 payload 중 <, >가 필요 없는 다음 payload를 선택했다.



여기서 잠깐 막혔었는데, 그 이유는 +도 _로 치환 되었기 때문이다. 그래서 +''가 꼭 있어야 하는가에 대해서 고민하고 있었는데 Qwaz가 +''를 빼고 시도해 보더니 된다는 사실을 발견했다. 이 문제의 많은 치환들을 bypass하기 위해서 최종적으로 다음과 같은 payload를 사용하였다.


?xss={{‘a’.coonnstructor.prototype.charAt=[].join;$eevalval(‘x=aalertlert(1)’)}}




Flag


SSCTF{4c138226180306f21ceb7e7ed1158f08}

Comments