[ACTF2020 新生赛]Include
[ACTF2020 新生赛]Include
题目来源:buuctf
题目类型:web
涉及考点:文件包含、任意文件读取
1. 题目给了个跳转链接 tips ,点击进入:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230716042800_image-20230716102223327.png)
题目提示存在文件包含漏洞,接下来尝试获取flag.php的源码
2. PHP伪协议
这里需要先介绍一下php伪协议,方便我们做题。
PHP 伪协议是 PHP 支持的协议与封装协议,常见的几个伪协议如下:
伪协议 | 功能 |
---|---|
file:// | 访问本地文件系统 |
http:// | 访问 HTTP(s) 网址 |
php:// | 访问各个输入/输出流 |
phar:// | PHP 归档 |
zip:// | 压缩流 |
这次我们主要介绍php://filter ,这是一个php协议,可以作为一个中间件来处理其他流。简单理解就是,它是一个中转站,可以将获取到的流进行过滤,再将其输出。(类比于食品加工,原材料是输入流,最终产品是输出流,整个加工过程就是中转站)
它有以下几个参数:
名称 | 描述 | 备注 |
---|---|---|
resource=<要过滤的数据流> | 指定了要筛选过滤的数据流 | 必选 |
read=<读链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔 | 可选 |
write=<写链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔 | 可选 |
<;两个链的筛选列表> | 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链 |
下面介绍几个常见的过滤器:
名称 | 功能 |
---|---|
string.rot13 | 一种字符处理方式,字符右移十三位 |
string.toupper | 将所有字符转换为大写 |
string.tolower | 将所有字符转换为小写 |
string.strip_tags | 用来处理掉读入的所有标签,例如XML的等等 |
convert.base64-encode & convert.base64-decode | base64加密解密 |
3. 回到题目,现在尝试构造payload
我们现在需要得到 flag.php 的源码,通过php伪协议我们可以构造如下:
?file=php://filter/read=convert.base64-encode/resource=flag.php
这一步是对 flag.php 进行base64编码。如果不进行过滤操作,读取的数据会被当做php代码执行,那么获取的结果就跟第一步一样了。
将payload上传,得到源码的base64编码:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230716042800_image-20230716122349439.png)
我们对其进行解码,得到flag:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230716042800_image-20230716122439579.png)
flag{eb11b5f2-4e76-46a9-a715-7c80b04e6839}
日期:2023.7.16
作者:y0Zero