样本跟踪结果

以下样本跟踪结果显示了包含 SQL 注入漏洞的应用程序区域中受污染数据的流向。

在此样本中扫描的代码无法验证或清除源自不受信任来源的数据,从而使攻击者可以将应用程序的数据库作为目标。

在此样本跟踪中,doPost Servlet 方法调用 request.getParameter。此方法从 HTTP POST 主体读取不受信任的数据(用户名),但是它不检查数据的有效性,也不会对数据进行清理。然后,将此未经验证或感染的数据传递到 changePassword 方法。此方法最终将受感染的数据传递到 statement.execute 方法,在该方法中可以利用此漏洞。

跟踪包括以下信息:
  • request.getParameter("username") 标记为源 ()。它的返回值是不受信任的数据的来源。
  • statement.execute( ) 将其第一个参数标记为接收器 (),因为受感染数据(包含恶意 SQL 命令)可传递到 sql 参数,而不经过验证或清理。
  • string.Builder( ).append( ) 被标记为感染传播器 (),因为它充当将感染数据从一个点(第一个参数)传递到另一个点(返回值)的管道。
  • 受污染的数据流采用红色标记。感染从 request.getParameter 开始并将受感染的数据传递到 username 变量。然后,数据通过感染传播器传递,直至将其附加到 SQL 语句并采用 statement.execute 方法执行。
  • 跟踪中的每个节点都提供发生跟踪的代码中的行号,以及感兴趣的代码段。例如,源 () 出现在第 90 行。
  • 跟踪左侧的蓝色条表示可以实施修复程序以消除安全漏洞的位置。在此示例中,应在将受污染的数据附加到 SQL 语句的接收器附近添加数据验证和/或清理。更好的解决方案是将 SQL 查询作为准备好的语句正确执行。
  • 在此示例中,左侧的深蓝色条突出显示跟踪多个问题的常见方法。这称为修订组,表示代码中的某个位置,如果确定了该位置,则可以解决多个问题。因此,应首先调查修订组。在此跟踪示例中,应针对此特定问题调查调用 append ( ) 的位置。
    在扫描报告中,如果可能,按修订组列出问题。在每个修订组中,首先列出问题类型,然后列出每种类型的单个问题以及每个问题的跟踪。共有两种修复建议:
    • 如果修复适用于作为应用程序代码的一部分的方法,则修复代码的实现
    • 如果修复适用于调用第三方代码的位置,则修复代码的用法