LFI(Local File Inclusion) ์ทจ์ฝ์ ์ด๋?
LFI๋ ๊ณต๊ฒฉ์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํด ์๋ฒ์ ํ์ผ์ ๋ถ๋ฌ์ค๊ฑฐ๋ ์คํํ ์ ์๊ฒ ํ๋ ๋ณด์ ์ทจ์ฝ์ ์ด๋ค.
์ด ์ทจ์ฝ์ ์ PHP์ ๊ฐ์ ์๋ฒ ์ธก ์คํฌ๋ฆฝํธ ์ธ์ด์์ ๋ฐ๊ฒฌ๋๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ ฅ ๊ฒ์ฆ ๋ถ์กฑ์ผ๋ก ์ธํด ๋ฐ์ํ๋ค.
์ฃผ๋ก php ์ฝ๋์์์ include() ์ฌ์ฉ ์ input์ ๋ํ ์ ์ ํ ํํฐ๋ง์ด ์ด๋ฃจ์ด์ง์ง ์์ ๋ฐ์ํ๋ค.
๊ณต๊ฒฉ์๋ ์ด ์ทจ์ฝ์ ์ ์ ์ฉํ์ฌ ์น ์๋ฒ์์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ฝ๊ฑฐ๋, ๋ก์ปฌ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ๋ณด์์ ์ฐํํ๊ณ ์์คํ ์ ์์์ํฌ ์ ์๋ค.
include($_GET['file'] . '.php');
์ ์ฝ๋๋ ์ฌ์ฉ์ ์ ๋ ฅ($_GET['file'])์ ๊ฒ์ฆํ์ง ์๊ณ ํ์ผ์ includeํ๋ค.
์ด๋, ๊ณต๊ฒฉ์๊ฐ URL์ ์กฐ์ํ์ฌ http://example.com/index.php?file=../../../../etc/passwd ์ ๊ฐ์ด ์ ๋ ฅํ๋ฉด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ /etc/passwd ํ์ผ์ ๋ด์ฉ์ ํฌํจํ๊ฒ ๋์ด ์์คํ ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ ธ์ถ์ํฌ ์ ์๋ค.
LFI ๊ณต๊ฒฉ
๋ค์ํ php wrapper์ ํ์ฉํด LFI ๊ณต๊ฒฉ์ ํ ์ ์๋ค.
https://www.php.net/manual/en/wrappers.php
- file:// — Accessing local filesystem
- http:// — Accessing HTTP(s) URLs
- ftp:// — Accessing FTP(s) URLs
- php:// — Accessing various I/O streams
- zlib:// — Compression Streams
- data:// — Data (RFC 2397)
- glob:// — Find pathnames matching pattern
- phar:// — PHP Archive
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — Audio streams
- expect:// — Process Interaction Streams
์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ LFI ๊ณต๊ฒฉ์ ํ๋ฉด์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ wrapper๋ ์ ํด์ ธ์๋ค.
- expect://
- php://filter/
- zip://
expect:// wrapper๋ system command๋ฅผ ์คํ์์ผ์ค๋ค.
์ฆ, expect://ls ๋ฅผ ํ๊ฒ ๋๋ฉด, ls ๋ช ๋ น์ด๊ฐ ์คํ๋๋ฉด์ ๋๋ ํ ๋ฆฌ ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
php://filter์ ๊ฒฝ์ฐ, ์๋ฒ์์ ํ์ผ๋ค์ ์ด๋ํ ์ ์๊ฒ ํด์ค๋ค (encode ๋๋ decode์ ํํ).
์ฆ, www.[์น์ฌ์ดํธ์ฃผ์]/?file=php://filter/convert.base64-encode/resource=ํ์ผ๋ช ์ ํ์ฉํ๋ฉด, base64๋ก ์ธ์ฝ๋ฉ๋ ํ์ผ์ ์ป์ ์ ์๋ค.
zip:// ์ ๊ฒฝ์ฐ, zip ํ์ผ์ ์์ถ์ ํ๊ณ , ์์ถ์ ํผ ํ์ผ์์ ์๋ ์ฝ๋๋ฅผ ์คํ์์ผ์ค๋ค.