当前位置:首页 > CN2资讯 > 正文内容

[PHP底层]关于php://filter的分析

2天前CN2资讯


文章目录

写在前面

慢慢不太想写博客了,很多东西都忙不过来,学的很多,今天抽出空来还是督促自己写一篇,灵感来源于刚刚在网上看到的一篇wp,https://xz.aliyun.com/t/10446,不得不说现在比赛可真多哈,小伙伴们也别太经常打,多做点实际的东西

关于php://filter的处理的一些简单解释

这里面呢,有几个比较关键的,一个是需要能获取到文件流(也就是我们后面常常写的resource=xxx.txt),另一个是可选的,就是是否使用其他的编码过滤器,有了这两个东西我们就能配合伪协议去做一些神奇的东西了

php://filter常规流程分析

大家在网上看的最多的也是​​php://filter/read=convert.base64-encode/resource=1.php​​​ 那它发生了什么,我们具体来看看,在​​ext\standard\php_fopen_wrapper.c#php_stream_url_wrap_php​​下一个断点

前六个是​​php://​​没毛病,指针移六位

接下来,由于是filter我们进入分支


给pathdup赋值,内容是指针向右移动六位后,也就是​​/read=convert.base64-decode/resource=1.php​​

接下来开始准备获取文件流了,上图可以看到获取从​​/resource​​​开始的字符串,因此p就是​​/resource=1.php​​​ 接下来比较重要的地方是从指针+10的地方,也就是​​1.php​​当中获取文件流(至于为什么加10,那是因为​​/resource=​​长度是10)

跟进去,这里有一个zend_resolve_path的函数,这个支持用目录穿越的方式进行拼接组合路径,如这个函数名所说,会重新连接返回你一个绝对路径,这里就不带大家更深入为什么了,简单来说会获取你当前的目录路径再与1.php拼接后返回一个绝对路径,当然记住我说的支持路径穿越这很重要,这很重要

之后让​​*p​​​值为​​\0​​​,也就是当前指针指向位置赋值为​​\0​​​,我们知道c中字符串结尾是​​\0​​,因此不难想到这就是简单的清空字符串,接着对其重新赋值

因为这个​​php_strtok_r​​​函数跟进去以后比较复杂,那我简单搜索一下​​php_strtok_r​​,虽然没搜到但看这个能猜到意思是用于分割字符串,结合后面的while可以看出,是一个不断遍历分割后字符串的过程


接下来,由于是​​read=​​​开头进入下面​​php_stream_apply_filter_list​​​函数,当然说一个题外话,这里不需要​​read=​​​或者​​write=​​​都行,php自己会判断,也就是为什么有第三个分支​​else​​了


进去后又是这个函数,但结合后面不难猜到,这按照​​|​​分隔符创建多个过滤器


现在整个流程也清楚了

关于exp的分析

可以看到exp为​​php://filter/resource=./convert.base64-decode/../1.php​​,理解了我上面的过程,这个exp其实都不需要跟入动态调试分析了,这里直接简单说一下

首先是必须要能获取到文件流,还记得我说的吗这个函数中使用了zend_resolve_path去重新连接路径,我们现在​​resource=​​​后面是​​./convert.base64-decode/../1.php​​​,连接后也就是​​当前运行文件路径/./convert.base64-decode/../1.php​​​,最终就是​​当前运行文件路径/1.php​​


第二部分就是是否有过滤器,有就添加上去了,记得怎么获取的吗,​​filter​​字符后面的部分用​​/​​分割

也就是​​/resource=./convert.base64-decode/../1.php​​

因此就是遍历寻找正确的过滤器进行添加

resource=.
convert.base64-decode
..
1.php

整个流程结束

题外话

多提一句,至于是怎么判断有没有这个过滤器的,我的版本是php7.2.9,这里面是靠hash去判断的,还有就是之前很多时候我们对过滤器进行二次编码也是有原因的,如图所示


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/26307.html

    分享给朋友:

    “[PHP底层]关于php://filter的分析” 的相关文章

    如何在甲骨文云服务器中轻松添加IPv6,提升网络效率与安全性

    甲骨文云服务器(Oracle Cloud Infrastructure)是一款功能强大的云计算平台,提供了从虚拟化到数据分析、存储、网络和安全性的全方位服务。它的设计理念是帮助用户灵活应对业务需求,同时确保数据的高效处理和安全性。无论是企业还是个人用户,甲骨文云服务器都能提供定制化的解决方案,满足不...

    GMO VPS:可靠的虚拟专用服务器选择与性能分析

    在我对虚拟专用服务器(VPS)解决方案的探索中,GMO VPS引起了我的注意。作为日本GMO集团旗下的品牌,GMO VPS以其出色的性能和可靠性赢得了众多用户的信赖。我想分享一下为何这个平台如此受欢迎,以及它的相关背景和适用人群。 GMO VPS是如何运作的呢?它使用先进的虚拟技术,将物理服务器划分...

    宝塔安装全攻略:轻松管理你的服务器与网站

    宝塔面板,凭借其简单易用的特性,已经成为很多用户搭建和管理网站的首选工具。作为一款开源的服务器管理软件,宝塔面板提供了丰富的功能和灵活的操作方式,让无论是新手还是经验丰富的用户都能轻松上手。我在使用宝塔面板的过程中,深刻体会到它带来的便利和高效。 功能与特点 宝塔面板最大的一大优势在于其直观的用户界...

    DMIT测试IP详解及VPS选择指南

    DMIT VPS服务概述 我对DMIT的了解始于他们在2017年的成立,作为一家海外VPS厂商,他们在市场上取得了显著的地位。DMIT提供的VPS服务覆盖多个地区,如中国香港、美国洛杉矶和日本东京。这些服务以对国内用户友好的优化路线而受到好评,尤其是CN2 GIA和CMIN2线路,这些线路减少了延迟...

    选择野草云主机服务,享受高性价比与优质体验

    野草云是一家在2016年成立的主机服务提供商,由国人运营,专注于为中国大陆地区的用户提供优质的服务和产品。作为一家相对年轻的主机商,野草云力求用更贴近用户的方式来满足客户需求,特别是在国内市场需求快速增长的背景下,它的出现让很多用户找到了合适的主机选择。 说到野草云的历史背景,首先让我想起它在竞争激...

    AMD EPYC 7002处理器:高性能与高能效的完美结合

    我一直对AMD EPYC 7002系列处理器充满兴趣。这款处理器是AMD公司最新推出的服务器处理器,确实让人感到兴奋。基于现代的Zen 2架构,这款处理器融合了先进的7nm制程工艺,投放市场后便以其高性能和高能效著称。随着数据中心和云计算需求的不断增加,EPYC 7002系列成了一个热议的话题,来看...