20

我正在阅读有关 sql 注入的信息,如果有一个用户可以输入他的用户名和登录的表单,我了解它是如何工作的。我不明白的是没有登录页面的网站如何容易受到 sql 注入的攻击。

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

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

4

6 回答 6

21

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

保护附加到数据库实例的任何脚本或页面的第一条规则是不信任用户输入

您的示例试图在 SQL 语句中结束错误引用的字符串。要理解这一点,首先需要了解 SQL 语句。在您将 a 添加'到参数的示例中,您的“注入”希望使用以下类型的语句:

SELECT username,password FROM users WHERE username='$username'

通过将 a 附加'到该语句,您可以添加其他 SQL 参数或查询。:' OR username --

SELECT username,password FROM users WHERE username='' OR username -- '$username

是一种注入(一种类型;查询重塑)。用户输入成为预先编写的 SQL 语句中的注入语句。

SQL注入方式一般分为三种:

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

阅读SQL 注入如何测试漏洞理解和克服 SQL 注入,以及 StackOverflow 上关于避免注入的这个问题(和相关问题)。

编辑:

至于测试您的站点以进行 SQL 注入,请理解它比“附加符号”要复杂得多。如果您的网站很重要,并且您(或您的公司)负担得起,请聘请专业的渗透测试员。如果做不到这一点,这个伟大的例子/证明可以向您展示一些可能用于执行注入测试的常用技术。还有SQLMap可以自动化一些 SQL 注入和数据库接管场景的测试。

于 2012-04-23T13:35:24.573 回答
5

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,但这更具可读性。此外,这只是一个做出更多假设的示例,但想法应该很清楚。)

于 2012-04-23T13:28:35.153 回答
2

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

有 3rd 方解决方案可以抓取应用程序并检测何时可能发生注入。

于 2012-04-23T13:23:49.700 回答
1

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

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

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

请记住,一个页面可能对 SQL 注入是安全的,而另一页面可能不是。例如,登录页面可能会针对此类攻击进行强化。但是网站其他地方的不同页面可能是敞开的。因此,例如,如果想以管理员身份登录,则可以使用其他页面上的 SQL 注入来更改管理员密码。然后返回完全不可注入 SQL 的登录页面并以管理员身份登录。

于 2012-04-23T13:24:51.977 回答
0

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

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

SQL 注入的关键是进行注入的人必须知道您正在查询数据库,因此如果您不查询数据库,则无法进行 sql 注入。如果您的表单正在提交到数据库,那么是的,他们可以进行 SQL 注入。使用存储过程来选择/插入/更新/删除或确保准备或转义所有将访问数据库的语句始终是一个好习惯。

于 2012-04-23T13:24:25.557 回答
0

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

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

于 2012-04-23T13:26:22.127 回答