PHP代码审计--信呼OA

举报
亿人安全 发表于 2023/03/25 15:09:32 2023/03/25
【摘要】 环境搭建:代码审计:1.文件上传通过burpsuite抓包,定位路由通过我们上述的路由介绍我们可以找到这里上传的方法,这里就是调用了uploadAction.php下的upfileAjax() 方法上述代码44行中调用了 c() 方法,并包含了 upfileChajian.php 文件。在代码的49行去调用了 upfileChajian.php 下的up()方法,我们去跟进up()方法,看看...

环境搭建:

代码审计:

1.文件上传

通过burpsuite抓包,定位路由


通过我们上述的路由介绍我们可以找到这里上传的方法,这里就是调用了uploadAction.php下的

upfileAjax() 方法

上述代码44行中调用了 c() 方法,并包含了 upfileChajian.php 文件。在代码的49行去调用了 upfileChajian.php 下的up()方法,我们去跟进up()方法,看看这里是如何进行

文件上传的。

我们从 upfileChajian.php 文件中就可以发现该upfileChajian类就是用来实现文件上传的一个类,而

这里的up()方法中的issavefile()方法是用来进行后缀判断的,我们跟进该方法。

这里是后缀的白名单校验,如果后缀为白名单中的则 $bo 返回true,否则返回false。

而我们上面传入后缀名不在白名单中, $bo=false ,那么就会进入filesave()方法,我们跟进该方法

通过描述我们大致知道该方法是将不在白名单中的文件保存问uptemp文件形式,代码254-256中可以看

到,这里读取了我们上传的文件内容并且将文件内容base64编码,并将文件内容写入到 .uptemp 文件

中,最后将我们上传的恶意文件进行删除。

这里我们发现这里是无法进行利用的

回到 upfileAciton() 方法中, $upses 接收 up() 方法返回的数据并将数据通过 downChajian.php 中

uploadback() 方法备份到数据库,并以json形式返回

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

在查找关键函数的时候,我们发现一处可以解密 base64 文件的方法,关键可以通过控制id来还

原 .uptemp 后缀为之前上传的后缀。

从代码24-29行的内容也可以看出,这里就是上面上传处理的一个反向操作,并且是通过 $fileid 参数

来控制上传的文件。

漏洞复现:

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

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

2.文件包含

在搜索include_once关键字时,发现一处参数可控的地方

回溯包含的 $mpathname 变量,发现71-72行代码都对 $mpathname 这个变量进行了赋值,先来看71行的

代码,这里由两个变量进行拼接, $tplpaths 、 $tplname 。

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

也有所限制。

接着去看72行对 $mpathname 的赋值,这里主要的关注点在于 $xhrock 变量,向上回溯该变量发现在代

码37行处这里去实例化了一个类,而该处的 $clsname 变量是通过 $m 控制的,但这里的 $m 是可以通过

前端传入的。但这里想要进入34行的if判断必须存在 $actfile 文件,而这里的 $actfile 变量是通过代码

30行进行处理的。我们跟进 strformat() 函数

这两个方法的大概内容是找到对应的php文件,而上述代码30行的 $m 是可控的,所以我们要找到一个类

文件中 $displayfile 可控的地方。

通过搜索 displayfile ,我们发现其中indexAction.php的 getshtmlAction 函数中的 displayfile 变

量是通过 $file 进行赋值的,而 $file 中的 $surl 参数是q前端可控的,所以这里可以包含任意的php

后缀文件。

而回到View.php中这里我们可以控制$m来调用indexAction.php文件并且实例化文件中的

indexClassAction 类,并且可以任意调用该类下的方法,也就是可以调用 indexClassAction 类下的

getshtmlAction 方法,具体可以看下面代码。

漏洞复现:

我们在根目录下创建1.php用于包含测试

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

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

3.SQL注入到getshell

在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 中写入了刚才的文件内容,再一次证明了这里调用了数据库中

admin 表中的 name 字段的值。

这样我们就可以把上述的两个点进行利用,通过SQL注入update更改admin表中的name字段值,在通

过file_put_contents()写入到配置文件中。由于该配置文件不能直接访问,所以要获取shell就要找到一

处包含该文件并能通过路由访问到的文件。

通过简单搜索,我们发现 config.php 文件会引入配置文件,并通过 require() 进行包含,并且该文件

可以直接进行访问。

上述审计过程我们知道,我们可以通过控制 changestyleAjax() 函数中的style参数来实现SQL注入更

改admin表中的内容,这里的name传值需要使用十六进制编码,这样就可以绕过POST函数的检测。

漏洞复现:

通过上述payload我们可以将数据库中的 name 字段改为一句话,并且通过换行来绕过单行注释实现注释

的绕过。


然后我们通过如下路由:

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

4.SSRF

在include/chajian/curlChajian.php文件中,发现如下函数 getcurl() ,该函数中用到了函数curl_exec()

函数,此处明显存在SSRF漏洞,那么我们需要找到一个可以控制 $url 的地方。

我们发现此处调用了 getcurl() 函数,而这里的 $url 是通过Model层的 reimModel.php 中的 $url =

$obj->serverhosturl 。

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

式,那么就要找到可以设置该值的地方。

在webmain/main/xinhu/xinhuAction.php中 setsaveAjax() 方法中可以设置该处字段值,这里可以通

过传入host来控制该处字段值。

这里测试发现是可行的,那么该处参数是可控的,也就存在SSRF。

漏洞复现:

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方法,如图:

注意到第七行的记录IP,我们之前知道,IP是可以被伪造的,虽然过滤了空格,但是我们可以使用tab键来进行绕过。这里最大的痛点就是将圆括号给过滤掉了,导致我们无法进行sql注入,我们跟进insert方法,如图:

漏洞复现:

6.后台配置文件getshell

gerenClassAction

在V2.3.0后,int强转只取第一个参数的值
(一开始没看仔细还以为那里做了过滤,后面更了post也没发现那里不对。最好才看见这个int)

之前版本

新版本。

但是saveCongAjax函数没任何变化

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

漏洞复现:

REF:

https://www.freebuf.com/articles/web/286380.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。