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 |