2012-04-23 120 views
15

我在阅读有关sql注入的信息,并且我知道它是如何工作的,如果有一个表单,用户可以输入他的用户名和登录名。我没有得到的是如何没有登录页面的网站可能容易受到sql注入。测试一个网站是否易受Sql注入攻击

http://thecybersaviours.com/how-to-find-out-if-a-website-is-vulnerable-to-sql-injection

它说只是追加一个 '或 ''=' 来检验。我不明白这是如何帮助确定是否存在错误。查询在哪里构建?

+2

如果用户的条目传递给SQL命令,则任何文本框或用户可以输入并输入数据的任何页面上的输入都可以进行SQL注入。 – DOK 2012-04-23 13:24:08

+0

可能的重复[什么是SQL注入?](http://stackoverflow.com/questions/601300/what-is-sql-injection) – CanSpice 2012-04-23 22:28:59

回答

16

SQL注入是尝试通过网站界面向数据库发出SQL命令以获取其他信息。即,该信息存储数据库信息,例如用户名和密码。

确保附加到数据库实例的任何脚本或页面的首要规则是不要相信用户输入

您的示例正试图在SQL语句中结束错误引用的字符串。要了解这一点,你首先需要understand SQL statements。在您添加'到paramater的例子,你的“注射”希望为以下类型的语句:从用户

SELECT用户名,密码其中username =“$用户名”

通过追加'这一声明,然后你可以添加额外的SQL PARAMATERS或查询:' OR username --

SELECT用户名,密码从用户其中username = '' 或用户名 - “$用户名

是一种注射剂(一种;查询重塑)。用户输入变为注入语句到预先写入的SQL语句中。

通常有三种类型的SQL注入方法:

  • 查询重塑或重定向(以上)
  • 错误消息基于(没有这样的用户/口令)
  • 盲注射

阅读SQL Injection,How to test for vulnerabilities,understanding and overcoming SQL injection,和这个问题(和相关的)在StackOverflow about avoiding injections

编辑:

至于测试您的网站SQL注入,了解它获得的不仅仅是更复杂的“追加一个符号”。如果您的网站很关键,并且您(或您的公司)可以负担得起,请聘请专业笔测试人员。如果没有,this great exaxmple/proof可以显示一些可用于执行注射测试的常用技术。还有SQLMap可以自动化SQL注入和数据库接管场景的一些测试。

2

来自客户端的任何输入都是易受攻击的方式。包括所有表单和查询字符串。这包括所有的HTTP动词。

有第三方解决方案可以抓取应用程序并检测何时会发生注射。

0

测试必须在查询数据库的页面上完成,所以通常是登录页面,因为它是可以造成最大伤害的页面,但也可能是不安全的页面。

通常情况下,您会在安全登录后面进行数据库查询,但是如果您只是列出项目或您不在乎世界是否看到黑客可能会在查询字符串的末尾附加一些sql注入。

SQL注入的关键是进行注入的人必须知道你的查询数据库,所以如果你不查询数据库,那么没有SQL注入可以完成。如果你的表单提交给数据库,那么是的,他们可以SQL注入。使用任一存储过程来选择/插入/更新/删除或确保您准备或退出将触及数据库的所有语句总是很好的做法。

1

登录页面不是与数据库交互的数据库驱动网站的唯一部分。

用于构建数据库查询的任何用户可编辑输入都是SQL注入攻击的潜在入口点。攻击者可能不一定通过此攻击以管理员身份登录该网站,但可以执行其他操作。他们可以根据应用程序与数据库交互的性质更改数据,更改服务器设置等。

'附加到输入通常是一个很好的测试,以查看它是否生成错误或以其他方式在网站上产生意外的行为。这表明用户输入正在用于构建原始查询,而开发人员不希望引用单引号,这会改变查询结构。

请记住,一个页面可能对SQL注入是安全的,而另一个页面可能不是。例如,登录页面可能会针对此类攻击加强。但该网站其他页面的其他页面可能会广泛公开。因此,例如,如果有人想以管理员身份登录,那么可以使用其他页面上的SQL注入来更改管理员密码。然后返回完美的非SQL注入登录页面并以管理员身份登录。

0

保护自己的最简单方法是使用存储过程而不是内联SQL语句。

然后使用“最小权限”权限,只允许访问存储过程,而不是直接访问表。

+0

**注意:**使用存储过程的行为本身不是* *防止SQL注入。人们仍然需要了解自己在做什么。 http://publicvoidlife.blogspot.com/2012/01/stored-procedures-and-sql-injection.html – David 2012-04-23 13:28:28

+0

你是对的。使用存储过程可以保护您免受SQL注入攻击,因为他们知道如何使用它们。 但是我们可以对其他所有方面都这样说。 SQL服务器安全性工作,当DBA知道他在做什么。 或者,如果开发人员在错误消息中显示连接字符串,那么列表会继续,另外一个。 我想我想说的是,预计最低等级的经验或人才。 – 2012-04-23 13:56:40

+0

确实。我只是想避免新手用户(如OP)对某个陈述的错误含义可能会失控的误解。让这个世界变得更美好:) – David 2012-04-23 13:59:57

3

SQL注入可以在用户可以影响的任何输入上完成,但在查询中使用之前不会正确转义。

一个例子是一个GET变量是这样的:

http//www.example.com/user.php?userid=5 

现在,如果伴随的PHP代码是这样的:

$query = "SELECT username, password FROM users WHERE userid=" . $_GET['userid']; 
// ... 

您可以轻松地在这里使用SQL注入太:

http//www.example.com/user.php?userid=5 AND 1=2 UNION SELECT password,username FROM users WHERE usertype='admin' 

(当然,空格将不得不被替换为%20,但是这更可读。此外,这只是一个做出更多假设的例子,但这个想法应该很清楚。)