php读取json数据-PHP代码审计——有的叫OA

2023-08-29 0 6,056 百度已收录

包子现在只显示经常阅读和加星的公众号的大图推送。 建议您为鹏团保安“定星”,否则可能看不到!

免责声明:文章中涉及的程序(方法)可能具有攻击性,仅用于安全研究和教学。 如果读者将其信息用于其他目的,则用户应承担一切法律及连带责任,文章作者不承担任何法律及连带责任。 责任。

本文主要记录某次调用oa的历史漏洞分析,以便进一步学习代码审计的知识。

环境建设:

使用phpstudy搭建环境

转到下一步。

使用用户名和密码登录。

代码审核:1.文件上传

进入个人办公晚报-我的晚报并使用新功能。

上传文件后

使用burpsuite抓包并定位路由。

通过抓包分析定位到源码,这里调用了uploadAction.php下的upfileAjax()技术。

代码第44行调用了c()方法,并包含了upfileChajian.php文件。

代码第49行调用了upfileChajian.php下的up()方法,

让我们继续了解 up() 技巧。

从upfileChajian.php文件中我们发现upfileChajian类是一个用来上传文件的类,up()方法中的issevefile()方法用于判断后缀。 让我们继续关注这个技术。

如果后缀在白名单中,$bo返回true,否则返回false。

进入filesave()方法,我们跟进该技术

通过描述我们大致知道该方法是将不在白名单中的文件保存到uptemp文件的方法,在代码254-256中可以看出,这里我们读取了我们上传的文件的内容以及base64对文件内容进行编码,并将文件内容转换写入.uptemp文件,最后删除我们上传的恶意文件。

回到upfileAciton()方法,$upses接收up()方法返回的数据并通过downChajian.php中的uploadback()方法将数据备份到数据库,并以json的形式返回。

我们发现这里上传的.php文件的后缀会被替换为.uptemp后缀的文件,并返回上传路径。

在寻找关键函数时,我们发现可以揭示base64文件的方式。 关键是通过控制id将.uptemp后缀恢复为之前上传的后缀。 从代码2的内容也可以看出,这是前面上传过程的逆操作,通过$fileid参数来控制上传的文件。

漏洞复现:

查看源代码。

然后将上传id替换为我们之前上传的eval.php的文件id值

漏洞网址:|runt&a=run&fileid=12

2.该文件包含

全局搜索 include_once 关键字时

回顾一下包含的 $mpathname 变量,我发现代码中有 $mpathname 变量的形参。 我们先看一下上面的代码。 这里,两个变量拼接在一起,$tplpaths和$tplname。

从底层我们可以发现,这里的$tplname的后缀是受到限制的,这里只能包含html文件。

然后看$mpathname的形参,然后找到$xhrock变量,回溯到该变量发现在代码第37行这里实例化了一个类,而那里的$clsname变量是由$m控制的,但是这里的$m可以通过后端传入

我们跟进 strformat() 函数

发现代码中$m是可控的,所以我们需要在class文件中找到$displayfile可控的地方。

搜索displayfile后,我们发现indexAction.php的getshtmlAction函数中的displayfile变量的形式参数是$file。

而回到View.php,我们可以控制$m调用indexAction.php文件,实例化该文件中的indexClassAction类,并且我们可以任意调用该类下的方法,即可以调用该文件下的getshtmlAction方法indexClassAction 类。 具体可以看下面的代码。

漏洞复现:

我们在根目录下创建x.php用于测试

这里的surl需要base64编码php读取json数据,因为代码中$surl参数是base64解码的。

;a=getshtml&surl=eC5waHA==

3. SQL注入漏洞

进入webmain/system/geren/gerenAction.php文件,发现函数changestyleAjax()可以通过post传入style参数php读取json数据,实现更新的SQL注入。

然后看post是如何传递参数的,发现封装的post()函数可以接收post和get参数,还有下面的jmuncode()函数

jmuncode()函数用于过滤传入的参数,进行非法测量。

所以这里我们可以通过传入style参数来控制和改变admin数据表中的内容。

这里的$_confpath指的是要写入的路径。 通过调试,似乎写入到了webmain/webmainConfig.php文件中,其中$str内容中的$this->adminname似乎是对应admin表值中的name数组,我们可以通过执行来验证。

我们可以发现昨晚的文件是写在webmainConfig.php中的。

这样我们就可以利用以上两点,通过SQL注入更新来修改admin表中的name数组值。

通过file_put_contents()写入配置文件。 由于配置文件无法直接访问,因此要获取shell,需要找到包含该文件且可以通过路由访问的文件。

我们可以通过控制changestyleAjax()函数中的style参数来实现SQL注入来修改admin表中的内容。 这里,name的值必须以十六进制补码编码,这样就可以绕过POST函数的测量。

漏洞复现:

我们的路线经过:

/index.php?a=savecong&m=cog&d=system&ajaxbool=true

在构造payload时,我们可以将数据库中的name数组改为一句话,但是通过换行来绕过单行注释,实现注释的绕过。

配置文件写入成功。

访问文件以触发漏洞。

4.SSRF漏洞

进入include/chajian/curlChajian.php文件,

发现下面的函数getcurl(),它使用了函数curl_exec()

功能。

我们发现调用了getcurl()函数,这里的$url是通过Model层的reimModel.php中的$url=$obj->serverhosturl。

这里调用了选项表,通过getval()获取到reimhostsystem对应的值,这里就是如何获取上面$url的值。

在webmain/main/xinhu/xinhuAction.php中的setsaveAjax()方法中,可以设置该处的数组值,这里可以通过传入host来控制该处的数组值。

漏洞复现:

5.XSS漏洞

导航到 webmainloginloginAction.php 文件

跟进ActionNot 类。

ActionNot类重写了大部分xxxAjax方法为空,然后getoptionAjax方法没有重绘。 看一下getoptionAjax方法的逻辑。

跟进getdata方式。

getpids方法中调用了getmou方法,因为$num是get方法传递的,并且没有过滤反斜杠()。

跟进 getmou 方式。

当num最后一位是反斜杠时,SQL语句就变成了,selectxxxfromxxxwhereabc='',至此SQL语句有问题,所以抛出异常,触发debug addlogs方法。 在此 cms 中,默认启用调试。 ,我们按照addlogs的方式。

我们跟进insert方法,

漏洞复现:

6.后台配置文件getshell

全局搜索 gerenClassAction 方法

发现V2.3.0版本以后,int转换只取第一个参数的值

以前的版本

新版本,新版本已经降低了这个漏洞的限制。

但是saveCongAjax函数没有变化

直接在后台使用user rename函数重命名管理员的名字,并在rockClass.php中新建函数过滤器,eval不能使用,替换成assert即可

漏洞复现:

进入用户中心。

更改用户名。

发现配置文件写入成功。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php读取json数据-PHP代码审计——有的叫OA https://www.wkzy.net/game/172337.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务