Wargame/Webhacking.kr

webhacking.kr - old 49

G_OM 2024. 3. 29. 13:17

 

 

문제화면이다.

 

소스코드를 확인해 보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

중요한 부분을 따로 봐보자.

 

 

 

 

<?php
  if($_GET['lv']){
    $db = dbconnect();
    if(preg_match("/select|or|and|\(|\)|limit|,|\/|order|cash| |\t|\'|\"/i",$_GET['lv'])) exit("no hack");

 

 

$GET에서 'lv' 값을 확인한다.

 

preg_match 함수로 필터링을 한다.

해당 필터링은

 

select, or, and, limt, order에 대한 SQL 구문 필터링

슬래시 , 공백, 싱글, 더블쿼터, tab 

 

이 막혀있다.

 

 

  $result = mysqli_fetch_array(mysqli_query($db,"select id from chall49 where lv={$_GET['lv']}"));
    echo $result[0] ;
    if($result[0]=="admin") solve(49);
  }

 

 

GET 요청을 통해 lv 받을 값을 할당하여 chall49 테이블에 있는  id 열을 확인한다.

 

 

그럼 필터링을 우회해서 id 가 admin을 불러와야 한다.

코드를 통해서 id라는 이름의 열이 있다는 것을 확인했다.

 

 

 

 

 

 

 

 

 

 

 

 

근데 lv 값이 이미 부여된 lv=1, lv=2, lv=3, lv=4 들은 넘기고

 

 

 

 

 

 

 

 

아무 값이 뜨지 않는 lv=5를 위주로 해보자.

 

일단은 필터링에 'admin'에 싱글쿼터를 사용할 수 없으니 저번문제에서 풀었을 때 사용했었던 16진수로 admin이라는 문자열을 치환하도록 하자.

 

or, and 가 막혔긴 했지만 "||,&&" 특수기호 논리연산자로 바꿔 쓰면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고로 lv=1,2,3,4에서는 and 연산자인 '&' 를 쓰면 문제가 해결된다.