WEB Hacking

<WEB Hacking> LFI

지우친구 웅이 2022. 1. 12. 01:47

■ LFI(Local File Inclusion)

LFI 취약점이란 공격 대상 서버에 위치한 파일을 포함시켜 읽어오는 공격이다.

LFI 또는 RFI(Remote File Inclusion) 취약점이 존재하는지 확인하기 위해 주로 파라미터로 ../를 입력해본다.

공격 대상 주소/test.php?parameter=../

 

LFI 취약점은 php 코드상에서 include() 사용 시, 입력 값에 대한 필터링이 이루어지지 않아 발생하는 취약점이다.

만약 LFI 공격이 가능하다면, 파라미터에 파일의 경로를 입력하면 파일이 실행된다.

# example
<?php
    $file = $_GET['file'];
    if(isset($file)){
        include("pages/$file");
    }
    else{
        include("index.php");
    }
?>
# input
/test.php?file=../../../../../../../../etc/passwd

 

■ PHP Wrappers

php://filter

가장 많이 사용되는 방법으로, base64 인코딩을 이용한 방법이다.

?parameter=php://filter/convert.base64-encode/resource={파일 경로}

이를 요청하면, Response Body 안에 base64로 인코딩된 값을 확인할 수 있다.

이 값을 base64 디코딩하면 해당 파일의 코드를 읽을 수 있다.

 

base64로 인코딩하지 않고 사용할 수도 있다.

?parameter=php://filter/resource={파일 경로}

 

Expect Wrapper

시스템 명령의 실행을 허용하지만, expect php 모듈은 기본적으로 비활성화 되어있다.

?parameter=expect://ls

 

Zip Wrapper

업로드된 .zip 파일을 서버 측에서 처리하여 침투 테스터가 취약한 파일 업로드 기능을 사용하여 zip 파일을 업로드하고 LFI 취약점을 통해 zip 필터를 활용할 수 있다.

1. php 리버스 셸을 생성한다.

2. zip 파일로 압축한다.

3. 압축된 셸 페이로드를 서버에 업로드한다.

4. zip wrapper를 사용하여 페이로드를 추출한다.

?parameter=zip://path/to/file.zip%23shell

위는 zip 파일을 셸로 추출한다. 만약 서버가 .php를 추가하지 않으면, shell.php로 변경한다.

※ 파일 업로드 기능이 zip 파일 업로드를 허용하지 않는 경우, 파일 업로드 기능을 우회할 수 있다.

 

/proc/self/environ

LFI 취약점을 통해 /proc/self/environ을 포함할 수 있다면, User-Agent 헤더를 통해 소스 코드를 주입하는 것이 가능하다. 소스 코드가 User-Agent 헤더에 삽입되면, LFI 취약점을 이용하여 /proc/self/environ을 실행하고, 환경 변수를 재로딩하여 역 셸을 실행할 수 있다.

 

Null Byte Technique

Null Byte Injection은 %00과 같은 URL 인코딩된 널 바이트를 추가하여 웹 응용 프로그램 내의 필터링을 우회한다.

?parameter=/etc/passwd%00
?parameter=/etc/passwd%2500

 

Truncation LFI Bypass

Truncation은 블랙리스트 우회 기술이다. 취약한 파일을 포함하는 메커니즘에 긴 매개변수를 주입함으로써, 웹 응용 프로그램은 입력 매개변수를 잘라내 입력 값 필터를 우회할 수 있다.