前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP代码审计-某呼OA

PHP代码审计-某呼OA

原创
作者头像
亿人安全
发布2023-11-09 21:10:56
2710
发布2023-11-09 21:10:56
举报
文章被收录于专栏:红蓝对抗红蓝对抗

原文首发在:奇安信攻防社区

https://forum.butian.net/share/2196

此篇文章主要记录了某呼oa的历史漏洞分析,便于进一步学习代码审计的知识。

环境搭建

使用phpstudy进行环境搭建

图片
图片

进入下一步。

图片
图片

使用用户名和密码进行登录。

图片
图片

代码审计:

1.文件上传

进入个人办公-工作日报-我的日报,使用新增功能。

图片
图片

然后上传文件

图片
图片

通过burpsuite抓包,定位路由。

图片
图片

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

图片
图片

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

图片
图片
图片
图片

在代码的49行调用了 upfileChajian.php 下的up()方法, 我们去跟进up()方法。

图片
图片

我们从 upfileChajian.php 文件中发现该upfileChajian类就是用来实现文件上传的一个类,而这的up()方法中的issavefile()方法是用来进行后缀判断的,我们跟进该方法。

图片
图片

如果后缀为白名单中的则 $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值

图片
图片

漏洞url:http://127.0.0.1/task.php?m=qcloudCos|runt&a=run&fileid=12

图片
图片
图片
图片
图片
图片

2.文件包含

全局搜索include_once关键字时

图片
图片

回溯包含的 $mpathname 变量,发现代码都对 $mpathname 这个变量进行了赋值,先来看前面的代码,这里由两个变量进行拼接, $tplpaths 、 $tplname 。

图片
图片

从下面的我们可以发现这里的 $tplname 的后缀是被限制死的,这里只能是包含html文件。

图片
图片

接着去看对 $mpathname 的赋值,然后发现 $xhrock 变量,向上回溯该变量发现在代码37行处这里去实例化了一个类,而该处的 $clsname 变量是通过 $m 控制的,但这里的 $m 是可以通过前端传入的。 我们跟进 strformat() 函数

图片
图片

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

图片
图片

然后搜索 displayfile ,我们发现其中indexAction.php的 getshtmlAction 函数中的 displayfile 变量是通过 $file 进行赋值的。

图片
图片
图片
图片

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

图片
图片

漏洞复现:

我们在根目录下创建x.php进行测试

图片
图片

这里的surl要进行base64编码,这是由于代码中对 $surl 参数进行了base64解码。

http://127.0.0.1/?m=index&a=getshtml&surl=eC5waHA==

图片
图片

3.SQL注入漏洞

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

图片
图片

接着看post是如何传参的,发现封装的post()函数可以接收post以及get传参,而下面的jmuncode()函数

图片
图片
图片
图片

jmuncode() 函数是用来对传入的参数进行过滤以及非法检测的。

图片
图片

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

图片
图片

这里的 $_confpath 指的是要写入的路径,通过调试发现其实是写入到了webmain/webmainConfig.php 文件中,其中 $str 的内容中 $this->adminname 其实是对应的admin表中的name字段值,我们可以通过执行该方法来进行验证。

图片
图片
图片
图片

我们可以发现在 webmainConfig.php 中写入了刚才的文件。

图片
图片

这样我们就可以把上述的两个点进行利用,通过SQL注入update更改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 。

图片
图片
图片
图片

这里调用了option表,通过getval()来获取reimhostsystem对应的值,这里知道上述 $url 的值的获取方式。

图片
图片

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

图片
图片

漏洞复现:

图片
图片
图片
图片
图片
图片

5.XSS漏洞

定位到\webmain\login\loginAction.php文件

图片
图片

跟进ActionNot类。

图片
图片

ActionNot类将大多数xxxAjax方法覆盖为空,然后getoptionAjax方法没有被重写,看一下getoptionAjax方法的逻辑。

图片
图片

跟进getdata方法。

图片
图片

getpids方法中调用了getmou方法,这里$num由于是get方法传递过来的,没有过滤反斜杠(\)的。

跟进getmou方法。

图片
图片
图片
图片

当num最后一位为反斜杠时,SQL语句变为,select xxx from xxx where abc=’\’,至此SQL语句出现问题,从而抛出异常,触发debug的addlogs方法,在该cms中,debug是默认被开启的,我们跟进addlogs方法。

图片
图片

我们跟进insert方法,

图片
图片
图片
图片

漏洞复现:

图片
图片
图片
图片

6.后台配置文件getshell

全局搜索gerenClassAction方法

图片
图片

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

图片
图片

之前版本

图片
图片

新版本,新版本已经对这个漏洞进行了增加了限制。

图片
图片

但是saveCongAjax函数没任何变化

图片
图片

直接利用后台的用户改名功能重命名管理员的名称,在rockClass.php新建了函数过滤,eval不能使用。直接用assert代替即可

图片
图片
图片
图片

漏洞复现:

进入用户中心。

图片
图片

修改用户名。

图片
图片

发现成功写入了配置文件。

图片
图片
图片
图片

REF: [https://www.freebuf.com/articles/web/286380.html] https://wx.zsxq.com/dweb2/index/topic_detail/214514585882881 https://www.cnblogs.com/p00mj/p/11797819.htmlPHP代码审计-某呼OA

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境搭建
  • 代码审计:
    • 1.文件上传
      • 漏洞复现:
    • 2.文件包含
      • 漏洞复现:
    • 3.SQL注入漏洞
      • 漏洞复现:
    • 4.SSRF漏洞
      • 漏洞复现:
    • 5.XSS漏洞
      • 漏洞复现:
    • 6.后台配置文件getshell
      • 漏洞复现:
相关产品与服务
代码审计
代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com