Skip to content

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站点代码审计

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 快速代码审计工具