文件包含常见绕过方法
文件包含原理
開發人員將相同函數寫入單獨的文件中,需要使用某個函數直接調用此文件,無需再次編寫,這種文件調用過程稱為文件包含
文件包含漏洞
開發人員為了使代碼更靈活,會將被包含的文件設置為變量,用來動態調用,從而導致客戶端可以惡意調用一個惡意文件,造成文件包含漏洞
相關函數
- include: 包含并運行指定文件,當包含外部文件發生錯誤時,系統給出警告,但整個php文件繼續執行
- include_once: 這個函數跟和include語句類似,唯一區別是如果該文件中已經被包含過,則不會再次包含
- require: 跟include唯一不同的是,當產生錯誤時候,整個php文件停止運行
- require_once: require_once語句和require 語句完全相同,唯一區別是PHP會檢查該文件是否已經被包含過,如果是則不會再次包含
注:這四個函數不管執行哪個后綴的文件,都將他當作php文件執行
分類
注:
1、本實驗127.0.0.1為windows系統,192.168.100.134為linux系統
2、注意每個實驗中php的適用版本與php.ini等相關配置
一、本地文件夾包含
1、linux目錄遍歷
(1)test.php測試代碼:
(2)進行目錄遍歷
2、windows目錄遍歷
(1)測試代碼:
<?php$filename = $_GET['file'];include($filename); ?>(2)進行目錄遍歷
3、session文件包含漏洞
(1)利用條件:
- 知道session的存儲位置
- 有可控的值傳入session中
- 存在本地文件包含漏洞
(2)原理
① 通過phpinfo可獲取到session的存儲位置或已知session的存儲位置
例:
② session中的內容可控,可以傳入惡意代碼
例:一個可傳惡意代碼到session中的php代碼
此時php會將獲取到的GET型sess變量的值存入到session中
當訪問http://www.ctfs-wiki/session.php?sess=hello后,會在/var/lib/php/session目錄下存儲session的值
如下圖:
注:②中的第一幅圖中的PHPSESSID值可以關注下,因為默認傳入session目錄中的文件是sess_后面加上PHPSESSID
③ 因此我們可以傳入惡意代碼,然后配合文件包含漏洞getshell
例:
傳入惡意代碼
配合文件包含getshell
4、截斷
(1)%00截斷
① 條件:magic_quotes_gpc = Off php版本<5.3.4
② 測試代碼:
③ 對比圖
(2)路徑長度截斷
① 條件:windows OS,點號需要長于256;linux OS 長于4096
Windows下目錄最大長度為256字節,超出的部分會被丟棄
Linux下目錄最大長度為4096字節,超出的部分會被丟棄
② 測試代碼
<?php$filename = $_GET['filename'];include($filename . ".html"); ?>③
前提:這里以包含WWW目錄下的文件為主,非WWW目錄下我測試時出現了失敗
例1:./繞過對比圖
注:./中可摻雜/,但是不能全部用/
例2:.繞過對比圖
二、遠程文件包含
1、無繞過遠程文件包含
(1)條件
allow_url_fopen = On(是否允許打開遠程文件) allow_url_include = On(是否允許include/require遠程文件)
(2)測試代碼
<?php$filename = $_GET['filename'];include($filename); ?>例:
2、有繞過文件包含
(1)測試代碼
<?php include($_GET['filename'] . ".html"); ?>(2)對比圖
① 沒繞過的
② ?繞過
③ #繞過
④ 空格繞過
三、php偽協議
1、php://
php:// — 訪問各個輸入/輸出流(I/O streams)
說明
PHP 提供了一些雜項輸入/輸出(IO)流,允許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符,內存中、磁盤備份的臨時文件流以及可以操作其他讀取寫入文件資源的過濾器。
2、php://filter
元封裝器,設計用于"數據流打開”時的"篩選過濾”應用,對本地磁盤文件進行讀寫
只是讀取,需要開啟 allow_url_fopen,不需要開啟 allow_url_include
(1)輸出進行base64加密后的信息
?file=php://filter/convert.base64-encode/resource=xx.php 等于 ?file=php://filter/read=convert.base64-encode/resource=xx.php(2)test.php源碼
<?php$filename = $_GET['filename'];include($filename); ?>(3)利用實例
3、php://input(讀取POST數據)
(1)前言:
可以訪問請求的原始數據的只讀流。即可以直接讀取到POST上沒有經過解析的原始數據。 enctype=”multipart/form-data” 的時候 php://input 是無效的
條件:開啟 allow_url_fopen 和 allow_url_include(PHP < 5.3.0)
(2)test.php測試代碼
<?php$filename = $_GET['filename'];include($filename); ?>注:查看當前運行的是哪個php.ini
- 打印出phpinfo(),找到Loaded Configuration File那一行
- php -i |grep php.ini(php -i其實就是輸出phpinfo)
- php -r “phpinfo();” |grep php.ini
(3)利用實例
① 讀取POST提交的數據
② 執行php或系統命令
③ 通過php://input寫入一句話
4、file://偽協議(讀取文件內容)
5、data://偽協議(讀取文件)
(1)前言:這個和php://input類似,都可以執行php指令
(2)格式:
(3)test.php測試代碼
<?php$filename = $_GET['filename'];include($filename); ?>(4)例:
5、phar://偽協議
(1)前言:這個參數是就是php解壓縮包的一個函數,不管后綴是什么,都會當做壓縮包來解壓
注意: PHP > =5.3.0 壓縮包需要是zip協議壓縮,rar不行,將木馬文件壓縮后,改為其他任意格式的文件都可以正常使用
(2)格式:
?file=phar://壓縮包名/內部文件名 例:phar://x.zip/x.php(3)test.php測試代碼
<?php$filename = $_GET['filename'];include($filename); ?>(4)例
寫一個一句話木馬文件,壓縮為.zip后綴的壓縮包文件,然后利用php://char進行利用
6、zip://偽協議
(1)前言
zip偽協議和phar協議類似,但是用法不一樣
注:條件: PHP > =5.3.0,注意在windows下測試要5.3.0<PHP<5.4 才可以 #在瀏覽器中要編碼為%23,否則瀏覽器默認不會傳輸特殊字符
(2)格式
?file=zip://[壓縮文件絕對路徑]#[壓縮文件內的子文件名] 例: zip://xxx.png#shell.php(3)test.php測試代碼
<?php$filename = $_GET['filename'];include($filename); ?>四、參考
Web安全實戰系列:文件包含漏洞
總結
以上是生活随笔為你收集整理的文件包含常见绕过方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件上传常见绕过分析
- 下一篇: 三星卢泰文:未来将推出可折叠设备的防尘解