渗透测试步骤

(1)提交一个单引号作为目标查询的数据。观察是否会造成错误,或结果是否与原始结果不同。如果收到详细的错误消息,可查阅9.2.13节了解该消息的含义。

(2)如果发现错误或其他异常行为,同时提交两个单引号,看会出现什么情况。数据库使用两个单引号作为转义序列,表示一个原义单引号(literal single quote),因此这个序列被解释成引用字符串中的数据,而不是结束字符串的终止符。如果这个输入导致错误或异常行为消失,则应用程序可能易于受SQL注入攻击。

(3)为进一步核实漏洞是否存在,可以使用SQL连接符建立一个等同于“良性”输入的字符串。如果应用程序以与处理对应“良性”输入相同的方式处理专门设计的输入,那么它很可能易于受到攻击。每种数据库使用的字符连接方法各不相同。在易受攻击的应用程序中,可以注入以下实例构建等同于FOO的输入:

img002 Oracle ‘||’FOO

img002 MS-SQL:‘+’FOO

img002 MySQL:‘ ’FOO [注意两个引号之间有一个空格]

img004  提示  可以通过在特定的参数中提交SQL通配符%来确定应用程序是否正与后端数据库交互。例如,在搜索字段中提交这个通配符通常会返回大量结果,表明输入正被传送到SQL查询中。当然,这不一定表示应用程序易受攻击——只是应该深入探查以确定是否存在任何具体的漏洞。

img004  提示  使用单引号查找SQL注入漏洞时,应特别注意浏览器处理返回的页面时发生的任何JavaScript错误。应用程序经常在JavaScript中返回用户提交的输入,原义单引号将导致JavaScript解释器中出现错误。如第12章所述,在响应中注入任意JavaScript将导致跨站点脚本攻击。

2.注入数字数据

如果SQL查询合并用户提交的数字数据,应用程序仍然会将它包含在单引号之中,作为字符串数据进行处理。因此,一定要执行前面描述的针对字符串数据的渗透测试步骤。但是,许多时候,应用程序会将数字数据以数字格式直接传送到数据库中,并不把它放入单引号中。如果前面描述的测试方法无法检测到漏洞,还可以采取以下针对数字数据的特殊测试步骤。