[wargame 8๋ฒ ๋ฌธ์ ํ์ด]
๋ฌธ์ ๋ฅผ ํ์ด๋ณด์
md5 password์ ๊ด๋ จ๋ ๋ฌธ์ ์ธ ๋ฏ ํ๋ค.
๋ฌธ์ ๋ฅผ ๋ณด๋, ์ด์ ๋ฌธ์ ์ ์๊ธด ๊ฑด ๋ฑํ ๋ค๋ฅผ๊ฒ ์๋ค.
get source๋ก ์ฝ๋๋ฅผ ์ดํด๋ณด์.
ํต์ฌ ์ฝ๋๋ ๋นจ๊ฐ ๋ค๋ชจ์ธ ๊ฒ ๊ฐ๋ค.
์์์ ์ค์ ์
๋ ฅํ๋ ํจ์ค์๋ ๊ฐ ์ฆ ๋ณ์ $ps๋ mysql_real_escape_string()์ผ๋ก SQL์ธ์ ์
์ ๋ํด ๋ฐฉ์งํ๊ณ ์๋ค.
www.lug.or.kr/files/docs/PHP/function.mysql-real-escape-string.html
๊ฐ๋จํ ๋งํ์๋ฉด ์ ํจ์์ ๊ธฐ๋ฅ์ SQL injection์ ๋ง์์ฃผ๊ธฐ ์ํด ํน์๋ฌธ์ ์์
์ด์ค์ผ์ดํ๋ฅผ ๋ถ์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ด ์๋ ๊ฒ์ด๋ค.
์ด์ค์ผ์ดํ(escape) ๋ฌธ์๋ \(๋ฐฑ์ฌ๋์ฌ)๋ฅผ ์์ ๋ถ์ฌ php์ ์ ์๋์ด ์๋ ์๋์ ์๋ฏธ๋ฅผ ๋ฒ์ด๋๋ ๋ฌธ์๋ค์ ๋งํ๋ค.
ํ์ง๋ง ์ค์ ์ ๊ทธ ๋ถ๋ถ์ด ์๋๋ผ, ์๋ ์ฟผ๋ฆฌ๋ฌธ์ด ๋ค์ด๊ฐ๋ ๊ณผ์ ์ ์๋ค.
์ ์ฝ๋๋ฅผ ํด์ํด๋ณด์๋ฉด, $ps ๋ณ์ ๊ฐ์ md5๋ก ํด์ํ๊ณ , ๊ทธ ๊ฐ์ด admin_password ํ
์ด๋ธ์ ์กด์ฌ ํ๋ค๋ฉด $row๋ณ์์ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ , ์๋ if๋ฌธ์ผ๋ก row๋ณ์์ ๊ฐ์ด ๋ค์ด์๋ค๋ฉด, key ๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ ํํ์ด๋ค.
key๊ฐ์ ์ถ๋ ฅ์ํค๋ ค๋ฉด, DBํ
์ด๋ธ ์์ ์๋ password ์ md5ํด์ ๊ฐ์ ๋ง์ถ์ด์ผ ํ๋ค.
ํ์ง๋ง ์ฐํ ํจ์๋ฅผ ๊ฑธ์ด๋์๊ณ , ์ํธํ ๋์ด์๋ ๊ฒ์ ๋ง์ถ๊ธฐ๋ ๊ฑฐ์ ๋ถ๊ฐ๋ฅ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด password์ ๋ค์ด๊ฐ๋ ๊ฐ์ ์ดํด๋ณด์.
php ํจ์ ์ค ํ๋์ธ md5()๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ์ด ํจ์์๋ ์ ์๋ ค์ง ๋งค์ฐ ์ทจ์ฝ์ ์ด ์๋ค.
๋จผ์ md5()๊ฐ ๋ฌด์จ ํจ์์ธ์ง ์์๋ณด์.
md5ํจ์๋ ์ธ์๋ก ๋ค์ด์จ ๋ฌธ์์ด์ md5 ํด์ํ ํ์ฌ 32byte์ ๊ธธ์ด๋ก ๋ฐํํด์ฃผ๋ ํจ์์ด๋ค.
md5()ํจ์๋ ๋ ๋ฒ์งธ ์ธ์ ๊ฐ์ ์ ํ์ ์ผ๋ก ์ค ์ ์๋๋ฐ, ์ด๋ raw_output์ ํด๋นํ๋ ์ต์
์ด๋ค.
๋ฐ๋ก ์ด raw_output์ ์ํด ์ทจ์ฝ์ ์ด ๋ฐ์ํ๋ค.
raw_output์ต์
์ default(๊ธฐ๋ณธ๊ฐ)์ False์ด๋ฉฐ, ์ด๋ฅผ True๋ก ์ฃผ๊ฒ ๋๋ค๋ฉด 32byte ๊ธธ์ด์ Hex ๊ฐ์ 16 byte์ ๋ฐ์ด๋๋ฆฌ ๊ฐ์ผ๋ก ๋ฐํํด์ค๋ค.
python์ผ๋ก ๊ฐ๋จํ ์์๋ฅผ ์ง ๊ฒ์ ํ์ธํด๋ณด์
์์ ๋ณด๋ค์ถ์ด, password๋ผ๋ ๋ฌธ์์ด์ ๋ฐ์ด๋๋ฆฌ๋ก ์ถ๋ ฅ ํด๋ณธ ๊ฒฐ๊ณผ๋ค.
hashlib ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ md5 ํด์๋ password๋ผ๋ ๋ฌธ์์ด์
Hex๊ฐ๊ณผ, binary ๊ฐ์ผ๋ก ์ถ๋ ฅ ํ ์ฝ๋์ด๋ค.
์ฆ Hex๊ฐ์ raw_output ์ต์
์ False๋ฅผ ๋งํ๋ฉฐ,
binaty์ ๊ฐ์ผ๋ก ์ถ๋ ฅ๋ ์ฝ๋๋ raw_output ์ต์
์ด True์ธ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
์๋๋ ๋๋ค๋ฅธ ์์์ด๋ค.
ํจ์์ ํน์ง์ ์์์ผ๋, ์ฐํ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด์.
md5 ํจ์ ๋ถ๋ถ์ ๋ง์ฝ 'or'์ด ๋ค์ด๊ฐ๊ฒ ํ์ฌ SQL injection์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ ์ฟผ๋ฆฌ๋ฌธ์์ ๋ค๋ชจ์น ๋ถ๋ถ์ 'or'์ด ๋ค์ด๊ฐ๋ค๊ณ ์๊ฐ์ ํด๋ณด๋ฉด
1) "select * from admin_password where password=' ".md5($ps,true)." ' "
2) select * from admin_password where password=' md5($ps,true) '
3) select * from admin_password where password=' 'or' '
4) select * from admin_password where True
์ด๋ ๊ฒ ์์ ๊ฐ์ ๋จ๊ณ๋ก sql ์ฟผ๋ฆฌ๋ฌธ์ด ๋ง๋ค์ด ์ง๋ค ์ฆ password = ' ' or ' ' ์ด๋ฌํ ์ฟผ๋ฆฌ ๋ฌธ์ด ๋ค์ด๊ฐ๊ฒ ๋์ด,
password = ' ' --> False
or
' ' --> True
์ฆ False or True ๋ก ๊ฒฐ๊ณผ๋ True๊ฐ ๋์ด admin_password ํ
์ด๋ธ ๋ด์ ์๋ ๋ชจ๋ ํจ์ค์๋๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
์๋์ ๋ค๋ฅธ ์ฌ๋ก๋ก '=' ์ ์ด์ฉํ์ฌ ์ทจ์ฝ์ ์ ๋ฐ์์ํฌ ์๋ ์๋ค.
(์.. ๋๋ ํ์ด๋์ false injection์ ์ฒ์ ์์๋ค... mysql ์ค๋ฅ์ธ๊ฐ? ์๊ฐํ๋ ๊ฑด๋ฐ.. false.. .. .. ๋ฉ..๋ชจ:)
์ฆ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ์ด๋ค.
1. or๋ก ์ฐธ๊ณผ ๊ฑฐ์ง์ ๋ง๋ค์ด ์ฐธ ๊ฐ์ผ๋ก ๋ง๋ค๊ธฐ.
2. mysql ์ false injection์ ํตํด ์ฐธ ๊ฐ์ผ๋ก ๋ง๋ค๊ธฐ!
์ด๋ ๊ฒ ํ์ด๋ฒ์ ์์๋ด์์ผ๋, ํ์ด์ฌ์ผ๋ก '='๊ฐ์ด ๋ค์ด๊ฐ๋๋ก ์ฝ๋๋ฅผ ์ง๋ณด์.
if ๋ค์ 273d27 --> (ascii code๋ก 27์ ์ฑ๊ธ์ฟผํฐ, 3d๋ = ์ด๋ค. ์ฆ '=' ๋ฅผ ๋ํ๋)
์ฆ 1~111112210 ๊น์ง์ ์ซ์๋ฅผ md5๋ก ํด์ํ ์ํจํ ๋ฌธ์์ด์ทจ๊ธ ํ์ฌ ์ธ์ฝ๋ฉ ํ ๊ฐ์ 16์ง์๋ก ๋ฐ๊พผ ๊ฒ์ด๋ค.
์ฝ๋๋ฅผ ์คํ ์ํค๋ฉด, ์ฌ๋ฌ๊ฐ์ง ๊ฐ๋ค์ด ์ถ๋ ฅ๋๋ค.
๊ฐ๋ค ์ค 1839431์ ์จ๋ณด์ (true์ธ ๊ฐ๋ ์๊ณ , false ๋ ์ถ๋ ฅ๋๋ ๊ฒ์ด ์๋ค!)
Password ์ถ๋ ฅ!!! Clear~~
๋!