所以我正在尝试在本地托管的网页上练习 SQL 注入(inject)。我是 SQL 的新手,尤其是 SQL 注入(inject)。我已经对将新条目注入(inject)表进行了一些研究,但是当我尝试执行时,它似乎不起作用。
首先,我的网页是一个登录。我有用户名和密码(很明显)并且可以在没有附加任何 SQL 注入(inject)的情况下登录。但是当我将注入(inject)代码添加到用户名框中时,它不起作用。
示例:
username: admin'; insert into hall values (3,'https://google.com','Google'); --
password: 123321
在我的大厅表中,我有 3 个条目:id、链接、目的地。
ID 是一个整数,链接和目标是 varchars。
我需要做什么才能成功地将此条目注入(inject)并添加到数据库中?是否需要输入正确的用户名和密码,只输入用户名,还是其他?
不,您不需要输入正确的用户名和密码。以下是步骤:
首先,确保您在 PHP 中使用内联查询。像这样:
sql = "SELECT * FROM accounts WHERE username = '$username' AND password = '$password'";
其次,确保 $username
和 $password
变量直接从用户名和密码文本框中获取它们的值。
现在您可以通过在用户名文本框中输入任何值并在密码文本框中输入如下内容来测试 SQL 注入(inject)攻击:
x';delete from accounts where '0'='0
这将从您的accounts
表中删除所有记录。如果您想测试更多,可以输入任何其他 SQL。
编辑 只是为了解决一些观点,即只要您使用参数化查询,就不需要了解 SQL 注入(inject)的工作原理。
这是我在其他主题中看到的一个真实问题。了解事物的工作原理对于任何“优秀”的程序员来说都是绝对必要的。仅仅知道应该如何做事是不够的,如果您不知道为什么要那样做以及它们是如何工作的,那么您就不能成为一名“优秀”的程序员。所以是的,了解 SQL 注入(inject)、XSS、CSRF 等攻击的工作原理对于任何有经验的程序员来说都是必须的。
看到所有那些有经验的程序员告诉新手他们并不真的需要理解,这真的很可悲。为什么?他们想成为唯一知道的人吗?他们认为其他人不够聪明吗?我不知道,但这至少可以说不是 StackOverflow 的精神,因此我认为应该标记并删除此类声明。
此外,参数化查询并不能阻止所有类型的 SQL 注入(inject),因为并非所有内容都可以参数化(例如,列和表名、值数组等),但是通过了解 SQL 注入(inject)的工作原理,您就会知道在这些情况下该怎么做。以此查询为例:
SELECT * FROM students WHERE status IN(,,,,)
如果数组具有已知数量的值,那么您可以将它们作为参数发送,但如果您确实必须具有未知数量的值,那么您需要知道如何保护您的查询。除非您了解您面临的是什么,否则您无法保护您的查询。在这种情况下,您可以在循环中创建参数,但您必须知道如何正确执行此操作。
这是一个question on SO在这个问题上有很好的答案。