article thumbnail image
Published 2021. 10. 9. 05:32

level을 입력받는 form이 하나 존재한다.

이전에도 이와 동일한 형태의 문제를 푼 적이 있는데,, 소스코드를 확인해봤다.

 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 49</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
level : <input name=lv value=1><input type=submit>
</form>
<?php
  if($_GET['lv']){
    $db = dbconnect();
    if(preg_match("/select|or|and|\(|\)|limit|,|\/|order|cash| |\t|\'|\"/i",$_GET['lv'])) exit("no hack");
    $result = mysqli_fetch_array(mysqli_query($db,"select id from chall49 where lv={$_GET['lv']}"));
    echo $result[0] ;
    if($result[0]=="admin") solve(49);
  }
?>
<hr><a href=./?view_source=1>view-source</a>
</body>
</html>

 

form으로 받은 값이 lv파라미터에 담기는 것 같고, 필터링되고 있다.

vl파라미터는 select, or, and, \(, \), limit, ,(쉼표), \/, order, cash,  , \t, \', \"가 필터링된다.

lv에 맞는 id를 가져와서 admin이면 문제가 해결되는 구조다.

 

id가 admin을 select할 수 있도록 lv을 조작해야 한다.

\'와 \"을 필터링하고 있으므로 id='admin' 또는 id="admin"를 입력할 수 없다.

 

또한 \(, \)도 필터링 중이므로 char()함수를 사용할 수 없다.

 

따라서 hex값을 사용해서 admin을 표현했다.

admin    →     0x61646d696e

 

or는 필터링 중이므로 ||를 사용해서 Injection할 query를 만들었다.

0||id=0x61646d696e

 

 

old-49 해결!

 

 

 

 

'Study > Web Hacking' 카테고리의 다른 글

[Webhacking.kr] old-34  (0) 2021.11.05
[Webhacking.kr] old-53  (0) 2021.10.09
[Webhacking.kr] old-35  (0) 2021.09.29
[Webhacking.kr] old-11  (0) 2021.09.29
[Webhacking.kr] old-46  (0) 2021.09.25
복사했습니다!