一、cms简介:
本文是关于某商城系统代码漏洞分析学习,大纲:
1、环境搭建
2、漏洞分析
二、环境搭建
下载源码,使用idea导入
启动环境
三、漏洞分析
1、第三方组件漏洞审计
本项目是基于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 |
2、组件漏洞代码审计通过查看
pom.xml 文件中引入的第三方插件,且经过搜索查询,发现Fastjson、Log4j、Mybatis引入存在漏洞的版本,我们进一步验证是否存在漏洞。
2.1、Fastjson漏洞代码审计
本项目引入的Fastjson版本为1.2.58,该版本存在反序列化漏洞。
2.1.1、Fastjson简述
Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java对象之间相互转换。 两个主要接口是JSON.toJSONString和JSON.parseObject/JSON.parse,分别实现序列化和反序列化操作。
2.1.2、寻找漏洞触发点
已确定了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"}
验证成功
2.2、Log4j漏洞代码审计
本项目引入的Log4j版本为2.10.0,该版本存在远程代码执行漏洞。
2.2.1、Log4j简述
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文 件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一 条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
2.2.2、寻找漏洞触发点
全局搜索关键字 logger
发现有几处日志记录拼接了变量参数
进入该代码文件,该文件位于 src\main\java\com\xq\tmall\controller\admin\AccountController.java 。该代码文件位于 Controller层,主要用于和视图交互,处理用户输入的数据等操作。
对上述代码进行分析。触发漏洞点的代码为65行的 logger.info("获取图片原始文件名:{}", originalFileName); 。向上追踪,发现通过 file.getOriginalFilename(); 获取file的文件名后赋值 给 originalFileName 。在向上追踪,file参数来自 admin/uploadAdminHeadImage 接口,通过注释我 们可以知道此处为 管理员头像上传 功能。
总结来说:访问管理员头像上传功能,将文件名改为攻击语句,即可触发Log4j漏洞。
2.3、Mybatis漏洞代码审计
本项目引入的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" />
关键条件被否定,即不存在该漏洞
3、单点漏洞审计
对组件是否存在漏洞进行验证后,我们针对功能单点代码审计,发现存在的漏洞。 对于单点功能代码审计除了特定漏洞存在特定代码审计方法,一般我习惯先去看一遍Controller层代码, 了解基本功能。再从功能出发进行代码审计。
3.1、SQL注入漏洞代码审计
本项目使用了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跑
存在时间注入
3.2、XSS漏洞代码审计
从开发视觉来看防护XSS漏洞,大多是过滤/转义用户的输入和输出。对于开发人员来说,不可能对每一 个输入和输出点进行过滤/转义。一般常使用filter层(过滤器)或拦截器进行统一过滤。 或者所使用的前端框架自带防XSS机制。 所以,我们审计XSS漏洞第一步看看filter层是否存在XSS过滤代码。对本项目审计发现filter层并没有关于防护XSS的代码
第二步,我们看看使用的前端框架是什么,版本是多少,以及是否存在防XSS漏洞机制。经过一番查找, 发现pom.xml和webapp文件下,都表明使用了传统的JSP。JSP大多配合Filter进行XSS防护,上述我们发现filter层并没有XSS防护机制。
利用成功
3.3、任意文件上传代码审计
在做Log4j漏洞代码审计时,我们发现管理员头像上传存在文件上传功能,对于该功能,我们主要审计一下是否存在任意文件上传漏洞。 一般,对于代码审计任意文件上传漏洞来说,首先是看看是否存在文件上传功能,然后进一步审计是否 存在任意文件上传漏洞。 或者我们可以查看Controller层所有代码,了解项目大致有哪些功能点。 或者搜索相关关键字,文件上传关键字如下:
File
FileUpload
FileUploadBase
FileItemIteratorImpl
FileItemStreamImpl
FileUtils
UploadHandleServlet
FileLoadServlet
FileOutputStream
DiskFileItemFactory
MultipartRequestEntity
MultipartFile
com.oreilly.servlet.MultipartRequest
但对于 SpingBoot项目 来说,想要SpringBoot内嵌的Tomcat对JSP解析,一定要引入相关依赖。
直接上传jsp文件即可
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)