4. 代码审计
4.1 Java代码审计
SQL注入(MyBatis)
order by ${time}/LIKE '%${stuName}%'/in (${id})/ 直接调用语句- OGNL注入:
${@java.lang.Runtime@getRuntime().exec("whoami")}→ OgnlCache.getValue → parseExpression - 参考: OGNL Language Guide / 泛微e-mobile OGNL注入
反序列化
- fastjson(确定有CC链) / shiro / log4j / JasperReports
- 核心: 根据依赖版本确定链子 → 知道原理 + 有POC + 能改POC(链子)
SSTI(Thymeleaf)
- SPEL表达式执行
- 前提: 表达式无过滤 + getValue/setValue + StandardEvaluationContext(默认)
- Payload:
__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("calc.exe").getInputStream()).next()%7d__::.x
组件弱口令/未授权
- Druid(未授权+RCE) / swagger-ui / xxl-job
过滤器缺陷
- 目录穿越→越权 / XSS / 黑白盒结合跑未授权接口(简单分析状态码)
登录绕过
- 路径穿越:
GET /api/admin/login/../../../api/userBill/export - Secret硬编码: 查看token/cookie生成方法→伪造
- 伪随机(种子相同→预测): JumpServer漏洞分析 → django-simple-captcha seed问题
未授权/可控权限接口
- 上传 / 注入(MyBatis注入参考) / XXE(RCE? → file/ftp/mailto/http/https/jar/netdoc) / 文件操作 / SSRF
粗糙WAF绕过
- 通常在filter → 规则不严绕WAF / 找不在filter规则内的接口
4.2 Java反序列化基础
ClassLoader体系: BootStrap(rt.jar→java.lang/java.io) → ExtClassLoader(PlatformClassLoader) → AppClassLoader(URLClassLoader)
- 双亲委派: loadClass / findClass / findLoadedClass / defineClass(传入字节码→JVM加载) / resolveClass
- 打破双亲委派: 自定义ClassLoader重写loadClass方法
- BCEL ClassLoader: com.sun.org.apache.bcel(JDK<8u251 rt.jar) → $$BCEL$$编码→decode→Parser→defineClass加载
- Tomcat7: org.apache.tomcat.dbcp.dbcp.BasicDataSource
- Tomcat8+: org.apache.tomcat.dbcp.dbcp2.BasicDataSource
命令执行链: TransformerChain → newTransformer/getOutputProperties → defineTransletClasses → _bytecodes字段bytecode → defineClass → newInstance → static块/无参构造
序列化特征: 0xACED005
4.3 PHP代码审计
TP架构: runtime(网页缓存Cache::set/session/log→session id) / application(项目源码) / thinkphp(框架源码) / vendor(composer扩展) / extend(手动第三方库)
TP路由模式:
- TP3: URL_MODEL(0普通/1PATHINFO/2REWRITE/3兼容)
- TP6: 基于pathinfo和兼容模式,Route::get/rule/xxx配置
注入点详表: | 方法 | 版本 | 漏洞 | |------|------|------| | parseKey(count/max) | 5.0.0/5.0.23/TP3 | 未过滤 | | _parseOptions(PDO) | TP3 | 直接拼接 | | parseWhereItem(bind) | TP≤3.2.4 | 直接拼接 | | parseWhereItem(between) | TP 3.1.-3.2.0 | 直接拼接 | | parseWhereItem(eq/neq/gt) | TP 3.2. | 直接拼接 | | parseData(parseKey) | 5.0.13-5.0.15(inc/dec), 5.1.0-5.1.5(exp/inc/dec) | 未过滤 | | 投注/签到/大转盘 | - | 业务场景注入点 |
RCE完整链: - Request::__construct变量覆盖+Request::input代码执行(TP 5.0.0-5.0.23) - trace+强制路由 / debug+url_route_on / $dispatch['method'] - $dispatch['module']反射调用任意类(TP 5.0.0-5.0.23, 5.1.0-5.1.30) - Windows::__destruct任意文件删除 - LoadLangPack多语言RCE(TP 6.0.1-6.0.13) → pearcmd文件包含 - View::assign()模板变量覆盖+文件包含(TP 3.2.*, 5.0.0-5.0.18, 5.1.0-5.1.10)
鉴权机制: Route动态参数 / 鉴权中间件(路由白名单) / beforeAction/afterAction / 验证码 / auth类/RBAC第三方库
文件操作: file_get_contents(任意文件读/SSRF) / curl / php://input(/etc/passwd) / extends鉴权类(没有→未授权但需路由可访达) / is_dir/unlink(phar反序列化→CI4 / unlink删除lock文件鸡肋)
文件上传: 临时文件(条件竞争) / 后缀名判定 / phpinfo写文件
XSS: htmlspecialchars默认不转义单引号 / 多次编码转换 / XSS打后台(银行卡/xss接收平台)
4.4 .NET站点代码审计
- 参考: .NET内存马
4.5 Java内存马
- 加载过程: Tomcat架构 / 加载安全机制
- 广泛性 / 反射和shell的区别
4.6 商业加密PHP代码/IoT设备PHP管理页面
- Hook PHP DLL函数dump明文
- 内存dump明文
4.7 Java反编译工具
| 工具 | 地址 |
|---|---|
| javadecompilers.com | http://www.javadecompilers.com/ |
| decompiler.com | http://www.decompiler.com/ |
| devtoolzone | https://devtoolzone.com/decompiler/java |
| jdec | https://jdec.herokuapp.com/ |
| mobilefish | https://www.mobilefish.com/services/java_decompiler/java_decompiler.php |
| javare.cn | http://javare.cn/ |
4.8 快速代码审计工具
- CodeReviewTools - 快速找关键字
- code-inspector
- jar-analyzer
- RouteCheck-Alpha
- APT_REPORT - APT报告收集
- Doge-DNSptr
- knife