Yozzang의 해킹일기 💻
article thumbnail
728x90

오늘은 DreamHacker의 웹 해킹 워게임 중 하나인 adm1nkyj를 함께 풀어볼 예정이다.

 

 

[wargame.kr] adm1nkyj

Description text SQL injection Challenge! (injection) thx to adm1nkyj

dreamhack.io


## 문제 설명:

문제 설명

문제 정보를 살펴보면 SQL Injection 공격을 활용하여 풀면 되는 것으로 보인다.

## 문제 풀이

사이트에 접속해보니 다음과 같은 소스 코드가 보인다.

<?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__);
    }
?>

소스 코드를 분석하자면 다음과 같다.

150번 쿼리를 보내면 flag값이 리셋된다. 즉 Blind SQLi 공격 불가능
information, schema, user가 필터링 처리되어 있다.
id, pw, flags를 알아야 FLAG가 출력된다.

우선 id값부터 추출해보겠다. id값은 다음과 간단한 SQli 문을 통해서 출력해낼 수 있다.

id 값 추출 - adm1ngnngn

이어서 pw값을 출력해보겠다. 우선 Union SQLi 공격을 통해 다음과 같이 컬럼 수과 출력된 컬럼의 위치를 확인한다.

Union SQli

컬럼 수가 5개이며 출력된 위치가 2인 것을 알 수 있다. 이어서 pw의 컬럼명을 출력해보겠다.

pw 컬럼명 추출 - xPw4coaa1sslfe

이어서 획득한 pw 컬럼명과 소스코드에 나와 있는 테이블이름을 활용하여 pw값을 추출해보겠다.

pw 값 추출 -&nbsp;!@SA#$!

pw 값까지 성공적으로 추출하였다. 마지막으로 flag값을 추출해야 하는데, flag의 컬럼명을 아직 모른다. 또한 flag의 컬럼이 몇 번째 컬럼에 있는지도 모르니 하나씩 대입해서 해볼 수 밖에 없다.

 

우선 컬럼명을 모르는 상태에서 서브 쿼리를 통해서 컬럼값을 출력해낼 수 있는데, 테스트해본 결과, flag값이 4번째 컬럼에 존재한다.

flag값 출출 -&nbsp;N4wxpthJf7GmHXQ9oBZTvCdu5e3DnIUVl2biLsKgEYMrO8j0RFWaPSkcAy16zq

flag값까지 추출했으니 마지막으로 최종 FLAG 값을 확인해보겠다.

성공

FLAG가 성공적으로 출력되는 것을 확인할 수 있다.

'Wargame > DreamHack' 카테고리의 다른 글

[DreamHack 워게임] pathtraversal  (0) 2023.03.25
[DreamHack 워게임] Robot Only  (0) 2023.03.24
[DreamHack 워게임] login filtering  (0) 2023.03.09
[DreamHack 워게임] md5 password  (0) 2023.03.08
[DreamHack 워게임] tmitter  (0) 2023.03.07
profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!