공부/웹해킹 (Web hacking)

[Webhacking.kr | 웹해킹] old-18

eunjuu 2024. 3. 28. 13:15
728x90

📎 https://webhacking.kr/chall.php

 

Webhacking.kr

 

webhacking.kr


문제를 클릭하면 이런 창이 뜬다. SQL Injection 문제인 것 같다.

 

 

 view-source를 클릭해보겠다.

 

 

<?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("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])

 

preg_match (정규표현식, 검색대상)를 통해 공백, /, 괄호, |, &, select, from, 0x 등을 필터링 하는 것을 확인할 수 있다.

 

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

 

SQL 쿼리문을 확인하면, id가 guest로 고정되어 있기 때문에 no에 거짓 값을 넣어주어 이를 상쇄시키고 or로 no=2를 추가 입력하여 admin에 접근할 수 있도록 하면 된다. (주석으로 admin의 no가 2인 것을 알 수 있다.)

 

공백이 필터링 되기 때문에 탭을 url encoding한 값인 %09을 넣어서 $_GET[no]에 들어갈 값을 완성하면 된다.

 

따라서 최종적으로 URL에 입력할 값은 ?no=11%09or%09no=2 이 된다.

 

 

728x90