codegate 2018 - rbsql writeup
코게 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 |