伪协议是什么?
PHP伪协议事实上就是支持的协议与封装协议。ctf中的文件包含、文件读取的绕过、正则的绕过等等会需要用到。
那伪协议有哪些?
file:// 、data:// 、 gopher:// 、php:// 等等,下面会讲。
--------本地文件传输协议
file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受配置文件中allow_url_fopen与allow_url_include的影响。
格式:
www.xxx.com?cmd.php=file://[文件的绝对路径和文件名]
file://的学问挺大的,如果对其有兴趣的可以百度细搜,在ctf中file用的较少(一般会被过滤),这里就讲如何用,为CTF的题目做准备的。
重头戏了属于是,php:// 是ctf的常客,所以关于它的故事很多。
使用条件(php.ini配置):
allow_url_fopen | allow_url_include | |
php://input | on/off | on |
php://stdin | on/off | on |
php://memory | on/off | on |
php://temp | on/off | on |
php://filter | on/off | on/off |
看着确实挺多的,有点迷糊,但是只需要记住php://input 以及 php://filter 就行了,就这俩常用,如果想了解其它几个的作用开拓新的绕过姿势可以自己百度搜索哈哈哈。
名称 | 描述 |
resource<--->要过滤的数据流 | 这是个必要参数。它指定了你需要筛选过滤的数据流(简单来说就是你的数据来源) |
read<--->读链的筛选列表 | 这个参数可选。可以设定一个或多个过滤器名称。以管道符(/)分隔 |
write<--->读链的筛选列表 | 这个参数可选。可以设定一个或多个过滤器名称。以管道符(/)分隔 |
看着很乏味,拿个基础题看看
非常基础的题目,考察点纯纯就是php://filter,想做的可以在BUU平台复现
题目给了提示,文件包含,所以这个p盲猜是include内的参数,所以直接输入flag试试
不能直接读取,那就用伪协议间接读它的源码,看看源码有什么猫腻
因为这里用了一次base64编码,用脚本解码就可以了。
小结:
遇到文件包含需要读取源码可以使用php://filter协议,格式如下
读:php://filter/resource=文件名
php://filter/read=convert.base64-encode/resource=文件名
写:php://filter/resource=文件名&txt=文件内容
php://filter/write=convert.base64-encode/resource=文件名&txt=文件内容
----可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
说白了就是当遇到正则匹配时GET传参不能出现的敏感字符,可以通过php://input在POST上传最后绕过了检测。
格式为:
GET : index.php?cmd=php://input
POST : flag.php(目的数据)
有个协议和php://input作用相同,如果碰到input被过滤的情况可以用其替代,这个协议叫data://协议,也比较常用。
和php:input不同的是data://需要 allow_url_fopen、allow_url_include都需要打开(on)。
格式也稍稍有点不同,全部是在GET实现的
file.php?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=
data://text/plain 是固定格式,后面如果有过滤可以用base64,内容可以是命令,也可以输出一些东西,看题目行事。
zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。
格式:
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]
例如: zip://archive.zip#dir/file.txt
先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。
由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。
使用方法:
file = compress.bzip2://file.bz2
在本地的格式使用
http://127.0.0.1/cmd.php?file=compress.bzip2://D:/phpStudy/PHPTutorial/WWW/file.jpg
或者
http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg
使用方法:
file=compress.zlib://file.gz
在本地的格式使用
http://127.0.0.1/cmd.php?file=compress.zlib://D:/phpStudy/PHPTutorial/WWW/file.jpg
或者
http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg
总结:要真正要熟知的可能就是php://**的协议,像后面的几个压缩协议,只是为了拓展攻击面,但事实是我可能太菜了,没碰到很多题目需要用到zip://这类协议的。
参考:PHP: zlib:// - Manual