Java安全—SPEL表达式&XXE&SSTI模板注入&JDBC&MyBatis注入

前言

之前我们讲过SpringBoot中的MyBatis注入和模板注入的原理,那么今天我们就讲一下利用以及发现。

这里推荐两个专门研究java漏洞的靶场,本次也是根据这两个靶场来分析代码,两个靶场都是差不多的。

https://github.com/bewhale/JavaSec

https://github.com/j3ers3/Hello-Java-Sec

JDBC注入

JDBC和MyBatis差不多,也是数据库驱动的一种,之前只讲了MyBatis的注入,今天顺便讲一下JDBC注入。直接看漏洞代码好吧,可以看到这种是采用Statement方法拼接SQL语句,没有使用预编译,不用多说这样子包早成sql注入的。

利用一个报错语句即可实现注入。

复制代码
id=1"' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)-- +

接着看使用PrepareStatement方法对SQL语句进行预编译的,它这里的代码还是直接拼接构造sql,那么它的预编译是无效的。

正常查询id = 1。

拼接一下or语句,id = 1 or 1 =1。

还有一种就是采用了JdbcTemplate方法去封装,但如果是拼接构造的SQL语句,那么依旧会产生注入。

安全写法:SQL语句占位符(?)+PrepareStatement预编译。

MyBatis注入

like注入

之前我们说过MyBatis在使用模糊查询like的时候,如果开发者使用#号那么就是预编译,如果使用$号那么就是语句拼接。

可以回顾一下文章

【安全】mybatis中#{}和{}导致sql注入问题及解决办法_{}sql注入-CSDN博客

Mybatis模糊查询: Select * from users where username like '%#{username}%'

在这种情况下使用 # 程序会报错,开发者为了图个方便直接把#{username}改为${username},从而造成注入。

sql注入语句。

正确写:Select * from users where username like concat('%',#{username}, '%')

Order by注入

这个是由于使用 #{} 会将对象转成字符串,形成 order by "user" desc 造成错误,因此很多研发会采用${}来解决,从而造成SQL注入。

看一下代码,${field}表示拼接语句。

sql注入语句。

In注入

in之后多个id查询时使用 # 同样会报错,入。因此很多研发会采用${}来解决,从而造成SQL注入。

例如以下语句${ids}表示拼接,可以构造sql语句。

注入语句:1,2,3) and (updatexml(1,concat(0x7e,(select user())),0))-- -

cms代码审计

我们来对一个cms进行简单的代码审计,找一下注入点。

由于我们这里是白盒测试,所以我们可以看一下它的pom文件,看它引入了什么。可以看到引入了MyBatis数据库驱动,那么就有可能存在我们上面说过的注入问题。

我们直接进行全局搜索好吧,直接搜 %${ 发现没有这种写法。

还有一种写法是 (${,直接搜发现有挺多的。

直接找个具有sql语句的文件打开,可以到存在我们前面说过的In注入。可以看到当id = "deleteArticleByIds"时就会调用这个sql语句进行文章删除,那么我们直接搜索一下这个deleteArticleByIds,看看是啥玩意。

直接搜索可以看到deleteArticleByIds这是一个执行删除文章的方法。

往上滑一下,发现有路由,当我们访问/delete时就是执行删除页面。

但是我们直接访问/delete是不行的,说明上面还有一层路由。

继续往上看,在最上面可以看到一个一级路由,根据注释我们就可以知道应该先访问admin/article进入后台才能访问/delete。

访问后台进行登录,账号密码为admin/111111。

成功登录。

在文章管理的地方我们找到删除操作。

我们进行删除操作,然后抓个包,这里可看到请求的路径是和我们上面说的路由时对应上的,在一级路由/admin/article后面加二级路由/delete才能进行删除操作。

把抓到的数据包丢到sqlmap上一把梭哈,可以看到确实存在sql注入,我们上面分析的没错。

XXE

这个靶场也提供了五种XXE漏洞的实例。

里面还回告诉你在白盒测试中以下函数有可能会造成XXE漏洞,黑盒测试的话就只能看看哪里有处理XXE数据的地方,直接搞个payload去测就行。

模板注入

之前我们交过这个模板注入,就是你引用模板的时候会解析里面的代码,那么我把模板换成java的恶意代码是否可以造成rce呢?来到靶场这里看到有这个thymeleaf模板注入,这个是我们之前讲过的。

提交payload,本地弹出计算机。

来到源码,可以看到模板下面存在en.html,zh.html。

而且SSTI.java类里面模板参数可控,这就会造成模板注入。

这篇文章总结了不同语言下的模板注入,有兴趣的可以看一下。

https://www.cnblogs.com/bmjoker/p/13508538.html

SPEL表达式

这个玩意可以理解为SpringBoot框架中的一种语言,用于在运行时查询和操作对象图,由于未对参数做过滤可造成任意命令执行。可以看一下代码,简单来说就是ex参数可控,传进来的参数通过SPEL表达式进行解析。

参数为100-1时页面显示99。

参数为100-2时页面显示98,这就说明了SPEL表达式会去解析我们ex参数。

这时候我们把参数换成恶意代码,即可造成rce。

还给出了审计函数。

黑名单过滤,可以看到过滤了exec,Runtime,那么上面payload就不能用了,可以看一下下面的文章是如何绕过的。

https://www.freebuf.com/vuls/197008.html

总结

最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。

相关推荐
JAVA面经实录9173 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
数字供应链安全产品选型4 小时前
关键领域清单+SBOM:834号令下软件供应链的“精准治理“逻辑与技术落地路径
人工智能·安全
许彰午5 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
Bat U6 小时前
JavaEE|多线程初阶(七)
java·开发语言
misL NITL7 小时前
idea、mybatis报错Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required
tomcat·intellij-idea·mybatis
掌心向暖RPA自动化9 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
日取其半万世不竭9 小时前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器
byoass9 小时前
企业云盘与设计软件深度集成:AutoCAD/Revit/SolidWorks插件开发与API集成实战
服务器·网络·数据库·安全·oracle·云计算
TeamDev9 小时前
JxBrowser 9.0.0 版本发布啦!
java·前端·混合应用·jxbrowser·浏览器控件·跨平台渲染·原声输入
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试