728x90
오늘은 DreamHacker의 웹 해킹 워게임 중 하나인 adm1nkyj를 함께 풀어볼 예정이다.
## 문제 설명:
문제 정보를 살펴보면 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 문을 통해서 출력해낼 수 있다.
이어서 pw값을 출력해보겠다. 우선 Union SQLi 공격을 통해 다음과 같이 컬럼 수과 출력된 컬럼의 위치를 확인한다.
컬럼 수가 5개이며 출력된 위치가 2인 것을 알 수 있다. 이어서 pw의 컬럼명을 출력해보겠다.
이어서 획득한 pw 컬럼명과 소스코드에 나와 있는 테이블이름을 활용하여 pw값을 추출해보겠다.
pw 값까지 성공적으로 추출하였다. 마지막으로 flag값을 추출해야 하는데, flag의 컬럼명을 아직 모른다. 또한 flag의 컬럼이 몇 번째 컬럼에 있는지도 모르니 하나씩 대입해서 해볼 수 밖에 없다.
우선 컬럼명을 모르는 상태에서 서브 쿼리를 통해서 컬럼값을 출력해낼 수 있는데, 테스트해본 결과, flag값이 4번째 컬럼에 존재한다.
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 |