sql Injection 문제임을 들어가자 마자 알 수 있다. source code를 살펴보면 다음과 같다.

<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>

 

id 값이 admin이면 풀리는 문제임으로 주석을 이용하여 2를 집어 넣어본다. 

이때 URL은 webhacking.kr/challenge/web-12/index.php?no=2이다.

어디서 잘못 되었을까 하고 살펴 보니 where id='guest' 에서 id가 guest로 고정되어 있음을 알 수 있다.

따라서 쿼리문을 부정해 준 뒤 or을 이용하여 no=2라는 값을 집어 넣어 줘야 한다.

거짓 or 참이되어 결과적으로 참인 no=2값이 들어간다고 보면 된다. 

#, select, (, 공백 문자(띄어쓰기), limit, =, 0x 문자열들이 필터링 되기 때문에 no=(0) or no = 2#와 같이 입력해줄 수 없다. 

=대신에 like, %09(공백) 대신 %09(tab), #(주석) 대신에 --를 사용하면 no(0)%09or%09no%09like%092--%09로 바꾸어 줄 수 있다.

끝 부분에 %09 즉 공백이 한 번 더 들어간 이유는 -- 뒤에 빈칸이 없을 경우 주석처리가 되지 않아 쿼리 오류가 발생하기 때문이다.

이제 빨간  부분을 입력하여 제출해주면 문제가 해결되지 않는다...!!!!!

URL은 다음과 같다. ?no=0%29%2509or%2509no%2509like%25092--%2509 흠... 어딘가 놓친 부분이 있는 것 같다.

바로 URL에 입력해보면...

 

해결!!?

흠... 이 부분에 대해서는 더 고민에 보도록 하자.

 

'Wargame 풀이 > webhacking.kr (웹해킹)' 카테고리의 다른 글

old-12  (0) 2020.11.08
old - 26  (0) 2020.08.17
old - 16  (0) 2020.08.16
old - 6  (0) 2020.08.16
old - 19  (0) 2020.08.14

+ Recent posts