본문 바로가기
Hacking/wargame.kr

[wargame.kr] Question 9. DB is really GOOD

by 알거음슴 2021. 6. 28.

문제

What kind of this Database? you have to find correlation between user name and database.

사용자 이름과 데이터베이스간 상관관계를 통해 DB종류를 확인하는 문제

 

 

풀이

상단 그림은 문제 진입 시 초기 페이지 이며 USER 입력란을 통해 내용을 입력하면 하단 그림의 사이트로 접속된다. 입력폼에 내용을 입력하면 하단에 출력되는 식의 게시판이다.

 

개발자 도구(F12) -> Elements 를 통해 javascript의 내용을 확인해보니 admin 값은 입력될 수 없도록 막혀있는걸 확인할 수 있다.

 

SQL Injection을 시도하기 위해서 다양한 구문을 추가하던중 ‘ or 1=1/* 을 입력시 해당 Fatal error 값이 출력됫다. 내용을 한번 분석해보자.

Fatal error: Uncaught exception 'Exception' with message 'Unable to open database: unable to open database file'
in /var/www/html/db_is_really_good/sqlite3.php:7 Stack trace:
#0 /var/www/html/db_is_really_good/sqlite3.php(7): SQLite3->open('./db/wkrm_' or ...')
#1 /var/www/html/db_is_really_good/memo.php(14): MyDB->__construct('./db/wkrm_' or ...')
#2 {main} thrown in /var/www/html/db_is_really_good/sqlite3.php on line 7

데이터 베이스를 열 수 없다는 에러와 그런 이유의 대한 내용이 함깨 확인된다. 내용을 분석시

 1) SQLite3 DB를 사용하며 sqlite3.php 파일을 통해 동작한다.

 2) ‘ or 1=1/* ‘ or …’ 으로 적용.

 3) 7번줄 open() 함수 와 14번줄 __construct() 함수에서 오류가 발생됫다.

 4) {main} 의 내용이 7번줄에 적용된다.

예상대로라면 입력된 값이 {main} 변수로 적용되고 {main} 변수 값의 DB가 생성되며 해당 DB의 내용을 채워넣을 수 있는 페이지로 예상된다.

 

예상대로 /db/wkrm_a.db 를 입력시 wkrm_a.db 파일이 다운로드 됫다 SQLite 을 다운받아서

내용을 확인할 수 있다면 admin.db 또한 다운받아서 내용을 확인해 볼 수 있다.

 

DB Browser for SQLite : http://sqlitebrowser.org/

SQLite DB 뷰어를 통해서 admin.db 를 다운받아서 열어보니 memo column flag의 대한 힌트가 제공된걸 확인할 수 있다. ./dhkdndlswmdzltng.php 또한 경로로 예상되어 http://wargame.kr:8080/db_is_really_good/dhkdndlswmdzltng.php 으로 접속 시도 해본다.

 

FLAG is bd48cb277ae716b38d1261d85151d05ce1f11548

성공적으로 Flag를 찾을 수 있었고 초기 페이지에 값을 제출하면 통과할 수 있다.

 

위 문제는 SQL Injection의 문제로 특수기호를 문자열 그대로 인식하는 함수 또는 일부 예외사항의 대해서는 별도 관리체계가 없어서 발생한 취약점이다, php의 경우에는 mysql_real_escape_string() 함수를 활용할 수 있고 또한 Error 발생 시 Error문을 출력하지 않도록 설정하는것도 큰 도움이 된다.