web_security/web info

RFI(Remote File Inclusion) 란?

HawordFREAKEK 2019. 9. 14. 17:17

네 안녕하세요. Godhaword 입니다.

RFI는 LFI와 상당히 비슷한데 악성 스크립트를 공격자가 만들어서 서버에 전달한다는 점이 좀 다릅니다.

목차는 

1. RFI 란?

2. RFI 가 작동하는 원리

3. RFI 를 하는 방법

4. RFI 예제

5. RFI 를 막는 법


RFI와 LFI가 기본적인 부분은 비슷하기에 여기서 부족한 설명은 LFI 글에서 더 참고 하시면 될 것 같습니다.



1. RFI 란?

Remote File Inclusion, 즉 원격으로 파일을 포함시키는 공격입니다.

Q : 뭔소리냐

A : 공격할 서버에 php 파일을 업로드 할 수 있고, 그 php 파일을 저희가 수정 및 제작해서 올릴 수 있으면 RFI 공격이 가능해진단 겁니다.


공통점이라하면 사이트가 get이나 post 부분에 적절한 보호조치나 php 설정을 따로 해두지 않으면 생기는 취약점이라는 부분입니다.

LFI 와 비교 설명하자면, LFI 는 서버 내부에서 돌아다니는 느낌이고 RFI는 서버 외부에서 공격하는 그런 느낌입니다.. 어... 좀 있다가 4번 예제를 통해 확인해보겠습니다.



2. RFI 가 작동하는 원리


1
2
3
4
5
6
7
8
<?php
 
$language="en";
if ( isset($_GET["lang"]) ){
    $language = $_GET["lang"];
}
include($language."_lang.php");
?>
cs

좀 있다가 예제로 보여드릴 php 문으로 예를 들어 드리겠습니다.
저희가 건드릴 수 있는 부분은 $language 부분입니다. en 이나 fr로 수정할 수 있습니다. 그렇게 들어간 lang 값이 설정된 변수면 그 값으로 이동하고 그 외에는 (입력 값). lang.php 로 이동하게 됩니다. 어떠한 필터링도 저 php 문에서는 확인할 수 없기에 RFI를 시도할 법 해보입니다.

개인적으로 include 부분에 "php" 나 " * . php" 이렇게 달려있으면 RFI를 의심해보고, 그냥 저희가 입력한 페이로드가 실행되면 LFI를 의심해봅니다... 어... 그냥 하나 해보면 다른거 하나 더 해보세요.


3. RFI 를 하는 방법

LFI 를 할 때 저희는 하위디렉토리로 접근하여 원하는 디렉토리에 도달하거나 바로 의심가는 디렉토리로 접근하는 방법을 사용했습니다.

하지만 RFI 는 저희가 원하는 공격 php문을 만들어 해당 서버에 올리는 방식으로 공격이 시작됩니다.

php문을 공부안했더라도, 리눅스 함수를 몇가지만 알면 그나마 RFI 하기 쉬워집니다.

<? php

(실행하고자 하는 코드)

?>

이렇게 적어서 여러가지 방법으로 업로드 하시면  원하는 결과를 얻으실 수 있습니다.


4. RFI 예제

다시 root me로 돌아왔습니다.

문제는 Remote File Inclusion 문제입니다.

들어가자마자 언어를 프랑스어나 영어 둘 중 하나로 택하는 옵션을 보실 수 있습니다.

영어로 고르자 url 창에 ?lang=en 이 추가된 것을 보실 수 있습니다.

문제이름이 RFI 지만 혹시 LFI 가 되지 않을까해서 ../를 입력해 보았으나 오류가 생겼습니다.

RFI를 할 txt 파일을 하나 만듭니다. php 문을 입력하는 방법은 이것 말고도 몇 가지가 더 있습니다.

밑에 추가적인 설명해드리겠습니다.

제가 txt 같은 파일을 url로 업로드 하는 방법은

1. 게시판이나 블로그 같은 곳에 txt파일을 업로드한다.

2. 다운로드 파일 부분을 링크 주소 복사를 한다.

3. 붙혀넣는다.

이런 방식으로 업로드 합니다. 

업로드를 하니 error 코드는 보이지 않고... flag도 보이지 않고 메인페이지가 약간 이상해져있는 것을 보실 수 있습니다.

따란~

개발자도구창을 보시면 flag와 해당 페이지의 php 구조를 보실 수 있게 됩니다.

root me 문제들이 flag를 개발자 도구창에 많이 숨겨두더라고요.. 참고 합시다.


2. base64 인코딩

Q : 나는 블로그 안하는데 그러면 문제 못 푸는거냐. 그렇다고 게시글에 저런거 남겨두면 민폐 아니냐.

A : ㅎㅎ 저희에겐 아직 php wrapper 라는 공격방법이 남았습니다.

php wrapper 를 사용하면 해당 사이트의 php문을 base64로 인코딩된 상태로 볼 수 있게 됩니다.


php://filter/convert.base64-encode/resource=

data://text/plain base64

php:// 는 resource = test 로 들어가면 test 창에 php문을 확인할 수 있게 도와주고

data://text/plane base64는 그냥 파일을 업로드 하는 느낌으로 사용됩니다.

이 구문만 알아두시면 자주 사용하실수 있습니다.

일단 주입하려는 php문을 base64로 인코딩합니다.

그 base64 문을 data://text/plain;base64, 뒤에 적용하면 문제가 풀립니다.


3. php://filter/conver.base64-encode/resourse=


어.. 음...별다른 필터링이 없으면 이 방법보단 처음에 썼던 방법이 더 간단합니다.

위와 같은 방법은 제 블로그에 있던 php문이 들어있는 txt파일을 읽어 lang에다가 저장하여 txt 파일로 php문을 여는 방식입니다.


혹시 위와 같은 방법이 안먹힌다면 뒤에 ?나 %00 같은 기호를 추가하여 다시 공격해보시기 바랍니다.


(혹시 whoami 같은 간단한 명령문 작동되나 실험해 봤는데 안되더라고요. 인덱스만 접근 가능한가봅니다.)


5. RFI 예방 방법

LFI 예방 방법과 같기에 이하 생략합니다.










'web_security > web info' 카테고리의 다른 글

[WebHacking] XSS (Cross Site Scripting) 란?(New)  (2) 2022.05.29
XSS (Cross Site Scripting) 란?  (0) 2019.09.27
파일 업로드(File-Upload) 취약점이란?  (0) 2019.09.21
LFI(Local File Inclusion)란?  (3) 2019.09.13
SSTI란?  (0) 2019.09.04