066-Web攻防-Java安全JAR包靶场&审计源码等
066-Web攻防-Java安全JAR包靶场&审计源码等
知识点
1、Java安全-SQL注入-JDBC&MyBatis
2、Java安全-XXE注入-Reader&Builder
3、Java安全-SSTI模版-Thymeleaf&URL
4、Java安全-SPEL表达式-SpringBoot框架
JavaSec搭建
项目下载地址:https://github.com/bewhale/JavaSec
具体搭建请参考:https://blog.csdn.net/qq_61553520/article/details/136767473
默认账户密码admin/admin
使用
java -jar javasec-0.0.1-SNAPSHOT.jar启动靶场 成功之后会跳出如下信息访问地址
http://127.0.0.1:8000/账户名密码均为admin
Hello-Java-Sec搭建
项目下载地址:https://github.com/j3ers3/Hello-Java-Sec
具体搭建请参考:https://blog.csdn.net/qq_61553520/article/details/136767473
使用java -jar javasec-1.10.jar启动靶场环境
如果安装了高本吧的jkd不想切换版本可以使用 在靶场目录下使用这段如果不行还是建议安装1.8的JDK
默认账户密码admin/admin
java --add-exports java.naming/com.sun.jndi.ldap=ALL-UNNAMED -jar javasec-1.10.jar* ``` @GetMapping("/doc/{document}") public void getDocument(@PathVariable String document) { System.out.println(document); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
* 
## Java安全-SQL注入
Java操作数据库的三种方式:JDBC,[MyBatis](https://so.csdn.net/so/search?q=MyBatis&spm=1001.2101.3001.7020),Hibernate
* -Hibernate
* Hibernate是一个Java持久化框架,它提供了一种将对象映射到关系数据库表的机制。通过Hibernate,开发人员可以使用面向对象的方式来操作数据库,而不需要编写复杂的SQL语句。
* Hibernate的核心思想是对象关系映射(Object-Relational Mapping,ORM),它将Java对象和数据库表之间建立了映射关系,使开发人员可以通过操作Java对象来实现对数据库的操作,而无需直接操作SQL语句。
* Hibernate提供了一系列的API和工具,用于处理对象的持久化、查询、缓存和事务管理等方面。它还提供了一个强大的查询语言HQL(Hibernate Query Language),类似于SQL语法,但更加面向对象。
* 使用Hibernate可以简化开发过程,提高效率,并且具有良好的跨数据库兼容性。它是Java开发中最流行的ORM框架之一,被广泛应用于企业级应用程序的开发中。
* Hibernate作为一个成熟的框架,在安全性方面表现良好,并且经过了广泛的安全测试和修复。
* -JDBC
* 采用Statement方法拼接SQL语句
* PrepareStatement会对SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。
* JDBCTemplate是Spring对JDBC的封装,如果使用拼接语句便会产生注入
* 安全写法:SQL语句占位符(?) + PrepareStatement预编译
* -MyBatis
* MyBatis支持两种参数符号,一种是#,另一种是$,#使用预编译,$使用拼接SQL。
* order by注入:由于使用#{}会将对象转成字符串,形成order by "user" desc造成错误,因此很多研发会采用${}来解决,从而造成注入.
* like 注入:模糊搜索时,直接使用'%#{q}%' 会报错,部分研发图方便直接改成'%${q}%'从而造成注入.
* in注入:in之后多个id查询时使用 # 同样会报错,从而造成注入.
### JDBC
Java语言连接数据库操作
SQLI(SQL Injection), SQL注入是因为程序未能正确对用户的输入进行检查,将用户的输入以拼接的方式带入SQL语句,导致了SQL注入的产生。攻击者可通过SQL注入直接获取数据库信息,造成信息泄漏。
**JDBC有两个方法执行SQL语句,分别是PrepareStatement和Statement。**
1. **采用Statement方法拼接SQL语句(没有预编译)**
* 
* 
2. **PrepareStatement会对SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。**
* 
* 
3. **JDBCTemplate是Spring对JDBC的封装,如果使用拼接语句便会产生注入**
* 
> 安全写法:SQL语句占位符(?) + PrepareStatement预编译
>
> 事实证明,最框架的不安全使用会造成[SQL注入漏洞](https://so.csdn.net/so/search?q=SQL注入漏洞&spm=1001.2101.3001.7020)
>
> 大型网站不用想,小型网站有测试的价值
### **MyBatis**
mybatis是一个优秀的基于java的持久层框架,它内部封装了 jdbc
1. MyBatis支持两种参数符号,一种是#,另一种是$,**#使用预编译,$使用拼接SQL。(造成注入原因也是因为使用了$进行拼接)**
* 
2. **order by 造成SQL注入**:由于使用#{}会将对象转成字符串,形成order by \“user”\ desc造成错误,因此很多研发会采用${}来解决,从而造成注入
* 
3. **like 注入**:模糊搜索时,直接使用’%#{q}%’ 会报错,部分研发图方便直接改成’%${q}%'从而造成注入.
* 
4. **in注入**:in之后多个id查询时使用 # 同样会报错,从而造成注入.
* 
**白盒审计**
在真实情况下,需要先分析源码里用了那种方式操作数据库(JDBC还是MyBatis),然后在针对性看代码写法,JDBC如果没用到安全写法,那么就容易出现问题。MyBatis看代码用了$还是#,#号就可以不用看了,$符号就看是不是在order by、like、in里面,在就恭喜了
### 代码审计案例:inxedu后台MyBatis注入
搭建详情参考:https://blog.csdn.net/qq_61553520/article/details/136767473
* 
* 使用phpstudy 5.5的数据库 导入网站的sql文件
* <img src="/img/image-20250627174620696.png" alt="image-20250627174620696" style="zoom:50%;" />
* 配置好端口地址点击右上角当前文件 —— 选择编辑配置信息——点击**+**号 ——选择tomcat本地
* <img src="/img/image-20250627175521669.png" alt="image-20250627175521669" style="zoom:50%;" />
* 这里需要配置tomcat 没有的具体参考:https://blog.csdn.net/rej177/article/details/126135033
* 
* <img src="/img/image-20250627181159792.png" alt="image-20250627181159792" style="zoom:50%;" />
* <img src="/img/image-20250627194041299.png" alt="image-20250627194041299" style="zoom:50%;" />
* 如果报错在项目——项目结构这里选择你所下载的JDK
* 
* 如果打开报错显示404
* 
* 
* 
1. 常规黑盒测试在url后面直接进行测试
* 
2. 白盒测试看项目的`引用库`和`pron.xml`
* <img src="/img/image-20250627200630863.png" alt="image-20250627200630863" style="zoom:50%;" />
3. 从引用库里面看到有用到`mybatis`猜测有用到`mybatis`的数据操作
* <img src="/img/image-20250627200731492.png" alt="image-20250627200731492" style="zoom:33%;" />
4. 在白盒审计里面如果使用到mybatis数据库产生了SQL注入要想到在代码里面是否使用了这个三个`${`、`%${`、`(${`写法
* 
5. 返回源代码 ctrl+shift+f 在文件里面全局查找是否有这三种写法的方式
* 可以看到在第三个这里有个xml文件出现了这种写法是点击去看发现是早删除文件模块 我们查看在文件里面有谁调用了`eleteArticleByIds`
* 
6. 在第二个xml控制器文件调用了`eleteArticleByIds`操作,根据文件名称推测是这个 点进去查看
* <img src="/img/image-20250627203352296.png" alt="image-20250627203352296" style="zoom:50%;" />
7. 点击进去发现路径是/delete 根据上面文件顶部的主类看到sql注入的地方在文件后台管理页面的`/admin/article`下面,这里我们登录后台管理页面查看
* 
* 
8. 后台管理路径是/admin 账户名是admin 密码是111111
* 
9. 来到后台界面没有admin/article界面猜测是在文件咨询管理这里的删除功能产生了注入
* f12打开开发者模式 删除文章
* 
* 这里看到请求地址是/article/delete 请求载荷是23 符合上面的delete的路由地址,并且articelld符合上面的值所以这里有sql注入
* 
* 
10. 把删除文章这里的流量包复制到本地文件进行抓包丢进sqlmap测试
* 
11. 发现这里有注入点
* 
## Java安全-XXE注入-Reader&Builder
XXE ( XML External Entity Injection ), XML外部实体注入,当开发人员配置其XML解析功能允许外部实体引用时,攻击者可利用这一可引发安全问题的配置方式,实施任意文件读取、内网端口探测、命令执行、拒绝服务等攻击。
XML(可扩展标记语言)是一种用于表示和传输结构化数据的标记语言。它被设计成具有可读性强且可扩展的特点,常用于在不同系统之间进行数据交换和存储。
XML使用标签来描述数据的结构和含义。每个XML文档都由标签和内容构成,标签用于标识数据的元素,而内容则是元素的具体值或子元素。标签可以嵌套,形成层次结构,以便表示复杂的数据关系.
在代码审计时需要审计这些XML处理函数,这是一些与XML处理相关的类和接口的列表。它们通常在编程语言中的XML解析库或API中使用,用于读取、解析、转换和处理XML数据。
**黑盒测试**
详情参考这个黑盒测试:https://blog.csdn.net/m0_51345235/article/details/131503666
**白盒—审计函数**
- 判断是否开启XML外部实体解析
- 全局搜索关键类的名字,看看有没有参数可控
XMLReader:用于顺序读取XML文档的内容,并提供了一种基于事件的方式来处理XML数据。
SAXReader:一种用于读取和解析XML文档的SAX(Simple API for XML)解析器。
DocumentBuilder:用于创建DOM(Document Object Model)对象的接口,可以将XML文档加载到内存中进行操作。
XMLStreamReader:一种用于读取和解析XML文档的StAX(Streaming API for XML)解析器。
SAXBuilder:用于构建SAX解析器的类,用于读取和解析XML文档。
SAXParser:一种用于解析XML文档的SAX解析器。
SAXSource:用于将SAX事件作为输入源的对象,可以用于将SAX解析器与其他处理器(如XSLT转换器)进行连接。
TransformerFactory:用于创建Transformer对象的工厂类,可以将XML文档进行转换、处理和生成。
SAXTransformerFactory:用于创建SAXTransformerHandler对象的工厂类,可以在SAX事件处理期间进行XML转换和处理。
SchemaFactory:用于创建XML Schema验证器的工厂类,可以用于验证XML文档的结构和内容。
Unmarshaller:用于将XML文档解组为Java对象的接口,通常与Java的XML绑定技术(如JAXB)一起使用。
XPathExpression:用于执行XPath查询的接口,可以在XML文档中查找和选择特定的元素和属性。
## Java安全-SSTI模版-Thymeleaf&URL
SSTI(Server Side Template Injection) 服务器模板注入, **服务端 **将用户输入直接作为模板内容或模板变量渲染**,但没有做好过滤和控制,导致用户可以构造恶意表达式,从而执行危险操作**
1. URL作视图
2. Thymeleaf
3. Velocity
**常见模板引擎有:**
- Python:Jinja2、Tornado、Mako
- Java:FreeMarker、Velocity、Thymeleaf
- PHP:Smarty、Twig
- Node.js:EJS、Pug
其他语言参考:https://www.cnblogs.com/bmjoker/p/13508538.html
有时间学学正则表达式;https://www.jyshare.com/front-end/854/
1. **URL作视图**
* > 原理: 根据spring boot定义,如果controller无返回值,则以GetMapping的路由为视图名称,即将请求的url作为视图名称,调用模板引擎去解析,在这种情况下,我们只要可以控制请求的controller的参数,一样可以造成RCE漏洞
* ```
* payload: __${T(java.lang.Runtime).getRuntime().exec("calc")}__::.x* ``` @GetMapping("/thymeleaf/vul") public String thymeleafVul(@RequestParam String lang) { // 模版文件参数可控 return "lang/" + lang; }1
2
3
4
5
6
7
* <img src="/img/image-20250627220213557.png" alt="image-20250627220213557" style="zoom:50%;" />
2. ##### thymeleaf模版注入
* ```
payload:__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%27calc%27).getInputStream()).next()%7d__::.x
1 |
|
- 问题:
render_template_string()是 Jinja2 的方法,用户输入直接进模板,会造成注入。
Java安全-SPEL表达式注入-SpringBoot框架
SpEL ( Spring Expression Language )表达式注入 , 是一种功能强大的表达式语言、用于在运行时查询和操作对象图,由于未对参数做过滤可造成任意命令执行。
Spring表达式
Spring反射绕过
Spring表达式
漏洞原理:参数可控,standarEvaluationContext包含上下文对象,可以提供对象,函数,类等信息给Spel表达式,getValue()执行表达式,类似于php里面的eval
// PoC: T(java.lang.Runtime).getRuntime().exec(%22open%20-a%20Calculator%22)1
2
3
4
5
6
7
8
9
10
11
12
13
* ```
public String vul(String ex) {
ExpressionParser parser = new SpelExpressionParser();
// StandardEvaluationContext权限过大,可以执行任意代码,默认使用
EvaluationContext evaluationContext = new StandardEvaluationContext();
Expression exp = parser.parseExpression(ex);
String result = exp.getValue(evaluationContext).toString();
return result;
}

Spring反射绕过(黑名单过滤)
黑盒测试的判断步骤
寻找疑似 SpEL 处理点
- 在表单、接口、URL 参数中输入一些测试表达式,看返回内容或行为是否异常
- 常见可疑功能包括:
- 自定义规则表达式设置
- 动态配置、模板变量填充
- 使用
@Value()、Spring Security EL 的功能
- 常见可疑功能包括:
- 在表单、接口、URL 参数中输入一些测试表达式,看返回内容或行为是否异常
使用探针 payload 检测漏洞
检测型 payload(看是否被执行)
#{233+1} → 看返回结果里有没有 234 ${233+1} → 某些也兼容1
2
3
4
5
6
7
8
* 如果输出 `234`,基本可以确认存在 SpEL 执行点。
3. **尝试读取对象属性**
* ```
#{T(java.lang.System).getProperty('os.name')} → 输出系统名称
#{T(java.lang.Runtime).getRuntime()} → 输出 runtime 对象
尝试命令执行
#{T(java.lang.Runtime).getRuntime().exec('calc')} #{T(java.lang.Runtime).getRuntime().exec('whoami')}1
2
3
4
5
* 有时输出看不到,但可以通过“延时”判断是否执行成功,如:
* ```
#{T(java.lang.Thread).sleep(5000)} → 页面卡顿 5 秒钟
Java安全学习路线:BV1Sv4y1i7jf













