本文是关于某商城系统代码漏洞分析学习,大纲:
1、环境搭建
2、漏洞分析
下载源码,使用idea导入
启动环境
本项目是基于Maven构建的。对于Maven项目,我们首先从 pom.xml 文件开始审计引入的第三方组件是 否存在漏洞版本,然后进一步验证该组件是否存在漏洞点。本项目引入的组件以及组件版本整理如下。
组件名称 | 组件版本 |
---|---|
SpringBoot | 2.1.6.RELEASE |
Fastjson | 1.2.58 |
Mysql | 5.1.47 |
Druid | 1.1.19 |
Taglibs | 1.2.5 |
Mybatis | 3.5.1 |
Log4j | 2.10.0 |
pom.xml 文件中引入的第三方插件,且经过搜索查询,发现Fastjson、Log4j、Mybatis引入存在漏洞的版本,我们进一步验证是否存在漏洞。
本项目引入的Fastjson版本为1.2.58,该版本存在反序列化漏洞。
Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java对象之间相互转换。两个主要接口是JSON.toJSONString和JSON.parseObject/JSON.parse,分别实现序列化和反序列化操作。
已确定了Fastjson版本存在问题,进一步寻找触发Fastjson的漏洞点。我们关注两个函数 JSON.parse() 和 JSON.parseObject() 。全局搜索两个关键字,发现本项目存在 JSON.parseObject()
进入 ProductController.java 文件,问题代码出现在了第151行 ,使用 JSON.parseObject() 方法反序列化了 propertyJson 参数,我们向上追踪 propertyJson 参数,该参数是 添加产品信息 接口中 产品属性JSON 字段
我们去验证一下,去该模块抓包修改数据
把参数替换成 fastjson的payload
{"@type":"java.net.Inet4Address","val":"1lbp04.dnslog.cn"}
验证成功
本项目引入的Log4j版本为2.10.0,该版本存在远程代码执行漏洞。
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文 件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一 条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
全局搜索关键字 logger
发现有几处日志记录拼接了变量参数
进入该代码文件,该文件位于 src\main\java\com\xq\tmall\controller\admin\AccountController.java 。该代码文件位于 Controller层,主要用于和视图交互,处理用户输入的数据等操作。
对上述代码进行分析。触发漏洞点的代码为65行的 logger.info("获取图片原始文件名:{}", originalFileName); 。向上追踪,发现通过 file.getOriginalFilename(); 获取file的文件名后赋值 给 originalFileName 。在向上追踪,file参数来自 admin/uploadAdminHeadImage 接口,通过注释我 们可以知道此处为 管理员头像上传 功能。
总结来说:访问管理员头像上传功能,将文件名改为攻击语句,即可触发Log4j漏洞。
本项目引入的Mybatis版本为3.5.1,该版本存在远程命令执行漏洞。我们进一步探索一下。Mybatis < 3.5.6存在远程代码执行漏洞,CVE编号为 CVE-2020-26945 。在满足以下三个条件的时候,攻击者可以触发远程代码执行:
1、用户启用了内置的二级缓存(默认不开启,需手动配置)
2、用户未设置JEP-290过滤器
3、攻击者找到了一种修改私有Map字段条目的方法,即修改 org.apache.ibatis.cache.impl.PerpetualCache.cache有效的缓存密钥
所谓二级缓存,也就是将查询结果放到缓存中,下次查询时结果相同的话直接从缓存中获取结果。经过探索 src\main\resources\mybatis 下面的配置文件,本项目并未开启 二级缓存。
Mybatis开启二级缓存语句
<setting name = "cacheEnabled" value = "true" />
关键条件被否定,即不存在该漏洞
对组件是否存在漏洞进行验证后,我们针对功能单点代码审计,发现存在的漏洞。对于单点功能代码审计除了特定漏洞存在特定代码审计方法,一般我习惯先去看一遍Controller层代码, 了解基本功能。再从功能出发进行代码审计。
本项目使用了Mybatis,来定义SQL。我们主要查看Myabatis中 xxxMapper.xml 文件中是否存在使用 $ 拼接SQL语句的情况。使用 $ 是直接拼接SQL语句的,未进行转义。全局搜索关键字 $ ,确实存在几处 order by 使用了 $ 拼接SQL语句,因为 order by 是没办法使用 #{} 的。
以 UserMapper.xml 文件为例,进行逆向追踪。
①、双击进入 UserMapper.xml 文件,第78行存在问题。向上查看根据 select id 追踪该dao层的代码 文件。如果在IDEA中安装插件 Free Mybatis plugin 是可以快速进行跳转到代码文件,只需点击左侧 绿色箭头即可
②、跳转到dao层代码文件,可以看到select函数中存在 orderUitl 参数,我们继续逆向追踪,看看参数 值从何而来。
③、键盘按住 ctrl 键后鼠标左击 select ,查看谁使用该函数
④、可以看到有两个文件使用了该函数方法,点击 UserServiceImpl.java 文件,定位到37行。
⑤、从上图可以看出。getList 方法中需要 orderUtil 参数,我们继续逆向追踪,看看orderUtil又是从 何而来。首先看看谁使用了 getList 方法,键盘按住 ctrl 键后鼠标左击 getList
⑥、可以看到 UserController.java 使用了该方法,且第170行中传入了 orderUtil 值,进入文件查看 具体代码
⑦、针对上述文件进行分析,先看161行实例化OrderUitl工具类,该类需要两个参数即, orderyBy和 isDesc 。点击进入查看该类的代码,该类文件位于 src\main\java\com\xq\tmall\util\OrderUtil.java 。通过注释了解该类用于排序/倒序字段
⑧、此时应该追踪 orderBy 参数是从何而来。从下图可以看到,该值通过 admin/user/{index}/{count} 接口传过来的。通过注释可以看出来该接口用于按条件查询用户
整个流程串下来,确定了漏洞点为 orderby 参数,该参数值来源于 按条件查询用户 。
既然接口找到了,我们可以使构造请求,然后进一步验证。或者,通过 注释我们了解到该接口为查询用户,我们访问后台寻找功能点,发现用户管理翻页查询会向该接口发送 请求数据包
我们直接用sqlmap跑
存在时间注入
从开发视觉来看防护XSS漏洞,大多是过滤/转义用户的输入和输出。对于开发人员来说,不可能对每一 个输入和输出点进行过滤/转义。一般常使用filter层(过滤器)或拦截器进行统一过滤。或者所使用的前端框架自带防XSS机制。所以,我们审计XSS漏洞第一步看看filter层是否存在XSS过滤代码。对本项目审计发现filter层并没有关于防护XSS的代码
第二步,我们看看使用的前端框架是什么,版本是多少,以及是否存在防XSS漏洞机制。经过一番查找, 发现pom.xml和webapp文件下,都表明使用了传统的JSP。JSP大多配合Filter进行XSS防护,上述我们发现filter层并没有XSS防护机制。
利用成功
在做Log4j漏洞代码审计时,我们发现管理员头像上传存在文件上传功能,对于该功能,我们主要审计一下是否存在任意文件上传漏洞。一般,对于代码审计任意文件上传漏洞来说,首先是看看是否存在文件上传功能,然后进一步审计是否 存在任意文件上传漏洞。或者我们可以查看Controller层所有代码,了解项目大致有哪些功能点。或者搜索相关关键字,文件上传关键字如下:
File
FileUpload
FileUploadBase
FileItemIteratorImpl
FileItemStreamImpl
FileUtils
UploadHandleServlet
FileLoadServlet
FileOutputStream
DiskFileItemFactory
MultipartRequestEntity
MultipartFile
com.oreilly.servlet.MultipartRequest
但对于 SpingBoot项目 来说,想要SpringBoot内嵌的Tomcat对JSP解析,一定要引入相关依赖。
直接上传jsp文件即可
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。