Web Hacking/Webhacking.kr

Webhacking.kr old-59번 풀이

프레딕 2023. 11. 26. 02:39
728x90

<?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"); #대소문자 구분 x
    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')");
  }
?>'a',
<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>

 

소스 코드를 보면 대부분 다 필터링 기능이 있다는걸 알 수 있다.

addslashes 함수는 작은따옴표, 큰따옴표, 백슬래쉬 등의 기호들이 있으면 앞에 \(백슬래쉬)를 붙여 기호가 아닌 문자로 만드는 역할을 한다.

addslashes함수 우회법이 있기는 한데 이건 utf-8인코딩을 할때만 가능한 얘기니 여기서는 우회가 불가하다.

 

일단, lv에 admin이 오기 위해서 JOIN기능을 이용해 lv이 admin인 계정을 만들어야 한다.

이때, admin과 char, hex 등 모두 필터링이 되어있으니 reverse()함수 기능을 사용하겠다.

그리고 phone의 길이가 20이 넘으면 안되기에 다음과 같이 입력하겠다.

id에 nimda, phone에 22,reverse(id));--   이렇게 입력하면 phone에 22가 들어가고 id를 reverse한 값인 admin이 lv에 들어가게 된다. 

id에  nimda, phone에 22를 입력해서 로그인하면 flag를 얻을 수 있다.

 

728x90
반응형