프로젝트/Webhacking.kr

[Webhacking.kr] Challenge(old) 59번 문제

Uggjjini 2021. 7. 19. 12:43

문제페이지는 해당 페이지와 같다.

 

 

해당 페이지는 view-source 링크와 join 과 login 창이 존재한다.

 

먼저 소스 페이지를 확인해본다.

 

 

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

 

이 부분은 select 구문을 생성하는 걸로 보아 Login 하는 부분이고 생성된 쿼리문의 결과 값 중 lv 값이 admin 인 경우 해당 문제가 풀린다는 것을 알 수 있다.

 

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

 

이 부분은 insert 구문을 생성하는 것으로 보아 join 하는 부분이다. id 와 phone 값을 입력받아서 insert 하는데 이 때 고정된 값인 guest 도 insert 한다.

 

고정된 값인 guest 가 lv 값인 것으로 추정되고 이 값을 admin 이 되도록 하면 해당 문제가 풀린다.

 

lv 가 admin 이 되도록 join 을 먼저 해야 한다.

lv 값을 admin으로 변경하기 위해서는 순서상 phone 입력 값을 조작하여 가입해야한다.

phone 에 입력값에 admin/0x/#/hex/char/ascii/ord/select 을 필터링 시키기 때문에 다른 방법을 통해 우회해야 한다.

 

문자의 순서를 거꾸러 만들어 반환해주는 REVERSE() 함수를 이용하여 우회해본다.

 

id를 test로 입력하고 1, REVERSE("nimda"))-- 로 입력하여 가입한다. 

그러면 phone 에 입력한 값이 20자가 넘어가 Access Denied 가 뜨면 가입이 실패된다.

 

그래서 id 를 nimda 로 입력하여 id 파라미터 값을 지정해주고 phone 에 nimda 값을 id 로 치환하여 넣어준다.

 

 

그러면 phone 입력값의 글자수도 만족했기 때문에 가입이 완료되고 해당 입력값을 통하여 Login 하면 해당 문제가 풀린다.