없다
문제에 들어가면 위에 query와 sql명령문이 적혀있고 아래 코드가 나와 있다.
./config.php
를 include
하고 login_chk
함수가 실행되고, db
에 dbconnect
함수 return
값이 들어간다.
login_chk
함수는 이름만 봤을 때 아마 해당 사이트에 로그인이 되어 있는지 확인하기 위해 있는 함수 같다.
로그인 체크 후에 dbconnect
함수값이 db
에 들어가는데 아마 db를 연동시키기 위해 있는 함수 같다.
include "./config.php";
login_chk();
$db = dbconnect();
그 다음 get으로 받은 id
, pw
값에 prob
, _
, .
, (
, )
값이 들어가면 No Hack ~_~
이라고 나오면서 exit 명령어가 실행된다. exit가 실행되면 프로그램이 죽어버린다. 즉 이 부분은 입력값 필터링 부분이다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
그 다음 sql query부분이 나오고, echo로 그 query를 출력한다. 그래서 코드 위에 query가 출력된다.
sql query 명령문은 id를 찾는데 prob_gremlin이라는 table에 있어야 하고, id, pw값이 get으로 요청한 id, pw값이어야 한다.
query와 db를 가지고 sql를 실행시킨 다음 result에 레코드(query에 실행된 db정보) 값을 넣는다.
그리고 레코드에 id가 있으면 해당 문제가 풀리고 문제가 하이라이트 표시가 된다.
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");
highlight_file(__FILE__);
db에 값도 모르고, 필터링도 있지만 sql injection을 통해 쉽게 문제를 풀 수 있다.
get으로 id,pw를 요청하고 있기 때문에 url 뒤에 값을 넣어줘야 한다.
id값을 '
로 닫아주고 or 1=1를 하고 -- -
로 주석처리 한다. or는 앞이나 뒤가 true이면 되는데 1=1은 true 이기 때문에 query에서 id를 찾을 수 있게 되면서 문제가 풀리게 된다.
/?id=' or 1=1 -- -
익스플로잇을 넣었을 때 실행될 sql query
select id from prob_gremlin where id='' or 1=1 -- -' and pw=''