1. ๋ฌธ์
https://dreamhack.io/wargame/challenges/46
- ํ๋๊ทธ๊ฐ /var/www/uploads/flag.php์ ์กด์ฌํ๋ค๊ณ ๋ฌธ์ ์ ์ ์๋์ด์๋ค.
- LFI ์ทจ์ฝ์ ์ ์ด์ฉํ๋ผ๊ณ ๋ฌธ์ ์ ๋ช ์๋์ด ์๋ค.
2. ํด๊ฒฐ ๊ณผ์
(1) ๋ฌธ์ ํ์ผ ๋ค์ด๋ก๋
- ๋ค์ด๋ก๋ ํ ์์ถ์ ํ์ด์ฃผ์๋ค. 4๊ฐ์ php ํ์ผ์ ํ์ธํ ์ ์์๋ค.
- ํด๋น ํ์ผ์ vscode๋ฅผ ํตํด ์ด์ด๋ณด์๋ค.
- index.php
<?php
include $_GET['page']?$_GET['page'].'.php':'main.php';
?>
์ ์ฝ๋์์๋ index.php์์๋ GET ๋ฐฉ์์ ํตํด ๋์ด์จ page ๊ฐ์ด ์กด์ฌํ๋ฉด main.php์ page.php ํ์ผ์ ๋ถ๋ฌ์ค๋ ค๊ณ ํ๊ณ ์๋ค. (๋ง์ฝ page ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด main.php๋ฅผ ๋ถ๋ฌ์ค๊ฒ ๋๋ค)
(2) ์ฝ๋ ํ์ธ
- main.php
<h2>Back Office!</h2>
- view.php
- view ํ์ผ์ ๋ณด๋ฉด, GET์ ํตํด ๋ฐ์ fileํ์ผ์ด ์กด์ฌํ๋ฉด, file์ ๊ฐ์ ธ์ค๊ณ ์๋๋ฉด ๊ณต๋ฐฑ์ ๊ฐ์ ธ์จ๋ค.
- preg_match ํจ์๋ฅผ ํตํด file์ flag ๋ฌธ์์ด์ ํํฐ๋งํ์ฌ ์ฐจ๋จํ๊ณ ์๋ค. ๋ฐ๋ผ์ flag๋ฅผ ๋ณด๊ธฐ ์ํด์๋ ํด๋น ํํฐ๋ง์ ์ฐํํด์ผํ๋ค๊ณ ์ถ์ธกํ ์ ์๋ค.
(3) ํ์ด์ง ์ ์
- main.php ์ ์ ํ๋ฉด
- list.php ์ ์ ํ๋ฉด
- flag.php ํด๋ฆญ
- ์ฝ๋์์ ํ์ธํ๋ ๊ฒ๊ณผ ๊ฐ์ด ํํฐ๋ง์ผ๋ก ์ธํด ์ฐจ๋จ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ํํฐ๋ง์ผ๋ก flag๋ฅผ ๊ฑธ๊ณ ์๊ธฐ ๋๋ฌธ์, hello.json์ ํด๋ฆญํ๋ฉด ๋ด์ฉ์ด ์ ๋๋ก ๋ณด์ธ๋ค.
(4) ์ฐํ ์ฒ๋ฆฌ
http://host3.dreamhack.games:18096/?page=view&file=../uploads/flag.php view ํ์ด์ง์์ flag๋ผ๋ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ preg_match ํจ์๋ก ํํฐ๋ง์ด ๋์ด Permission denied ๋ฌธ์์ด์ ์ถ๋ ฅํ๊ณ ์ข ๋ฃ๋๋ฏ๋ก ํ์ธํ ์ ์๋ ๊ฒ์ด๋ผ๊ณ ํ์๋ค.
๋ฐ๋ผ์, ํํฐ๋ง์ ์ฐํํ๊ธฐ ์ํด์๋ file์ ํํฐ๋ง์ด ์กด์ฌํ๋ view ํ์ด์ง๊ฐ ์๋ ๋ค๋ฅธ ํ์ด์ง์์ ๊ฐ์ ธ์์ผ ํ๋ค. index.php๋ฅผ ์ฌ์ฉํด์ ์ฐํํด๋ณด๊ณ ์ ํ๋ค.
f(preg_match('/flag|:/i', $file))
๋ฌธ์ ์์ flag.php์ ์์น๋ฅผ ์๋ ค์ฃผ์๋ค. (/var/www/uploads/flag.php)
๋ฐ๋ผ์ http://host1.dreamhack.games:17985/?page=/var/www/uploads/flag ์ฃผ์๋ก ์ด๋ํ๋ฉด can you see $flag?๋ผ๋ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค.
์ฆ, flag.php์ $flag๋ฅผ ํ์ธํด์ผ ํ๋๊ทธ๋ฅผ ์ป์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์๋ฒ ๋ด์ ์๋ flag.php ํ์ผ์ ์ด๋ป๊ฒ ์ฝ์ ์ ์์๊น?
์์ ๋ฌธ์ ์์ ์ธ๊ธ๋ "LFI vulnerability" ์์ ํํธ๋ฅผ ์ป์ ์ ์๋ค.
[LFI ์ทจ์ฝ์ ]
(5) ์ฐํ ์ฒ๋ฆฌ2
์ฐํ๋ฅผ ์ํด PHP Wrapper๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ LFI ๊ณต๊ฒฉ์ ํ๋ฉด์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ wrapper๋ ์ ํด์ ธ์๋ค.
- expect://
- php://filter/
- zip://
php://filter์ ๊ฒฝ์ฐ, ์๋ฒ์์ ๋ฌธ์๋ค์ ์ด๋ํ ์ ์๊ฒ ํด์ค๋ค. (encode ๋๋ decode์ ํํ๋ก).
www.[์น์ฌ์ดํธ์ฃผ์]/?file=php://filter/convert.base64-encode/resource=ํ์ผ๋ช ์ฒ๋ผ ํ์ฉํ๋ฉด, base64๋ก ์ธ์ฝ๋ฉ๋ ํ์ผ์ ์ป์ ์ ์๋ค.
http://host3.dreamhack.games:19096/index.php?page=php://filter/convert.base64-encode/resource=/var/www/uploads/flag
base64๋ก ์ธ์ฝ๋ฉ๋ flag.php ํ์ธ
PD9waHAKCSRmbGFnID0gJ0RIe2JiOWRiMWYzMDNjYWNmMGYzYzkxZTBhYmNhMTIyMWZmfSc7Cj8+CmNhbiB5b3Ugc2VlICRmbGFnPw==
(6) ๋์ฝ๋ฉ
3. ๋์ ๋ฐฉ๋ฒ
๋ง์ฝ ์ด๊ฒ ์ค์ ์ฌ์ดํธ๋ผ๊ณ ์๊ฐํ๋ค๋ฉด, LFL ๊ณต๊ฒฉ์ ๋ฐ์ ์ค์ ๋ก ์น ์๋ฒ์ ํ์ผ์ด ๋ ธ์ถ๋์ด ๋ฏผ๊ฐ์ ๋ณด ๋ฑ์ด ์ ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค. ๋ฐ๋ผ์ php wrapper๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ํ ์ ์ ํ ๊ฒ์ฆ์ด ํ์ํ ๊ฒ์ด๋ค.
์ฆ, ์ฌ์ฉ์๊ฐ ํ์ผ ์ด๋ฆ์ด๋ ๊ฒฝ๋ก๊ฐ ์ ๋ ฅํ๋ค๋ฉด ์ ์ ํ ๊ฒ์ฆ์ ํตํด ๋ถ์ ์ ํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ฐจ๋จํด์ผ ํ๋ค.