您当前的位置: 首页 >  php

合天网安实验室

暂无认证

  • 0浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

PHP伪协议的妙用

合天网安实验室 发布时间:2021-09-10 16:30:00 ,浏览量:0

filter协议的简单利用

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

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

首先给出最简单的文件包含的示例代码:


在同目录下有一个flag.php文件:


得到结果:

flag = "flag{Lxxx}";

其他有关PHP支持的字符编码官方文档如下:PHP: 支持的字符编码 - Manual

filter协议的进阶利用

利用filter伪协议绕过死亡之die、死亡之exit

假设我们有以下代码:


base64编码中只包含64个可打印字符,而当PHP在解码base64时,遇到不在其中的字符时,会选择跳过这些字符,将有效的字符重新组成字符串进行解码。

例如:


得到结果:Lxxx

如果我们在str变量中添加一些不可见的字符或者是不可解码字符(\x00,?)


得到的结果仍然为:Lxxx

因此,对于死亡之exit中的代码,字符、空格等字符不符合base64解码范围。最终解码符合要求的只有phpexit这7个字符,而base64在解码的时候,是4个字节一组,因此还少一个,所以我们将这一个手动添加上去。

传payload如下:

?filename=php://filter/convert.base64-decode/resource=1.php
POSTDATA: content=aPD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+

content中第一个字符a就是我们添加的

这个时候我们查看1.php的内容如下:

可以看到一句话木马已经成功写入了。

rot13编码绕过:

除了使用base64编码绕过,我们还可以使用rot13编码绕过。相比base64编码,rot13的绕过死亡之exit更加方便,因为不用考虑前面添加的内容是否可以用base64解码,也不需要计算可base64解码的字符数量。

同样的还是上面的示例代码:


打开1.php文件:

可以看到,一句话木马也成功写入了。

虽然rot13更加的方便,但是还是有缺点,就是当服务器开启了短标签解析,一句话木马即使写入了,也不会被PHP解析。

多种过滤器绕过:

再仔细观察死亡之exit的代码:


可以看到死亡之exit的代码其实本质上是XML标签,因此我们可以使用strip_tags函数除去该XML标签

并且,filter协议允许我们使用多种过滤器,所以我们还是针对上面的实例代码:

            
关注
打赏
1665306545
查看更多评论
0.0396s