반응형

 

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

 


<?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);
  }
?>

 

GET 방식 파라미터 lv에 값이 있으면, 해당 값에 특정 문자가 존재하는지 확인 후 특정 문자가 있으면 "no hack"을 출력하고

 

특정 문자가 없으면 lv 파라미터의 값이 SQL 쿼리문의 where 조건 절에 포함이 되어 lv가 내가 입력한 lv 파라미터의 값인 데이터의 id 컬럼 값을 출력한다.

 

그리고 그 id의 값이 admin이면 풀린다.

 


 

lv 파라미터에 1을 넣어보니 ltusy가 뜬다.

 

 

2를 넣어보니 위와 같이 udnrg가 뜬다.

 

이어서 3을 넣으면 fvvcg, 4를 넣으면 bzrbo가 출력된다.

 


풀이

 

위의 php 코드에서 여러 문자에 대한 필터링 작업을 하고 있는데, or과 and 문자열은 프로그래밍에서 ||와 &&로 표기할 수 있다.

 

그리하여 아래와 같이 입력하면 된다.

 

?lv=0||id=0x61646d696e

 

 

URL에 위와 같이 입력하면 lv=0인 것은 없으므로 아무것도 출력될 데이터가 없지만 뒤에 or을 의미하는 연산자가 붙어 id가 admin인 데이터를 출력하게 된다.

 

필터링에서 싱글 쿼터와 더블 쿼터를 처리하고있으므로 'admin'와 같이 쓰지 못한다.

 

그러므로 16진수 인코딩하여 admin을 61646d696e로 나타낸다.

 

반응형

'전쟁 > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-21  (0) 2022.07.21
[Webhacking.kr] old-46  (0) 2022.07.21
[Webhacking.kr] old-7  (0) 2022.07.19
[Webhacking.kr] old-61  (0) 2022.07.19
[Webhacking.kr] old-59  (0) 2022.07.19

+ Recent posts