없다.
문제에 들어가면 admin page가 나오는데 ID, PW를 넣을 수 있는 폼이 나온다.
그리고 소스코드가 주어진다.
php부분을 보면 id와 pw 값을 보내지면 db와 연결한 뒤에 id는 addslashes가 이루어진 뒤에 나오고, pw는 md5가 이루어진 뒤에 나온다.
if($_POST['id'] && $_POST['pw']){
$db = dbconnect();
$input_id = addslashes($_POST['id']);
$input_pw = md5($_POST['pw'],true);
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall51 where id='{$input_id}' and pw='{$input_pw}'"));
if($result['id']) solve(51);
if(!$result['id']) echo "<center><font color=green><h1>Wrong</h1></font></center>";
addslashes
는 문자열 안에 특수문자를 앞에 슬래시()를 추가해주는 함수로 sql injection하기 어렵게 만든다.
md5(value, true)
는 md5로 암호화 시켜주는 건데, 뒤에 true값을 가졌으므로 값이 16진수에서 바이너리로 나온다.
그리고 mysqli_query를 통해 id를 찾으면 문제가 풀린다.
md5에 취약점이 있다. md5에 2번째 인자에 true 값을 가지면 암호화했을 때 16자리 바이너리가 형식으로 반환된다. 그 반환값이 sql injection이 작동하게 만들면 문제를 풀 수가 있다.
원래는 brute force를 이용하여 찾아야 하지만 오래걸리기 때문에 구글링해서 찾았다.
sql-injection-with-raw-md5-hashes 라고 구글에 찾아보면 129581926211651571912466741651878684928
페이로드를 얻을 수 있다.
형태는 1'or'1
이런 형태인데 앞에는 false가 되고, 뒤는 1임으로 true가 되어 sql injection에 성공하게 된다.
앞에는 어쩌피 false가 될 것이기 때문에 id는 아무 값이나 넣고, pw는 페이로드를 넣는다.
그리고 나서 제출 버튼을 누르면 문제가 풀린다.