반응형
https://webhacking.kr/challenge/web-17/
Challenge 35
webhacking.kr
[문제]
[풀이]
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 35</title>
<head>
<body>
<form method=get action=index.php>
phone : <input name=phone size=11 style=width:200px>
<input name=id type=hidden value=guest>
<input type=submit value='add'>
</form>
<?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");
}
$phone_list = mysqli_query($db,"select * from chall35 where ip='{$_SERVER['REMOTE_ADDR']}'");
echo "<!--\n";
while($r = mysqli_fetch_array($phone_list)){
echo htmlentities($r['id'])." - ".$r['phone']."\n";
}
echo "-->\n";
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>
소스 코드를 확인하면
첫번째로
phone, id 변수를 받아서
db에 추가한다.
두번째로
만약 db에 id가 admin이고 ip주소가 나의 pc아이피 주소와 같은 데이터가 있다면 문제가 풀린다.
세번째로
나의 pc아이피로 된 데이터를 주석으로 출력한다.
id에 입력되는 값중 admin은 필터링 되어있다.
아무 값을 입력했다.
add 버튼을 누르니 주석으로 입력한 번호와 id가 나온다. id는 add 버튼을 누를때 자동으로 guest로 입력된다.
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>";
}
insert 부분에서 취약점을 찾았다.
webhacking.kr에서 비슷한 문제를 출제한 적 있다. old-08문제이다.
문제 푸는 방식이 비슷하기에 참고하며 풀면 쉽게 풀 수 있을 것이다.
일단 insert문은 insert into values('','',''),('','','') 형식으로 insert를 2번 처리가 가능하다.
insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})
이 코드에서 phone 변수값을 수정하여 공격을 시도한다.
phone 입력칸에 입력해도 되지만 나는 burp suite를 사용했다.
1),('admin','내 아이피',1
#자신의 아이피는 인터넷에 my ip, 내아이피 등등 검색하면 나옵니다.
위처럼 적어주면
insert into chall35(id,ip,phone) values('guest','내 아이피',1),('admin','내 아이피',1)
쿼리가 완성된다.
그렇다면 id가 admin인 데이터가 추가되게 되고
문제가 풀린다.
반응형