信呼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.phpuploadback() 方法备份到数据库,并以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是可控的,所以回到xhrockdisplayfile可控的地方

找到这个

indexAction.phpgetshtmlAction 函数中的 displayfile
量是通过 $file 进行赋值的,而 $file 中的 $surl参数是前端可控的,所以这里可以包含任意的php后缀文件。
(记得base64编码)

View.php中这里我们可以控制$m来调用indexAction.php文件并且实例化文件中的indexClassAction 类,并且可以任意调用该类下的方法,也就是可以调用 indexClassAction 类下的getshtmlAction 方法

渗透测试