Web Hacking/Webhacking.kr

[Webhacking.kr] old 35

ruming 2021. 9. 26. 21:16

아무 숫자나 입력하고 add를 누르면 Done이라는 문구가 뜬다.

 

소스코드

<?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>

if(preg_match("/\*|\/|=|select|-|#|;/i",$_GET['phone'])) exit("no hack");

*, \, =, select, -, #, ; 등의 문자를 필터링 하고 있다.

 

if(strlen($_GET['id']) > 5) exit("no hack");

$_GET['id']의 길이가 5 미만이어야 한다.

 

if(preg_match("/admin/i",$_GET['id'])) exit("you are not admin");

admin을 필터링하고 있다.

 

쿼리

insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})

id와 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);
  
mysqli_query($db,"delete from chall35");
}

id가 admin이고 현재 ip주소를 넣으면 문제가 풀리는 것 같다.

 

 

여기서 활용할 수 있는 취약점은 insert에서 ,를 사용해 여러 개의 데이터를 넣을 수 있는 점이다.

$_GET['id']에는 admin이 필터링되기 때문에 $_GET['phone']에 넣어준다.

1),('admin','ip주소',2

 

문제를 해결했다!

 

'Web Hacking > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-24 / challenge 24  (0) 2021.10.03
[Webhacking.kr] old-49  (0) 2021.09.26
[Webhacking.kr] old-14  (0) 2021.09.20
[Webhacking.kr] old-10  (0) 2021.09.20
[Webhacking.kr] old-23  (0) 2021.09.20