SQL注入——将数据插入表中

Dyl*_*lan 0 php mysql sql sql-injection

因此,我尝试在本地托管的网页上练习 SQL 注入。我对 SQL 很陌生,尤其是 SQL 注入。我已经做了一些研究,将新条目注入表中,但是当我尝试执行时,它似乎不起作用。

首先,我的网页是登录的。我有用户名和密码(显然)并且可以在不附加任何 SQL 注入的情况下登录。但是当我将注入代码添加到用户名框中时,它不起作用。例子:

    username: admin'; insert into hall values (3,'https://google.com','Google'); --
    password: 123321
Run Code Online (Sandbox Code Playgroud)

在我的大厅表中,有 3 个条目:id、链接、目的地。ID 是一个整数,链接和目标是 varchars。

我需要做什么才能成功注入并将此条目添加到数据库中?是需要输入正确的用户名和密码,还是只输入用户名,还是其他什么?

Rac*_*lan 5

不,您不需要输入正确的用户名和密码。步骤如下:

首先,确保您在 PHP 中使用内联查询。像这样的东西:

sql = "SELECT * FROM accounts WHERE username = '$username' AND password = '$password'";
Run Code Online (Sandbox Code Playgroud)

其次,确保$username$password变量直接从用户名和密码文本框中获取其值。

现在,您可以通过在用户名文本框中输入任意值并在密码文本框中输入类似的内容来测试 SQL 注入攻击:

x';delete from accounts where '0'='0
Run Code Online (Sandbox Code Playgroud)

这将从您的表中删除所有记录accounts。如果您想测试更多,您可以输入任何其他 SQL。

编辑只是为了解决一些观点,即只要使用参数化查询,就不需要了解 SQL 注入的工作原理。

这是我在其他主题中看到的一个真实问题。对于任何“优秀”程序员来说,了解事物的工作原理是绝对必要的。仅仅知道应该如何做事是不够的,如果你不知道为什么要这样做以及它们是如何工作的,那么你就不可能成为一个“好的”程序员。所以,是的,对于任何有经验的程序员来说,了解 SQL 注入、XSS、CSRF 等攻击的工作原理是必须的。

看到所有经验丰富的程序员告诉新手他们并不真正需要理解,真是令人难过。为什么?他们想成为唯一知道的人吗?他们认为别人不够聪明吗?我不知道,但至少可以说,这不是 StackOverflow 的精神,因此我认为应该标记并删除此类语句。

此外,参数化查询并不能阻止所有类型的 SQL 注入,因为并非所有内容都可以参数化(例如,列和表名称、值数组等),但通过了解 SQL 注入的工作原理,您就会知道该怎么做在那些情况下。以此查询为例:

SELECT * FROM students WHERE status IN(,,,,)
Run Code Online (Sandbox Code Playgroud)

如果数组具有已知数量的值,那么您可以将它们作为参数发送,但如果您确实必须具有未知数量的值,那么您需要知道如何保护您的查询。除非您了解自己面临的问题,否则您无法保护您的查询。在这种情况下,您可以在循环中创建参数,但您必须知道如何正确执行。

这是一个关于 SO 的问题,对此主题有很好的答案。