包子现在只显示经常阅读和加星的公众号的大图推送。 建议您为鹏团保安“定星”,否则可能看不到!
免责声明:文章中涉及的程序(方法)可能具有攻击性,仅用于安全研究和教学。 如果读者将其信息用于其他目的,则用户应承担一切法律及连带责任,文章作者不承担任何法律及连带责任。 责任。
本文主要记录某次调用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即可
漏洞复现:
进入用户中心。
更改用户名。
发现配置文件写入成功。