프로젝트/Webhacking.kr

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

Uggjjini 2021. 7. 6. 17:06

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

 

 

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

 

해당 문제는 SQL injection 공격을 이용하여 해결할 수 있을 것 같다.

 

입력창에 아무것도 입력하지 않고 제출 버튼을 누르면 URL 바뀌는 것을 볼 수 있다.

 

 

입력창에 입력한 정보가 index.php 파일의 no 파라미터 값에 저장된다는 것을 알 수 있다.

 

view-source 링크를 통하여 소스 코드를 확인한다.

 

 

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

 

<?php
if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
  $result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2

  if($result['id']=="guest") echo "hi guest";
  if($result['id']=="admin"){
    solve(18);
    echo "hi admin!";
  }
}
?>

 

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

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

 

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

 

admin의  no 파라미터의 값이 2라는 것을 주석을 통해 알려주고 있다.

 

최종 $result 변수의 값의 id 가 "guest"인 경우 "hi guest" 를 출력하고

최종 $result 변수의 값의 id 가 "admin"인 경우 해당 문제가 풀리고 "hi admin!" 이 출력된다.

 

 

mysqli_query() 함수에 의해 생성되는 SQL 쿼리문을 자세히 본다.

 

select id from chall18 where id='guest' and no=$_GET[no]

 

chall18 테이블에서 id는 'guest'이고 no 파라미터를 Get 방식으로 받아온 값인 부분의 데이터를  select 구문을 통해 가져오는 것을 확인 확인 할 수 있다.

 

고정되있는 id 값인 'guest'는 검색되지 않아야 하며,  admin의 no 파라미터 값인 2를 이용하여 admin의 id 의 정보를 검색해야 한다.

 

그래서 Get 방식의 no 파라미터 값을 조작하여 하단의 SQL 쿼리문이 되도록 만들어야 한다.

 

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

 

where id = 'guest' and no= -1			// (거짓)

or 

no=2						// (참)

 

no 파라미터 값을 조작하기 위해 입력창에 -1 or no=2 를 입력해서 no 파라미터 값이 2인 데이터만 불러들인다.

 

그런데 preg_match() 함수에 의해 |\/|\(|\)|\||&|select|from|0x/i 정규 표현식이 포함되면 "no hack" 라는 문구와 함께 종료된다.

 

(공백) \/ \( \) \| & select from 0x /i
공백 기호 / 기호 ( 기호 ) 기호 | & select from 0x 대소문자 구분 X

 

입력창에 -1 or no=2 를 입력하면 공백이 포함되었기 때문에 "no hack" 문구가 뜨는 것이 확인된다.

 

 

 

공백을 우회하기 위해 공백 대신 tab을 사용한다.

 

tab은 입력창에서 사용할 수 없으므로 URL에서  index.php 의 no 파라미터 값을 직접 바꾸어준다.

 

단, tab은 URL 인코딩한 값인 %09로 입력한다.

 

 

해당 URL로 이동하면 문제가 해결되는 것을 확인할 수 있다.