일단 기본적으로 소스코드를 모두 제공해 준다.
코드먼저 분석해도 되지만 일단 문제자체의 어떤 기능이 있는지 직접 확인해봤다.
회원가입, 로그인, 패스워드 변경, 게시판 검색, 게시글 조회, 쓰기 요정도 기능이 있었다.
일단 기능자체가 너무적었고 해볼만한게 SQLi정도밖에없었는데 코드 안보고 그냥 테스트겸 때려봤을때는 터지는 곳이 한군데도 없었다.
일단 코드를 좀 봤는데 일단은 pre-compiled 형태로 쿼리가 구성되어있지는 않았다. 근데 필터링 함수랑 addslashes가 있었다.
필터링 키워드들은 그렇다 치더라도 일단 addslashes를 우회해야 뭘 하던말던 할 수 있었는데 mb_convert_encoding이나 배열형태의 파라미터도 없었고 정수형으로 처리되는 곳도 없었다. 그래서 order by나 column , table쪽으로 들어가는 쪽으로 유심히 보다가 요부분을 찾았다.
게시글 검색할때 처리하는 부분인데 입력값이 이미 필터 함수를 통해 한번 싹 검증을 거친뒤에 요 get_search_query 함수로 들어가고 해당 함수를 보면 내가 입력한 값이 컬럼명이랑 검색할 값에 세팅되는걸 볼 수 있었다.
이 때 컬럼명에 title# , 검색값에 %0a)# 요런식으로 넘겨주면 LOWER(title#) like '%%0a)#~ 요런식으로되서 인젝션이 터지는걸 확인할 수 있었다.
필터링 함수내에 union이랑 select이 없었기 때문에 실제로 테스트해보면 인젝션이 먹히고 있는걸 볼 수 있었다.
이제 플래그를 찾아야 되는데 일단 information이 필터링당하고 있어서 information_schema는 쓸수가 없었다. 다운로드 받은 소스 내에 포함된 텍스트파일에 flag 테이블의 구조가 있었는데 테이블명과 컬럼명이 모두 난수화된 값으로 박혀있는 상황이라 난감한 상황이었다.
일단 현재 db유저 권한이 mysql db에 접근 가능한지 확인해 봤는데 다행히 권한이 있었다.
그래서 테이블명은 간단히 mysql.innodb_table_stats 요걸 이용해서 구해줬다.
이제 컬럼명을 구해서 flag값을 뽑아야되는데 어차피 테이블명알고 union이 되서 다이렉트로 뽑으려고 시도했는데 왜인지 모르게 아무값도 튀어나오지가 않았다.
여기서 삽질좀하다가 곰곰히 생각해봤다. 일단 출력되는 컬럼은 1,2,4번째 칼럼인데 union select *,1 from flag테이블 일케해주면 플래그테이블컬럼1,플래그테이블컬럼2,플래그테이블컬럼3,플래그테이블컬럼4,1 요렇게 실제로는 들어갈거고 플래그테이블컬럼1,플래그테이블컬럼2,플래그테이블컬럼4 요게 출력이 되고 있었을 거라고 생각했다. 근데 아무것도안나오는거보니 실제 플래그는 플래그테이블컬럼3 요지점에 있을거라고 생각했고 이걸 뽑으려고 요렇게 값을 넣어봤다.
union select 1,* from flag테이블
요게 들어가면 1,테이블컬럼1,플래그테이블컬럼2,플래그테이블컬럼3,플래그테이블컬럼4 이렇게되서 플래그테이블컬럼3이 나올거라고 생각했는데 이건 문법자체가 안되는거라 에러가터졌다.
요기서 wargame.kr adm1nky인가 요문제에서 컬럼명 모를때 데이터뽑는 쿼리가 생각나서 시도해봤더니 정상적으로 플래그가 뽑혔다.
풀고나서
union select 1,* from flag테이블 요런식으로는 왜 못써먹지하면서 이것저것해보다가 테이블명에 alias를 주면 union select 1,t.* from flag테이블 as t 요렇게 쓸 수 있다는걸 알았다.
요런식으로도 가능하다.