Skip to main content

LFI / RFI 취약점 시연


설명

php와 apache2를 사용하여 LFI / RFI 취약점을 시연한다.


LFI = Local File Inclusion

RFI = Remote File Inclusion


LFI 시연 환경

Ubuntu - 24.04.3

phpPHP - 8.3.6 +

Apache/

Apache - 2.4.58

IP - 172.30.1.68 [웹 서버]

LFI 취약한 코드

진입할 파일 명 - lfiPhp.php

<?php
// RFI 취약점이 있는 코드 (교육용)
if (isset($_GET['page'])) {
    $file = $_GET['page'];
    // 사용자 입력을 검증하지 않고 바로 include
    include($file);
} else {
    echo "페이지가 지정되지 않았습니다.";
}
?>

첨부할 파일 명 - test.php

* 파일이 실행될 경우 소스코드가 그대로 드러나는 것이 아닌 "php run test 7" 이라는 값만 출력될 것

<?php
$number1 = 3;
$number2 = 4;
$sum = $number1 + $number2;
echo "php run test $sum";
?>

LFI 취약점 시연

1. 위의 취약점 파일 코드를 작성 후 진입

* 참조된 파일이 없으므로 페이지가 지정되지 않았다고 출력

image.png

2. page 파라미터를 통해 test.php 파일을 요청에 포함해 전송할 경우 php 코드가 실행되어 출력됨을 확인

image.png

3. /etc/passwd 파일또한 출력이 가능 (로컬에 있는 파일들을 포함하여 php 코드가 실행)

image.png

4. 권한에 없는 파일의 경우 그냥 공백 출력 (/etc/shadow)

image.png



기본LFI 시연 환경

Ubuntu - 24.04.3

PHP - 8.3.6

Apache - 2.4.58

IP - 172.30.1.68 [웹 서버]

IP - 172.30.1.14 [공격자]


조치php 방법설정을 한가지 바꿔주어야 한다.

LFI 를 시연할 때 php.ini 파일의 allow_url_fopen 설정은 기본적으로 활성화가 되어있지만


RFI를 시연하기 위해서는 allow_url_include 부분을 Off 에서 On 으로 바꿔줘야한다.

image.png

* 처음엔 /etc/php/8.3/cli/php.ini 파일을 수정했는데 제대로 시연이 안되었었다.

** apache2를 통해 웹 서버를 띄워서 /etc/php/8.3/apache2/php.ini 경로의 php.ini 파일을 수정해줬더니 시연이 정상적으로 이뤄졌다.

RFI 취약한 코드

진입용 페이지 코드 [웹 서버에 생성]

파일 경로 : http://172.30.1.68/rfiPhp.php?page=

<?php
// RFI 취약점이 있는 코드 (교육용)
if (isset($_GET['page'])) {
    $file = $_GET['page'];
    // 사용자 입력을 검증하지 않고 바로 include
    include($file);
} else {
    echo "페이지가 지정되지 않았습니다.";
}
?>


삽입용 페이지 코드 [공격자 PC에 생성]

파일 경로 : http://172.30.1.14:8080/html/RFI.php

<?php
echo "hello world";
?>


RFI 취약점 시연

*이전과 다르게 Local 상이 아닌 외부의 파일을 삽입하여 실행하도록 설정해볼 것이다.

01. LFI와 동일하게 별도 파일을 삽입하지 않을경우 출력되는 페이지

image.png

02. 외부 파일의 경로를 피해자의 파라미터에 첨부하여 전송

image.png

*php 파일이 실행되어 hello world가 출력됨음 확인