php伪协议 配合 文件包含漏洞.md
0x00 起因
被问到了php的一伪协议
后发现自己对伪协议的认识还是太浅, 现在好好总结学习一番
又感觉自己学了半天不知道自己在干嘛。。。哎。。。
0x01 环境
PHP版本:5.4.45
PHP.ini:
allow_url_fopen :on 默认开启
allow_url_include:om 默认关闭
PHP版本<=5.2 可以使用%00进行截断,但是少有低版本的了。。。
先站在前人的大肩膀看看总结 ,主要是两个选项的开关,实验我默认都开了
freebuff上看到的
0x02 具体的协议
我的实验代码cmd.php
1 | <?php |
php:// 访问输入输出流
其中主要有两个协议:
php://filter 简介
PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤。
在文件包含中常用到这个协议(因为文件包含的特性,只有包含php标签就会解析,就算是PHP后缀但是里面没有PHP标签也不会解析)
所以如果想要读取运行php文件的源码,可以先base64编码,再传入include函数,这样就不会被认为是php文件,不会执行,会输出文件的base64编码,再解码即可。
常用payload
1 | php://filter/read=convert.base64-encode/resource=cmd.php |
解码即可
php://input 协议
这个协议的利用方法是 :
将要执行的语法php代码写在post中提交,只写代码即可。
file:// 协议
file:// 用于访问本地文件系统,
不受allow_url_fopen与allow_url_include的影响
注意需要绝对路径
1 | file://文件的绝对路径和文件名 |
data://协议
data://协议需要满足双on条件
PHP.ini:
data://协议必须双在on才能正常使用;
allow_url_fopen :on
allow_url_include:on
利用payload
1 | cmd.php?file=data://text/plain,<?php phpinfo()?> |
zip://压缩协议
条件:
需要绝对路径
allow_url_fopen :off/on 任意
allow_url_include:off/on 任意
zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件
要点:不需要指定后缀名也可以利用
我只实验了zip协议
利用的时候:
1 | file=zip://绝对路径#压缩文件内的子文件名 |
只能传入绝对路径。
要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23
1 | http://127.0.0.1/cmd.php?file=zip:///Applications/MAMP/htdocs/xieyi.zip%23sd.php |
0x04 后记
留下了菜的泪水,发现学的有点杂,但是有些东西学的不到位吧。
纯自学有时候有点迷啊,学的乱七八糟的。
还有几个协议没写完,先把常用的写了,后续补上