xinhucms代码审计
信呼cms将后端代码都放置在webmain目录下,而且访问方式都是1
2
index.php?a=文件名&d=文件对应名&m=模块
shell
在这个地方我们发现可以看到一个上传文档点
抓包发现在upload
文件下upload
文件的public
模块
追踪到uploadAction.php
里面的upfileAjax
主要是对上传文件的限制,使得他按照要求进行上传,里面调用了c函数,跳转到C函数中发现包含了uploadchajian.php
回到原来的代码中发现第49行调用了up函数,跳转查看
issavefile()
方法是用来进行后缀判断的
白名单绕过,如果不在的话调用filesave
函数
这段是读取我们上传的文件内容并保存为base64编码格式,然后将代码保存为uptemp文件,最后进行删除,
回到 upfileAciton()
方法中, $upses
接收 up()
方法返回的数据并将数据通过 downChajian.php
中uploadback()
方法备份到数据库,并以json形式返回
我们发现这里上传到的.php文件后缀会被替换为 .uptemp 后缀的文件,并返回了上传路径
但是我们在进行关键函数的检索的时候发现了一个可以解密base64的地方,并且可以通过控制id来还原.uptemp
后缀文件为之前上传的后缀
从这一段可以看出是上面上传处理的一个反向操作,并且通过fileid
来控制
联系上面是fileid参数来控制上传的文件使其还原
所以我们可以通过更改fileid来控制
渗透测试
将fileid替换为我们上传的文件的id
发现之前的.uptemp确实是可以被替换为.php文件后缀
文件包含
在include_once
的时候发现一个mpathname
可控,
所以我们尝试跟踪这个发现他在上面被赋值了,就是71行的$tplpaths.$tplname
下面我们发现tplname
的后缀是限制限制死的只能为html
我们跟踪另外一个mpathname
,他的代码说明是检查$xhrock->displayfile
是否不为空,检查文件是否存在,然后重点关注这个xhrock
,回溯到上面的是新建一个实例,然后接着回溯这个返现是可以通过控制$m
来控制的
而这里的$m是通过前端传入的
但这里想要进入34行的if判断必须存在 $actfile 文件,而这里的 $actfile 变量是通过代码30行进行处理的。我们跟进 strformat() 函数
这两个的大概内容是找到对应的php文件,而上述代码30行的$m
是可控的,所以回到xhrock
看displayfile
可控的地方
找到这个
indexAction.php
的 getshtmlAction
函数中的 displayfile
变
量是通过 $file
进行赋值的,而 $file
中的 $surl
参数是前端可控的,所以这里可以包含任意的php后缀文件。
(记得base64编码)
而View.php
中这里我们可以控制$m
来调用indexAction.php
文件并且实例化文件中的indexClassAction
类,并且可以任意调用该类下的方法,也就是可以调用 indexClassAction
类下的getshtmlAction
方法