wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 db_is_really_good 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번 문제는 DB에 대한 이해와 파일 다운로드 취약성이 있는 곳을 찾아볼 수 있어야 합니다.

DB에 어떤 값을 넣어야 터지는지에 대한 학습을 쭈욱 하고, 따라오시는 것을 추천합니다.



 

 문제 이해


문제는 다음과 같습니다.


문제에서는 어떤 데이터베이스 종류인지, 물어보기도 합니다.

여기서 user name과 database 내에서 값을 얻을 수 있다고 힌트를 주고 있습니다.


이제 한 번 문제로 들어가보도록 합시다.



문제에는 user라는 입력란과, 로그인 버튼이 있습니다.

힌트에서 user라는 곳에서 답을 얻을 수 있다고 했으니 별의 별 걸 다 넣어봤습니다.


일단 admin은 안 되네요.


일단 aa를 입력하고 로그인이 되어 들어가보았습니다.

위에는 입력창이 있고 write와 logout 버튼이 있습니다.

각각 입력, 로그아웃 버튼입니다.


아래의 그림을 보아하니 누가 또 열심히 때려밖아본 흔적이 보입니다.


별의 별 걸 다 입력해보았는데, 변하는 것이 없었습니다.



 

 문제 풀이


이번 문제는 역시나 user 영역에서 답을 구할 수 있었습니다.


SQL Injection은 아니었습니다. 다만, 다른 방향의 Injection입니다.

이는 일종의 개발자의 설계 실수가 있었다는 가정하에 만든 문제 같았습니다.



 

 특별한 결과가 돌아오는 값들


이번 문제에서 . 과 /를 넣었을 때의 결과가 달랐습니다.


만약 .을 넣게 되면 _로 바뀌게 되고, /를 넣게 되면 Fatal Error가 발생했습니다.

일단 .을 넣게 됐을 때의 반응은 별다른 의미는 없어보이고, Fatal Error에서 좋은 힌트를 얻을 수 있었습니다.


위와 같은 Fatal Error가 있습니다.


에러 내용을 쭉 살펴보니, open() 함수에서 에러가 발생한 것을 볼 수 있습니다.

우리가 입력한 값이 /이기 때문에 /가 들어간 곳이 어디인지 살펴보면 wkrm_ 와 .db 사이에 /가 부자연스럽게 들어가 있는 것을 볼 수 있습니다.

아마 wkrm_.db 파일이겠구나 싶어 다운로드를 해봅니다.


다운로드를 마치고 SQLite Expert Personal 프로그램으로 내용을 살펴보니 별 거 없었습니다.


아 링크, http://www.sqliteexpert.com/


그리고, /db 디렉토리가 디렉토리 리스팅 취약점으로 인해 모두 보이는 것을 확인할 수 있었습니다.



보아하니, wkrm_ + '우리가 입력한 값' + .db로 파일이 생성되는 것이며, 그 db에 값이 입력되는 것이라고 볼 수 있을 것 같습니다.

그렇다면, 우리가 입력하지 못했던 값이 admin입니다.


admin을 뒤에 붙인 파일을 찾아 다운로드 해보도록 합시다.



잡았다 요놈..




+ Recent posts