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