php://filter技术分享

0x00 前言

php://filter是PHP中的一个协议,利用这个协议我们可以解决一些ctf的题目,或者挖掘出一些漏洞。

0x01 php://filter

php://filter可以作为一个中间流来处理其他流,具有四个参数:

名称描述备注
resource=<要过滤的数据流>指定了你要筛选过滤的数据流。必选
read=<读链的筛选列表>可以设定一个或多个过滤器名称,以管道符(|)分隔。可选
write=<写链的筛选列表>可以设定一个或多个过滤器名称,以管道符(|)分隔。可选
<;两个链的筛选列表>任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

例子:

<?php
#这里没有指定过滤器
readfile("php://filter/resource=http://www.example.com");
?>

<?php
/* 这会以大写字母输出 www.example.com 的全部内容 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");

/* 这会和以上所做的一样,但还会用 ROT13 加密。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>

这里使用了管道符|来对多个过滤器的名称进行了分割

0x02 ctf中的应用

——————————————————————————

①使用base64获取源码

例:bugku ctf练习平台的 flag在index里面 题目
这里写图片描述
题目提示flag在index里面,但是无法通过查看源码得到有效信息,因此尝试使用php://filter获取源码
这里写图片描述
可以看到通过base64加密后的源码已经爆出
解密,排版,轻松得到flag
这里写图片描述

②绕过关键限制

这一部分思路来源于:leavesongs大牛 https://www.leavesongs.com/PENETRATION/php-filter-magic.html
我是勤劳的搬运工

思路一

<?php
$content = '<?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);

这里的$content在开头增加了exit,使得我们即使可以成功写入一句话,也无法执行。
我们通过php://filter巧妙绕过这里的限制
1.对我们想要写入的一句话进行base64encode
2.php://filter/read=convert.base64-decode进行解码
那么\<\?php exit;?>这一部分在经过解码后,php不对其解析,而我们想要写入的一句话正好被成功解码。因此得以成功上传webshell。

这里写图片描述

思路二

上面的题目除了base64外,还有另一种做法。
我们可以发现我们想要去除的代码片其实是一个XML标签,因此我们可以想到一个函数去去除它:strip_tags

如果这样进行处理的话,我们想要写入的一句话也会被处理。
不过,我们的php://filter是可以使用多个过滤器的,因此我们可以先对我们想要的一句话进行编码,过滤器中先使用strip_tags函数进行处理再使用对应的解码方法即可!(如base64,rot-13
这里写图片描述

如果使用rot-13,则该方法仅限于当short_open_tag不开启的时候

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值