저장소

[webhacking.kr] 35번 풀이 본문

IT/웹 해킹

[webhacking.kr] 35번 풀이

huiu 2021. 8. 20. 13:30

https://webhacking.kr/

 

Webhacking.kr

Index Welcome Stranger! Chatting Notice(en) [2021-04-16] Score of old challenges has been adjusted to 1/10. For a while now, new challenges will be added "without" notice. [2020-08-12] Replace chat feature with Discord. Please do not cause inconvenience to

webhacking.kr

35번 문제를 선택하면 나오는 화면이다.

아무런 번호나 입력하면 Done 메시지가 출력된다.

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>

문제 풀이의 핵심이 되는 부분이 어디인지 확인했다.

$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");
}

해당 부분이 35번을 푸는 조건이 쓰여있다.

id는 admin, ip의 자리에는 나의 아이피를 전달하도록 하고 있었다.

if($_GET['phone'] && $_GET['id']){
  if(preg_match("/\*|\/|=|select|-|#|;/i",$_GET['phone'])) exit("no hack"); /* *, /, select, -, # 필터링 */
  if(strlen($_GET['id']) > 5) exit("no hack"); /* 5글자 초과 제한 */
  if(preg_match("/admin/i",$_GET['id'])) exit("you are not admin"); /* admin을 필터링 */
  mysqli_query($db,"insert into chall35(id,ip,phone) values('{$_GET['id']}','{$_SERVER['REMOTE_ADDR']}',{$_GET['phone']})") or die("query error");
  /* id, ip, phone 순서로 insert */
  echo "Done<br>";
}

다만 admin이 필터링 조건에 존재하므로 주의해야한다.

일반적인 방법으로는 admin을 전달할 수 없다.

 

이럴 때 insert문을 활용하는 방법이 있다.

한번에 여러 개의 값을 전달할 수 있다.

 

입력 시 한 번에 입력 값을 여러 개 전달하도록

1), ('admin', '나의 ip주소', '1'

와 같이 입력해주면 문제가 풀린다. (id, ip, phone)의 순서를 고려해줘야 한다.

이때 각 1의 자리에는 임의의 숫자 아무거나 가능하고, 마지막 부분에는 소스에 괄호( ) )와 따옴표( " )가 있으므로 입력하지 않는다.

URL로 인코딩 되었을 때 위와 같다.

문제 풀이에 성공했다.

'IT > 웹 해킹' 카테고리의 다른 글

[webhacking.kr] 12번 풀이  (0) 2021.08.23
[webhacking.kr] 39번 풀이  (0) 2021.08.23
[webhacking.kr] 3번 풀이  (0) 2021.08.20
[webhacking.kr] 54번 풀이  (0) 2021.08.13
[webhacking.kr] 34번 풀이  (0) 2021.08.12
Comments