Web/Theory

LFI(Local File Include) Vuln

Alioth02 2024. 7. 26. 17:30

include 란?

다른 파일의 내용을 현재 파일에 "포함" 시키는 것!!

// dbconn.php
<?php
	DB 연결 정보
?>
// login.php
<?php
	include('dbconn');
	로그인 검증하는 코드
?>
// login.php
<?php
	DB 연결 정보
	로그인 검증하는 코드
?>

LFI(Local File Include) 취약점?

동적 페이지에서 다른 동적 페이지의 소스코드를 include 하는 기능이 있을 때,

해당 기능을 악용해서 임의의 소스코드를 Include 하도록 유도하는 공격이 가능함.

  • 서버에 존재하는 임의의 파일을 가져올 수 있다.
  • 소스코드는 가져올 수 없다. (★동적 코드는 실행돼서 출력되기 때문!!!★)

취약점 시연

인사말 : LFI 취약점 존재

게시판 : 파일 업로드 기능 존재

인사말 서비스에 접속해보면,

언어 선택 시, 해당 언어로된 문자열이 lang 파라미터의 php 파일(ko.php)을 통해 출력되고 있다.

여기서 주목할 포인트는 greet.php(동적) 페이지의 파라미터로 php(동적) 파일이 담긴다(include된다)는 것이다.

Path Traversal 를 이용해 /etc/passwd 파일에 접근할 수 있었다.

* LFI 포인트 확인 // Local File 가져오기 가능 & 소스코드 가져오기 불가능(= 소스코드 실행된 결과 값 출력 가능)

이후 게시글에 웹 쉘 코드가 작성된 jpg 파일을 업로드 한 뒤,

http://ctf.segfaulthub.com:9023/webshell_3/files/alioth/webshell.jpg

업로드된 경로를 확인한다.

.jpg 확장자로 php 코드가 실행되지 않는 웹 쉘이지만,

LFI 취약점이 있는 greet.php 페이지에 파라미터로 접근하면,

.jpg 파일 안에 있는 php 코드가 include되면서 동작하게 되고, 결과가 출력되는 것을 확인할 수 있다.


LFI 취약점만으로 web shell 실행하기

step 1) LFI 취약점 장소 찾기

 

step 2) access.log 기록되는 경로 찾기

../../../../../../var/log/apache2/access.log

access.log 기록되는 장소를 찾았다고 가정한다.

 

step 3) access 로그에 기록되도록, 요청 파일 경로에 php 코드를 작성한다.

 

step 4) cmd 파라미터와 함께 access.log 파일을 요청한다.

access.log 파일이 include 되면서 

step 3) 에서 요청했던 파일 경로(php 코드)가 실행된 모습을 볼 수 있다.

(+ 리버스 쉘 연결하기)

더보기
// apache 동작
systemctl start apache2
systemctl enable apache2

// mysql 동작
systemctl start mysql
systemctl enable mysql

// mysql 설정
mysql -u root -p
> create database dvwa;
> create user dvwa@localhost identified by 'p@ssw0rd';
> grant all on dvwa.* to dvwa@localhost;
> flush privileges;

// DVWA 다운
cd /var/www/html
git clone https://github.com/digininja/DVWA.git

// config 파일 설정
cd /var/www/html/DVWA/config
cp config.inc.php.dist config.inc.php

// php.ini 경로 확인
<?php phpinfo(); ?>

// gedit php.ini
allow_url_include=on 설정

// DVWA 권환 환경 세팅
chmod 777 /var/www/html/dvwa/hackable/uploads/
chmod 777 /var/www/html/dvwa/config

// access.log 파일 권한 설정
chmod 644 /var/log/apache2/access.log

// 서버 500 에러 시, access.log 파일 초기화
truncate -s /var/log/apache2/access.log