Web Hacking/DreamHack

[DreamHack] [wargame.kr] adm1nkyj

프레딕 2024. 7. 24. 19:02
728x90
<?php
    error_reporting(0);
    
    include("./config.php"); // hidden column name, $FLAG.

    mysql_connect("localhost","adm1nkyj","adm1nkyj_pz");
    mysql_select_db("adm1nkyj");

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

    function rand_string()
    {
        $string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz";
        return str_shuffle($string);
    }

    function reset_flag($count_column, $flag_column)
    {
        $flag = rand_string();
        $query = mysql_fetch_array(mysql_query("SELECT $count_column, $flag_column FROM findflag_2"));
        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'];
    if(isset($id))
    {
        if(preg_match("/information|schema|user/i", $id) || substr_count($id,"(") > 1) exit("no hack");
        if(preg_match("/information|schema|user/i", $pw) || substr_count($pw,"(") > 1) 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}';"));
        if($query[$id_column])
        {
            if(isset($pw) && isset($flags) && $pw === $tmp_pw && $flags === $tmp_flag)
            {
                echo "good job!!<br />FLAG : <b>".$FLAG."</b><hr>";
            }
            else
            {
                echo "Hello ".$query[$id_column]."<hr>";
            }
        }
    } else {
        highlight_file(__FILE__);
    }
?>

SQL Injection 문제이다.

언뜻보면 간단해보이지만 column name도 모르고 information_schema도 막혀있어 살짝 어려다.

패스워드와 flag를 맞추면 되는데 컬럼명을 몰라서 blind sqli도 못한다.

그래서 구글링을 하던 중 여러 쓸만한 문서를 보았고 그 중 한곳이 여기다.

https://blog.redforce.io/sqli-extracting-data-without-knowing-columns-names/

 

[SQLi] Extracting data without knowing columns names

Extracting data without knowing columns names from MYSQL < 5 or in case of WAF blacklisting sending information_schema in the request

blog.redforce.io

column 명을 몰라도 union을 사용해서 colum 명을 지정하여 뽑아올 수 있다. 

예를 들어 아래와 같다.

select * from students '' union select 1,`4`,1,1,1 from (select 1,2,3,4,5 union select * from students)a

요건 아래 ide 사이트에서 실험했다.

https://www.mycompiler.io/ko/new/sql

 

새 SQL 프로그램 만들기 - 마이컴파일러 - myCompiler

실행 코드 코드 저장 기존 코드를 유지하시겠습니까? 에디터에 코드가 있는 동안 언어를 전환하려고 합니다. 이를 유지하려면 “기존 코드 유지”를 선택합니다. 예제로 바꾸려면 “예제로 바

www.mycompiler.io

근데 요 ide만 그런건지 from 절에 사용한 (select 1,2,3,4,5 union select * from students)a 이 구문에서 괄호 뒤에 alias를 안지정해도 작동해서 지정 안하고 사용했는데 문제에선 작동을 안해서 애좀 먹었다.

위 구문은 (select 1,2,3,4,5 union select * from students) 이 구문을 a라는 이름의 alias로 지정했다.

그다음 `4`을 사용해 4라는 컬럼의 내용을 뽑아왔다.  즉, students 테이블의 4번째 컬럼에 접근 가능하다는 것이다.

그리고 봐야할건 결과값이 4나오고 그다음에 쓸만한 값들이 나오는데 이건 limit절을 사용해 하나씩 빼오면 된다.

그래서 최종 페이로드는 아래와 같다.

id=' union select 1,`4`,1,1,1 from (select 1,2,3,4,5 union select * from findflag_2)a limit 1,1--%09

이 문제는 두번째 컬럼값이 id라는건 바로 찾을 수 있을거고

그다음 limit절로 하나씩 1~5번째 컬럼들을 뽑아오면 flag값과 pw값같이 생긴게 나올것이다.

이게 정답이다.

728x90
반응형