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

总结

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

相关推荐
考虑考虑1 小时前
Jpa使用union all
java·spring boot·后端
用户3721574261352 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊3 小时前
Java学习第22天 - 云原生与容器化
java
渣哥4 小时前
原来 Java 里线程安全集合有这么多种
java
间彧5 小时前
Spring Boot集成Spring Security完整指南
java
间彧5 小时前
Spring Secutiy基本原理及工作流程
java
Java水解6 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆8 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学8 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole9 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端