문제를 보니, Webhacking.kr에서 풀이하였던 문제와 굉장히 유사하여 쉽게 풀 수 있었다.

 

코드를 분석하자면, 

include "./config.php";
login_chk();
$db = dbconnect();

DB 연결에 필요한 정보와 로그인이 되었는지 확인하는 함수, DB 연결하는 코드이다.

 

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 ~_~");

GET 메소드로 id와 pw를 받고 있다. 또한 입력받은 값은 prob, _, ., ()이라는 문자열이 들어있으면, No Hack ~_~을 출력하고 종료한다.

 

$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");

select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}' 입력 받은 id와 pw의 값을 쿼리문에 넣어지게 된다. 그 후 Mysql에 쿼리문을 적용시켜서 나온 결과값을 비교하는데, 결과의 id가 있다면 문제가 풀리게 된다.

 

'#를 통해 쿼리문을 select id from prob_gremlin where id=''으로 만들어줬다.

그 이유는 id와 pw 두가지 데이터를 동일해야 결과 값이 나오는데, 이러면 찾기 힘들기 때문에 id만 입력하여 찾으려고 한다.

 

DB에 admin이라는 id가 있을거 같아서 admin'#를 하니, 다행히 admin이라는 id가 있어서 결과 값이 result 변수에 저장되어 문제가 풀리게 되었다.

복사했습니다!