变量:存储和追踪审计结果
在进行代码审计和安全分析的过程中,审计中间结果的暂存是提升分析效率和准确性的重要手段。SyntaxFlow 提供了强大的功能,使得审计员能够将审计过程中捕获的中间结果存储为变量,方便后续的引用和进一步分析。本节将详细介绍如何在 SyntaxFlow 中审计中间变量的暂存,包括语法定义、使用方法、实际案例以及其重要性。
审计中间结果暂存简介
在复杂的代码审计过程中,审计员往往需要追踪和分析多个步骤中的中间结果。通过将这些中间结果暂存为变量,可以大大简化分析过程,提高审计规则的灵活性和可维护性。SyntaxFlow 提供了使用 as
关键字将审计结果存储为变量的功能,允许用户在审计表达式中引用这些变量进行进一步的分析和过滤。
语法结构
在 SyntaxFlow 中,审计中间结果的暂存基于以下两种基本的表达式:
RefFilterExpr
filterStatement
: refVariable filterItem* (As refVariable)? # RefFilterExpr
| filterExpr (As refVariable)? # PureFilterExpr
;
- 形式:
refVariable filterItem* (as refVariable)?
- 描述: 这种形式允许从一个引用变量开始,经过一系列的过滤操作,最终可选地将结果再次存储到新的引用变量中。
PureFilterExpr
filterStatement
: refVariable filterItem* (As refVariable)? # RefFilterExpr
| filterExpr (As refVariable)? # PureFilterExpr
;
- 形式:
filterExpr (as refVariable)?
- 描述: 这种形式直接从一个过滤表达式开始,并可选地将结果存储到一个引用变量中。
使用 as
关键字
as
关键字用于将某个过滤表达式或操作的结果存储到一个变量中,便于后续的引用和操作。这在处理复杂的数据流或多步骤的代码审计中尤为重要。
语法定义
filterStatement
: refVariable filterItem* (As refVariable)? # RefFilterExpr
| filterExpr (As refVariable)? # PureFilterExpr
;
refVariable
: 用于引用已存储的变量。filterItem
: 包含过滤操作,如函数调用、方法链等。As refVariable
: 可选部分,将当前表达式的结果存储到指定的变量中。
示例说明
示例 1:捕获函数调用参数
假设我们需要追踪函 数 parse
被调用时传递的参数,并希望进一步分析这些参数。
查询示例:
.parse(* as $params);
解释:
*
:匹配parse
方法的所有参数。as $params
:将匹配到的参数存储到变量$params
中,便于后续引用和分析。
示例 2:追踪数据库查询语句
假设需要审计数据库查询函数 executeQuery
的参数,以检测可能的 SQL 注入风险。
查询示例:
.createStatement().executeQuery(* as $sql);
解释:
.createStatement()
:定位创建数据库语句的调用。.executeQuery(* as $sql)
:捕获executeQuery
方法的所有参数,并将其存储到变量$sql
中。
实战应用
案例 1:审计敏感函数的多步骤调用
目标:审计 DocumentBuilderFactory
的配置和使用,确保 XML 解析器的安全配置,以防止 XXE 攻击。
解析步骤: