测试 SQL 注入的正确方法

Posted

技术标签:

【中文标题】测试 SQL 注入的正确方法【英文标题】:correct method of testing for SQL Injections 【发布时间】:2012-05-27 06:33:56 【问题描述】:

您好,我正在开发一个网站并进行一些渗透测试。它是用 Cakephp 构建的,这让我意识到:

如果你使用 CakePHP 已经保护你免受 SQL 注入 CakePHP 的 ORM 方法(例如 find() 和 save())和适当的数组 表示法(即。array('field' => $value))而不是原始 SQL。

但是我不确定要在我的输入表单字段中输入哪些数据以测试 SQL 注入预防。

我有以下带有简单 VARCHAR 属性的表名 -

 categories: name
 clients: address, county, country, name
 items: name
 statuses: name

将这个 SQL 语句输入到表单并提交是测试 SQL 注入尝试的正确方法吗?

DROP TABLE "categories";

在表单上提交后,进入数据库的值为:

DROP TABLE "categories"; 

我是否可以假设这意味着该网站已被保护免受 SQL 注入尝试,因为它没有删除我数据库中的类别表?

【问题讨论】:

您是否遵循指南并专门使用 ORM 方法?如果是这样,那么请查看其他问题,例如保护对应用程序和数据库的访问、正确转义输出、会话劫持、使用 SSL 保护敏感页面以及缓解暴力密码攻击。 这本书稍微面向 SQL Server,但对于它所呈现的概念和想法来说,这始终是一本不错的读物:sommarskog.se/dynamic_sql.html#SQL_injection 【参考方案1】:

当您的代码未使用参数化查询时发生 SQL 注入攻击。How can I test my web site for SQL injection attacks? 中的 SQL 注入工具。

【讨论】:

【参考方案2】:

好问题,但答案太多,无法作为答案。我建议进行一些搜索并阅读许多出现的网站以了解更多信息。

这里有很好的工具列表:http://www.darknet.org.uk/tag/sql-injection-tool/

【讨论】:

【参考方案3】:

请记住,几乎所有自动 sql 注入扫描工具都只能找到最简单的漏洞形式,而错过了该问题的大多数实际实例。

受过良好教育和经验丰富的人类攻击者/测试者总是会做得更好,并且会发现大量工具无法解决的 sqli 问题。

但是... SQL 注入是最容易修复的 webapp 漏洞之一。因此,如果您可以访问源代码,只需阅读它并确保它正确使用绑定参数或存储过程,并且永远不要通过将字符串附加在一起来构建 SQL 命令。如果你看到类似

sql = 'select col from table where x=' + variable

然后警钟应该响起。 阅读和调整源代码几乎肯定会比尝试执行需要多年经验才能掌握的那种测试更快、更容易、更有效。

见https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

【讨论】:

以上是关于测试 SQL 注入的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

SQL注入攻击的常见方式及测试方法

安全测试 - SQL注入

SQL注入的测试方法

SQL注入测试平台 SQLol -5.DELETE注入测试

SQL注入测试平台 SQLol -3.INSERT注入测试

SQL注入漏洞的自动化测试:输入变异方法