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 300 - Legend? Legend! 본문

Hacking/CTF write up

SSCTF 2016 Quals: Web 300 - Legend? Legend!

dohki 2016. 3. 1. 02:22

Description


Legend! We make web a beautiful place.









Write-up



거의 아무런 기능도 없는 site이다. 실제로 동작하는 무언가를 찾기 매우 힘들다. 그래서 오히려 대놓고 injection 부분이 보였다.


news.php?newsid=1


newsid가 1, 2, 3, 4, 5, 6일 때 존재하는 글을 보여주었다. 처음에는 2-1나 1'-- - 같은 것들을 test 해보다가 안 되길래 포기했다. 한참 뒤 irc channel을 보다가 admin이 이 문제는 mongodb injection이라고 알려주는 걸 보게 되었다. 그리고 사람들이 처음에는 javascript error message가 나왔었는데 나오지 않는다면서 문제가 바뀌었냐는 불평을 하는 것을 보고, 바로 find query안에서 $where operator를 이용하여 javasciprt를 실행 시켜 blind injection을 하는 문제라는 생각이 들었다. 이렇게 바로 알 수 있던 이유는 마침 며칠 전에 있던 PLUS 동아리 내부 CTF에서 php와 mongodb를 이용한 nosql injection 문제를 내가 냈기 때문이다. 다음 문서를 참고해서 만들었다.


Server-Side Javascript Injection


하지만 blind injection 문제를 만들지는 못 했는데 그 이유는 다음과 같았다. 내가 사용하려던 mongodb의 version이 2.4.9였기 때문이다. 위 문서는 너무 오래 되어서 언급이 안 되어 있지만 version 2.4 부터는 db keyword가 더 이상 전역변수가 아니라서 위와 같은 방법으로 injection이 불가능하다. 그래서 맨 처음에 문제를 풀기 전에 admin에게 mongodb의 version을 물어 봤었는데 version에 관계 없이 풀 수 있다고 해서 잠깐 미궁에 빠졌었다. admin도 잘못 알고 있던 것이다. 그래도 사람들이 너무 잘 풀길래 어떻게든 풀어야 되겠다고 생각을 해서 믿음을 가지고 시도해 보았다.


위 문서를 보면 알겠지만 DoS 공격 등 다른 player가 피해를 입을 수 있기 때문에 admin이 blacklist를 설정해서 blacklist에 걸리면 index.php로 redirect 되도록 설정해 놓았다고 한다. 중요한 건, 문법 오류일 때와 결과가 없을 때와 blacklist에 걸렸을 때의 반응이 차이가 없고 무조건 index.php로 redirect 되는 것이라서 query 형태를 예측하기 매우 힘들었다. 몇 번의 삽질 끝에 다음과 같은 injection이 가능하다는 것을 알게 되었다.


?newsid=1'&&true&&'1


왼쪽 숫자는 아무런 연관이 없고 마지막 숫자로만 news.php의 load되는 내용이 달라지길래 조금의 삽질 뒤에 다음과 같은 query를 이용하고 있지 않을까 하는 추측이 가능했다. 다음 사진은 local 환경에서 임시로 setting하고 test 해 본 것이다.



실제로 아까 payload에서 true 대신에 this나 db라는 keyword가 통하는 사실을 보고 확신을 가지게 되었다. 이 뒤 부터는 위 문서에서 나와 있는 것처럼 blind injection을 통해서 data를 뽑아낼 수 있었다. script는 팀원인 Qwaz가 작성해 둔 것을 재활용했다.


collection은 f, news, system.indexes, user로 총 4개가 존재했고 바로 user부터 뽑기 시작했다. 왜냐하면 hint로 'Web300 the password is a lowercase letter'가 주어졌기 때문이다. 다행히 총 132개의 record 중에서 첫 번째  record가 admin이었다. 뽑은 결과는 다음과 같다.


{  "_id" : ObjectId("56d30bfaea684f010e8b456d"),  "username" : "admin",  "password" : "*&98*hjhjyu",  "email" : "loverctf@126.com" } 


위 email과 password로 실제로 존재하는 계정에 login할 수 있었고 받은 mail들을 읽어 보다가 flag를 발견하였다.


나중에야 확인한 사실이지만 실제로 이 문제에서 쓰인 mongodb의 version은 2.0.6이었다.



Flag


SSCTF{057ef83ac5e46d137a8941712d5fffc2}

Comments