[wargame 10๋ฒ ๋ฌธ์ ํ์ด]
md5 ๋น๊ต.. ?
๋ญ๊ฐ md5()ํจ์์ ์ทจ์ฝ์ฑ์ ์ด์ฉํ ๋ฌธ์ ๊ฐ..๋ค?
๋จ์ง ๋น๊ต ๋งํ์ญ์์ค.
๋ค๋ฅธ ๊ฐ์ผ๋ก : D
...?
ํ์ด์ง๋ฅผ ๋ค์ด๊ฐ๋ณด๋ ์ ๋ง value 1,2 ์ ๊ฐ์ ๋น๊ตํด์ ํธ๋ ๋ฌธ์ ๋ ๋ง๋ ๊ฒ ๊ฐ๋ค.
์์ค ์ฝ๋๋ฅผ ์ดํด๋ณด์.
์์ค ์ฝ๋์ค ํต์ฌ ์ฝ๋๋ฅผ ํด์ํด๋ณด์
<?php
if (isset($_GET['view-source'])) {
show_source(__FILE__);
exit();
}
if (isset($_GET['v1']) && isset($_GET['v2'])) {
sleep(3); // anti brute force
$chk = true;
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
if (!ctype_alpha($v1)) {$chk = false;}
if (!is_numeric($v2) ) {$chk = false;}
if (md5($v1) != md5($v2)) {$chk = false;}
if ($chk){
include("../lib.php");
echo "Congratulations! FLAG is : ".auth_code("md5_compare");
} else {
echo "Wrong...";
}
}
?>
ํ์ธํด๋ณด๋ v1๊ณผ v2 ๋๋ค ๋ณ์๊ฐ ์๋์ง ํ์ธํด๋ณด๊ณ
๋๋ค ๋ชจ๋ get๋ฐฉ์์ผ๋ก ๋์ด์จ ๋ณ์๊ฐ ์๋ค๋ฉด,
sleep(3)
์ฆ 3์ด๋ค ์๋ ์ฝ๋๋ฅผ ์คํํ๋ค. -> brute force ๊ณต๊ฒฉ ๋ฐฉ์ง์ฉ
chk ๋ณ์์ true;๊ฐ์ ๋ฃ์ด์ฃผ๊ณ v1๊ณผ v2์ ๊ฐ๊ฐ ์
๋ ฅํ ๊ฐ์ ๋ฐ๋๋ค.
chk๊ฐ true์ธ ๊ฒฝ์ฐ flag๊ฐ ์ถ๋ ฅ๋๋๋ฐ,
chk๊ฐ์ด ์กฐ๊ฑด๋ฌธ 3๋ฒ์ ๊ฑธ์ณ false๋ก ์ถ๋ ฅ๋๊ฒ๋ ๋์ด์๋ค.
if (!ctype_alpha($v1))
์ด ์ค์ v1์ ๋ํ ์ ์ฝ์ด๋ค.
์ฆ v1์ ํด๋นํ๋ ๊ฐ์ด ๋ชจ๋ ๋ฌธ์๊ฐ ์๋๋ผ๋ฉด chk ๋ณ์๋ false;
if(! is_numeric($v2))
์ด ์ฝ๋๋ v2์ ๋ํ ์ ์ฝ์ผ๋ก
v2์ ํด๋นํ๋ ๊ฐ์ด ๋ฌธ์์ด ํน์, ์ซ์๊ฐ ์๋๋ผ๋ฉด chk ๋ณ์๋ false
๋ง์ง๋ง ์ ์ฝ์ v1๊ฐ์ md5ํด์ํ ํ ๊ฐ๊ณผ v2๋ฅผ md5ํด์ฌ ํ ๊ฐ์ด ๊ฐ์ง ์์ผ๋ฉด chk ๋ณ์๋ false๊ฐ ๋๋ค.
์ด ๋ฌธ์ ์์ ์ ์ ์์๋ ๊ฒ๋ค
1. is_numeric () ํจ์๋ SQL injection์ ์ทจ์ฝํ๋ค. (๋ฌธ์์ด ์ฝ์
์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ)
2. ํด์ฌ ๊ฐ์ ์ ๋ ๊ฐ์ ์ ์๋ค๊ณ ํ์ง๋ง, ์ฌ์ค ํด์ ์ถฉ๋์ ์ํด ๊ฐ์ ํด์ ๊ฐ์ด ์๊ธธ ์ ์๋ค.
3. loose compare ์ฆ, php์ ๋์จํ ๋น๊ต ๋๋ฌธ์ ์ผ์ด๋๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ์ .
(์ด๋ฌํ '==' ๋์จํ ๋น๊ต๋ ํ์ ๋น๊ต๋ ํ์ง ์๊ธฐ ๋๋ฌธ์ "0"๊ณผ 0 ์ ๊ฐ์ true๋ก ์ค.)
์ด๋ฌํ ํน์ฑ์ ํ ๋๋ก ์ ๊ทผํด๋ณผ ์ ์๋
์ด ๋ฌธ์ ์ ํฌ์ธํธ(Point)๋
๋ฐ๋ก
"md5 ๋งค์ง ํด์ ์ทจ์ฝ์ "์ด๋ค.
MD5 ๋งค์ง ํด์ ์ทจ์ฝ์
๋งค์ง ํด์ :
๋น๊ต ์ฐ์ฐ์ ํ ๋ type Juggling์ ์ด์ฉํ์ฌ ์๋ก ๋ค๋ฅธ ๊ฐ์ด ๊ฐ์ ๊ฐ์ผ๋ก ์ธ์๋๋๋ก ํ๋ ํน์ํ ๋์
//type Juggling : ํ๋ณํ, ์ฆ ๋ณ์๋ฅผ ์ ์ํ์ง ์์๋ ํ์
์ ์๋์ผ๋ก ์ค์ ํด์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฆ :
0e<์ซ์>์ผ ๊ฒฝ์ฐ์๋ PHP์์์ '==' ์ฐ์ฐ์ ๊ธฐํธ๋ก๋ ๊ฐ์ด 0์ด ๋๋ ๊ฒ์ด๋ค.
*ํน์ ์ซ์ ํฌ๋งท
- 16์ง์ : 0xC(10์ง์ ๊ฐ์ผ๋ก 12)
- 8์ง์ : 0o11(10์ง์ ๊ฐ์ผ๋ก 9)
- ์ง์ : 3e2(10์ง์ ๊ฐ์ผ๋ก 3x10^2=300)
md5 ex)
240610708= 0e462097431906509019562988736854
QNKCDZO= 0e830400451993494058024219903391
์ฆ, ์ด ๋๊ฐ์ ๋ฌธ์๋ฅผ ํ์ฉํ๋ฉด, ๋์จํ ๋น๊ต์ฐ์ฐ์ ์ฌ์ฉ ์ ์ธ์ฆ ์ฐํ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
์ถ์ฒ : https://aboutsc.tistory.com/100
์ฆ , 0e๋ก ์์ํ๋ md5 ํด์ ๊ฐ์ ์ฐพ๋๋ค๋ฉด, ์ด ๊ฒ๋ค์ ๋์จํ ๋น๊ต ์ฐ์ฐ์์ ์ํด
"0" == 0 ๊ฒฐ๊ตญ true ๊ฐ์ ๋ฐํํ๊ฒ ๋์ด ์ธ์ฆ ์ฐํ๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ๊ฐ์ ๋ถํฉํ๋ ๋ช๊ฐ์ง md5ํด์ ๊ฐ์ด ์กด์ฌํ๋๋ฐ ์ด๋ฅผ magic hash๋ผ๊ณ ํ๋ค.
humit.tistory.com/170
์ ์ฌ์ดํธ์์ magic hash์ ๋ํด ๋์ฑ ์์ธํ ์ค๋ช
๋์ด ์๋ค.
๊ฒฐ๊ตญ magic hash๋ฅผ ์ด์ฉํ ์ฐํ ๋ฌธ์ ์ธ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๊ณตํต๋๋ ๊ฐ
์ฆ ์ฐํ ๋๋ ๋ ๊ฐ์ ์ฐพ์๋ค๋ฉด ์ด ๊ฐ์ v1, v2์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ ๋ช
ํ magic hash ์๋ก
QNKCDZO == 240610708 ์ด ์์๋ค.
๊ฐ์ ์
๋ ฅ ํ chk ๋ฅผ ๋๋ฅด๋ 3๊ฐ์ง ์กฐ๊ฑด์ ๋ชจ๋ ๋ถํฉํ์ง ์์์ chk = true๊ฐ ๋์๋ค.
flag ๊ฐ์ด ์ถ๋ ฅ๋จ.
--> Clear...
์์ฃผ ๋ฑ์ฅํ์ง๋ ์์ง๋ง ์ข
์ข
๋ณด์ด๋ ๋ฌธ์ ์ด๊ณ ,
์ฝ๊ฐ์ ? ์ ๋ฐํ ์ทจ์ฝ์ ์ด๋ ์์๋๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค ใ
ใ
์ฐธ๊ณ ํ๋ฉด ์ข์ ํ์ด์ง
- magic hash : johyungen.tistory.com/56
- ์ค๋ณต md5 ? -> hacker news : news.ycombinator.com/item?id=9484757
- php ๊ฒฐํจ : medium.com/@mena.meseha/php-functions-security-issues-755ce4c8643c
- php is_numeric() ์ทจ์ฝ์ : beyondsecurity.tistory.com/2
- php ctype_alpha() : www.php.net/manual/en/function.ctype-alpha.php
php is_numeric () : php.kambing.ui.ac.id/manual/en/function.is-numeric.php