반응형
https://webhacking.kr/challenge/web-36/
Challenge 59
webhacking.kr
[문제]
[풀이]
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
$db = dbconnect();
if($_POST['lid'] && isset($_POST['lphone'])){
$_POST['lid'] = addslashes($_POST['lid']);
$_POST['lphone'] = addslashes($_POST['lphone']);
$result = mysqli_fetch_array(mysqli_query($db,"select id,lv from chall59 where id='{$_POST['lid']}' and phone='{$_POST['lphone']}'"));
if($result['id']){
echo "id : {$result['id']}<br>lv : {$result['lv']}<br><br>";
if($result['lv'] == "admin"){
mysqli_query($db,"delete from chall59");
solve(59);
}
echo "<br><a href=./?view_source=1>view-source</a>";
exit();
}
}
if($_POST['id'] && isset($_POST['phone'])){
$_POST['id'] = addslashes($_POST['id']);
$_POST['phone'] = addslashes($_POST['phone']);
if(strlen($_POST['phone'])>=20) exit("Access Denied");
if(preg_match("/admin/i",$_POST['id'])) exit("Access Denied");
if(preg_match("/admin|0x|#|hex|char|ascii|ord|select/i",$_POST['phone'])) exit("Access Denied");
mysqli_query($db,"insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')");
}
?>
<html><head><title>Challenge 59</title></head><body>
<form method=post>
<table border=1>
<tr><td></td><td>ID</td><td>PHONE</td><td></td></tr>
<tr><td>JOIN</td><td><input name=id></td><td><input name=phone></td><td><input type=submit></td></tr>
<tr><td>LOGIN</td><td><input name=lid></td><td><input name=lphone></td><td><input type=submit></td></tr>
</form>
<br>
<a href=./?view_source=1>view-source</a>
</body></html>
소스코드를 확인해보면
id와 phone으로 sql에 접근해서 select된 결과의 lv이 admin이라면 문제가 풀린다.
Join 부분 sql을 보면
lv값이 default로 guest인 것을 확인할 수 있다.
이 부분을 admin으로 변경하여 insert 시키고
select 시키면 문제가 풀릴 것이다.
일단 Join 부분에는 필터링이 있다.
SQL Injection 공격에 제한이 있다.
insert into chall59 values('test',1,'admin')-- ,'guest')
최종적으로 위같은 SQL이 완성되어야한다.
insert into chall59 values('nimda',1,reverse(id))-- ,'guest')
ID 부분을 admin을 반전시킨 문자열로 삽입해주고
lv부분을 reverse 함수로 반전시켜 admin으로 만들어 SQL을 완성시킨다.
로그인하면 문제가 풀린다.
반응형