codegate 2018 - rbsql writeup

2018. 2. 6. 11:04


코게 2018 예선문제 풀이.


사정이 있어서 풀타임 참석은 못하고 저녁에 좀 풀고, 대회 끝나고 나서 서버가 닫히기 전에 웹문제만 풀어봤다.





rbsql



접속해 보니 아주 익숙한(몇년째 대회에서 보고있는 -_-;;;) 홈페이지가 나온다.


소스코드가 주어져서 분석을 해보니, 데이터베이스 대신 파일을 DB 로 사용하는 웹사이트이다.


회원 가입 시 스키마 파일에 파일명을 추가하고, 테이블 대신 파일을 생성한다. 


그리고 생성된 파일에 특정 포맷으로 데이터를 저장하고 읽어온다. 결국 그 과정에서 어떤 취약점이 발생할 것으로 생각했다.


스키마 파일은 제공되지 않아서 직접 만들어 주었다.(md5 형님 제공)





소스 코드를 분석해보니 포맷은 아래와 같았다.



문자 : \x01 + 길이(1byte) + 문자

배열 : \x02 + 길이(1byte) + 문자 또는 배열,...





그리고 파싱함수(rbParse) 를 살펴보면 저 위의 포맷대로 파싱해서 값을 읽어온다. 


문제는, 길이값이 1byte 라는 것. 1byte 인 데다가 256 글자까지 입력이 가능하므로, 256 글자를 입력하면 \xff + 1 = \x00 이 된다.



hyunmini@~/06.CTF/2018/codegate$ php -r 'echo chr(255);' | xxd

00000000: ff                                       .

hyunmini@~/06.CTF/2018/codegate$ php -r 'echo chr(256);' | xxd

00000000: 00




즉, 길이값의 인티저 오버플로우를 이용하면 그 다음 항목을 마음대로 조작할 수 있다는 것이다.


umail 에 256 글자를 집어넣으면 파싱할때 길이값이 0이므로 umail 은 바로 파싱이 끝나고 다음 항목으로 넘어가게 되는데,


이때 ip 와 level 을 조작할 수 있다. 가장 중요한 것은 level 을 2 로 바꿔주는 것이다.(admin) 




umail: '\x01\x20c4ca4238a0b923820dcc509a6f75849b\x01\x0dx.x.x.x\x01\x32' + 'AAAAAAAA...'   (전체 256 글자)



요렇게 해서 보내면 된다. 





아래는 python 코드






요렇게 가입하고 로그인하면 flag 가 뙇

'CTF Writeup' 카테고리의 다른 글

0ctf 2018 - LoginMe Writeup  (0) 2018.04.10
codegate 2018 miro writeup  (0) 2018.02.06
codegate 2018 Impel Down writeup  (0) 2018.02.06
Codegate 2017 - babypwn  (0) 2017.02.28
Codegate 2014 pwn 250 Writeup + pwntools 연습  (0) 2016.12.16

+ Recent posts