관리 메뉴

HeeJ's

Webhacking.kr old-18 본문

<CTF>/<Webhacking.kr>

Webhacking.kr old-18

meow00 2020. 10. 12. 17:42

문제 화면이다.

 

SQL Injection을 이용해서 해결하는 문제라는 것을 알 수 있으며, 소스코드를 확인해주었다.

위 문제의 소스코드인데, php부분을 보고 코드를 조금 읽어보았다.

 

if($_GET['no']){
  
$db dbconnect(); //get 방식으로 'no'를 입력받고, 파일과 DB를 연결한다.

 

if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack"); 

//get 방식으로 받은 no를 검사하는데, 위의 문자(공백, /, &, select, from 등)가 포함되어있으면 no hack을 출력하고 종료한다.

 

 $result mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); 

//chall18 테이블에서 id가 guest이고 입력받은 no가 입력받은 id를 result에 저장한다.

 

  if($result['id']=="guest") echo "hi guest";  //id가 guest이면 hi guest 출력
  if(
$result['id']=="admin"){   //id가 admin이면
    
solve(18);   //문제를 해결하는 함수인 것 같다.
    echo 
"hi admin!";  //hi admin을 출력한다.
  }

 

위의 코드의 주석에서 admin no는 2라는 것을 알려준다.

그렇기 때문에 no가 2고 id가 admin인 result를 추출하면 되는 것 같다.

 

하지만 result에서 id가 guest라는 조건이 있기 때문에 연산자 우선 순위를 이용해 줄 것이다.

연산자에서는 and 연산을 한 후 or 연산이 실행되기 때문에

 

TRUE and FALSE or TRUE 는 TRUE를 출력하게 되는 것이다.

TRUE and FALSE or TRUE
= FALSE or TRUE = TRUE

그러므로, where id='guest' and no=0 or no=2 를 입력해주게 되면, (FALSE 구문에 숫자는 아무거나 넣어주어도 된다)

and 조건이 FALSE가 되고, or 뒤가 TRUE가 되니 no=2의 값을 검색해주게 된다.

 

그래서 url 뒤에 ?no=0 or no=2를 입력해주면 문제가 해결되는데,

위의 필터링 구문에서 공백문자 또한 필터링 대상이었기 때문에 공백 대신에 %09를 사용해

?no=0%09or%09no=2를 입력해주면

 

 

문제 해결

'<CTF> > <Webhacking.kr>' 카테고리의 다른 글

Webhacking.kr old-01  (0) 2020.10.30
Webhacking.kr old-27  (0) 2020.10.12
Webhacking.kr old-34  (0) 2020.10.01
Webhacking.kr old-32  (0) 2020.09.25
Webhacking.kr old-26  (0) 2020.09.24