已经看到,安全测试人员输入 ' 或 ; 进入应用程序入口点以测试 SQL 注入。为什么使用这些字符?
为什么测试人员经常使用单引号 ( ' ) 来测试 SQL 注入?
使用字符'
是因为这是 SQL 中的字符限制器。使用'
您分隔字符串,因此您可以测试字符串是否在目标应用程序中正确转义。如果它们没有直接转义,您可以结束提供给应用程序的任何字符串并在此之后添加其他 SQL 代码。
该字符;
用于终止 SQL 语句。如果您可以将字符发送;
到应用程序并且它没有在字符串之外转义(见上文),那么您可以终止任何 SQL 语句并创建一个新的 SQL 语句,这会导致安全漏洞。
阅读Wikipedia 的 SQL 注入示例,特别是“错误过滤的转义字符”部分。
本质上,在注入中,您应该提供带有参数的现成命令。您以包含嵌入式命令的方式构建此参数,同时尊重 SQL 的语法。
由于命令通常是SELECT FROM / UPDATE WHERE FOO='<your entry point>'
,您可以使用nop'; Your own command here
. 两者的组合将给出两个语法上有效的命令序列,这两个命令都将被执行。
为了防止 SQL 注入,请通过验证所有不受信任的输入是否属于接受输入的白名单域(这里通常转义特殊字符)来验证所有不受信任的输入,并确保将命令组合委托给您使用的 DB API,而不是而不是自己做:使用不同的调用来提供命令和参数,这样您所依赖的 API 就可以进行额外的检查并避免您进一步尴尬!
测试人员试图找出他们发现的错误;他们并没有试图找到最后剩下的问题。
在大多数情况下,输入在通过编写良好的函数或使用参数传递到 SQL 之前进行检查。因此,即使是最基本的 SQL 注入类型也可能停止,那么对于给定的表单字段,所有类型的 SQL 注入都会停止。
因此,只需‘
在每个入口点添加一个快速简便的方法,即可为测试人员和测试人员的雇主带来很多好处。
(同样,很多测试人员会复制/粘贴很长的文本,即使没有用户会这样做,因为这是检查应用程序是否被编码以应对太长的输入的快速方法。)