【ACTF2020新生大赛】包含
打开原型,发现页面上只有一个提示超链接:
打开超链接php 伪协议,发现页面并没有什么特别之处:
注意到url中出现了?file=flag.php,考虑是PHP伪合约漏洞,因此构造了payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
使用burpsuite的repeater模块加载构造好的payload:
发现响应中返回了一串字符串,经过base64解码php 伪协议,得到flag:
补充知识:PHP伪合约
php://协议是PHP中特有的一个约定,可以作为中间流来处理其他流并读取任意文件。
php:// 包含几个合约:
协议角色
php://输入
可以访问请求的原始数据的只读流。 在POST请求中,访问POST的数据部分。 当 enctype="multipart/form-data" php://input 无效时。
php://输出
只写数据流,允许以与 print 和 echo 相同的方式写入输出缓冲区。
php://fd
允许直接访问指定的文件描述符。 例如 php://fd/3 指的是文件描述符 3。
php://内存 php://临时
类似数据流的文件包装器,允许读取和写入临时数据。 两者之间唯一的区别是 php://memory 总是将数据存储在显存中,而 php://temp 在内存量达到预定义的限制(默认为 2MB)后将其存储在临时文件中。 临时文件的位置的确定方式与 sys_get_temp_dir() 相同。
PHP://过滤器
一个元包装器,专为打开数据流时的过滤器过滤应用程序而设计。 对于一体化文件函数(例如 readfile()、file() 和 file_get_contents())特别有用,这些函数在读取流内容之前没有机会应用其他过滤器。
这里使用的 php://filter 合约:
用于读取源码并进行base64编码输出。 参数说明如下:
资源= 此参数是必需的。 它指定了你要过滤和过滤的数据流;
read= 该参数是可选的。 可以设置一个或多个过滤器名称,用管道符(|)分隔;
write= 该参数是可选的。 可以设置一个或多个过滤器名称,并用竖线字符 (|) 分隔。
?file=php://filter/read=convert.base64-encode/resource=
这种构造方法很常见,用于获取文件的源代码。
文件包含错误
文件包含漏洞的原因是,当通过PHP函数导入文件时,由于传入的文件名没有经过正确的校准,而操作了非预期的文件,可能会导致非预期的文件泄露甚至恶意代码注入。