반응형
dmbs335
SQL injection Challenge!
(injection)
- thx to dmbs335
표가 하나 있고, 하단에 검색 도구가 존재한다.
Num | subject | content | writer |
3 | welcome to wargame.kr | =D | guest |
2 | nice challenge! | dummy data | bughela |
1 | hello world! | This is Content1 | dmbs335 |
소스를 보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
<?php
function getOperator(&$operator) {
switch($operator) {
case 'and':
case '&&':
$operator = 'and';
break;
case 'or':
case '||':
$operator = 'or';
break;
default:
$operator = 'or';
break;
}}
if(preg_match('/session/isUD',$_SERVER['QUERY_STRING'])) {
exit('not allowed');
}
parse_str($_SERVER['QUERY_STRING']);
getOperator($operator);
$keyword = addslashes($keyword);
$where_clause = '';
if(!isset($search_cols)) {
$search_cols = 'subject|content';
}
$cols = explode('|',$search_cols);
foreach($cols as $col) {
$col = preg_match('/^(subject|content|writer)$/isDU',$col) ? $col : '';
if($col) {
$query_parts = $col . " like '%" . $keyword . "%'";
}
if($query_parts) {
$where_clause .= $query_parts;
$where_clause .= ' ';
$where_clause .= $operator;
$where_clause .= ' ';
$query_parts = '';
}
}
if(!$where_clause) {
$where_clause = "content like '%{$keyword}%'";
}
if(preg_match('/\s'.$operator.'\s$/isDU',$where_clause)) {
$len = strlen($where_clause) - (strlen($operator) + 2);
$where_clause = substr($where_clause, 0, $len);
}
?>
<?php
$result = mysql_query("select * from board where {$where_clause} order by idx desc");
while ($row = mysql_fetch_assoc($result)) {
echo "<tr>";
echo "<td>{$row['idx']}</td>";
echo "<td>{$row['subject']}</td>";
echo "<td>{$row['content']}</td>";
echo "<td>{$row['writer']}</td>";
echo "</tr>";
}
?>
|
cs |
핵심만 가져왔다.
검색을 하게 되면 ?search_cols=subject&keyword=1234&operator=or 이렇게 get 방식으로 값을 전달한다.
operator의 경우, 22행에 의해 and나 or로만 설정이 된다.
search_cols도 33행 필터링에 의해 subject|content|writer 밖에 못 들어간다.
인젝션을 할 만한 곳을 찾아야 한다.
초기화를 하지 않는 변수가 있다.
query_parts 인데, parse_str함수를 사용하였기 때문에 query_parts에 내가 원하는 값을 넣어버릴 수가 있다.
search_cols에 subject|content|writer 를 제외한 다른 값 (ex: a)를 넣고
operator에는 or 넣어주고
query_parts에 1 union select 1,2,3,4#을 넣는다고 하면,
34~36행을 실행되지 않게 되며, 최종 쿼리가 아래와 같이 된다.
select * from board where 1 union select 1,2,3,4# or order by idx desc
인젝션 성공!
테이블명 쏙 가져오고
Th1s_1s_Flag_tbl |
칼럼명 쏙 가져오고
f1ag
반응형
'WAR GAME > wargame.kr' 카테고리의 다른 글
Wargame.kr [DLL with notepad] 풀이 (0) | 2020.01.08 |
---|---|
Wargame.kr [QnA] 풀이 (0) | 2020.01.06 |
Wargame.kr [Crypto Crackme Basic] 풀이 (0) | 2020.01.06 |
Wargame.kr [crack crack crack it] 풀이 (0) | 2020.01.06 |
Wargame.kr [lonely guys] 풀이 (0) | 2020.01.06 |