글쓴시점에 아직 대회가 진행중이라 대회가 끝나고나면 해당글은 공개로 돌리도록 하겠다.
들어가보면 다음과 같이 등록기능과 조회 기능 두가지가 존재한다.
archive.is가 뭐하는 건지 몰랐는데 찾아보니까 현재 존재하는 페이지에 대해서 스냅샷과 같은 개념으로 저장시켜놓고 나중에 이 페이지가 날라가도 저장된 페이지를 조회할 수 있다는 대충 뭐 그런 개념인 것 같았다.
그렇다면 위의 문서 저장 기능에서 내가원하는 url주소를 입력하면 해당 url 및 내용이 디비에 저장될 거라고 생각했다.
실제로 기능을 사용해 보니 내가 저장한 페이지를 검새기능을 통해 조회하면 실제 페이지 내용이 출력되는 것을 확인할 수 있었다.
여기까지 확인하고 그럼 저장할때 url대신 file://./index.php 요런식으로 입력해주면 서버 내 index.php파일의 내용을 읽어와 출력해줄거라고 생각하고 시도해봤는데 file을 필터링하고 있었다.
여기서 대충 SSRF겠다 생각이 들었고 일단은 필터링때문에 SSRF만 가지고 뭘 할 수 없을 것 같아 다른 취약점을 찾았는데 문서 저장할때 insert sql injection이 터지는걸 확인할 수 있었다.
끝났다 생각하고 123',0,1,20180303),(1,0x66696c653a2f2f2e2f696e6465782e706870,1,1,20180304)# 요런식으로 file://./index.php 삽입해서 접근해보면 되겠다 생각했는데 강제로 삽입한 file://./index.php 부분이 조회가 안되고 있었다.
뭐지 하고 생각하다가 업로드된 게시글에 914번이 비어있는걸 보니 업로드는 됬는데 리스트 페이지 접근시 안보이는거다 생각했고 리스트 페이지에는 데이터뽑아올 기준이 되는게 세션밖에 없었으므로 세션값이 문서저장시에 같이 박히고 있겠구나라고 추측할 수 있었다.
그렇다면 문서저장시 사용하는 쿼리구조에 대해 파악해서 세션관련 데이터뽑아주고 이 데이터도file://./index.php 넣을때 같이 넣어주면 되겠다고 생각했다.
우선 요런식으로 문서저장시 사용되는 쿼리에 대해 조회를 했다.
쿼리를 잘 보면 id부분에 세션관련된 값이 저장되고 있는걸 확인할 수 있었다. 근데 전체데이터가 안나오고 잘려 나오고 있어 substring으로 정확한 세션관련값을 가져왔다.
이제 구한 세션값을 토대로 file://./index.php를 읽어오는 쿼리를 삽입해줬다.
여기서 멘탈이 한번더 나갔는데 경로조작해가면서 index.php읽어볼려고 이것저것 넣어봤는데 죄다 실패했다. index.php가 존재하는 절대경로를 알아내야 했는데 딱히 방법이 떠오르지가 않았다. 그래서 경로관련해서 이것저것 찾아보다가 이런걸 발견했다.
/proc/self/cwd/란 놈인데 대충 현재 디렉토리와 같은 개념으로 사용할 수 있다고 한다.
요걸 활용해서 file:///proc/self/cwd/index.php로 시도해봤더니 플래그가 나왔다.
'CTF > Writeup' 카테고리의 다른 글
Truststealth CTF 2018 Linkedin Service (TRUST) 500 (0) | 2018.03.02 |
---|---|
Truststealth CTF 2018 Read Flag Revenge (TRUST) 500 (0) | 2018.03.02 |
SECCON Online CTF 2016 Anti-Debugging (0) | 2018.02.26 |
Google CTF 2017 Food (0) | 2018.02.13 |
su ctf 2014 (Reverse 200) Commercial Application! (0) | 2018.02.13 |