因此,我尝试在本地托管的网页上练习SQL注入。我对SQL很陌生,尤其是SQL注入。我已经做了一些关于向表中注入新条目的研究,但是当我尝试执行时,它似乎不起作用。
首先,我的网页是一个登录。我有用户名和密码(很明显),可以登录而不附加任何SQL注入。但是当我将注入代码添加到用户名框中时,它就不起作用了。示例:
username: admin'; insert into hall values (3,'https://google.com','Google'); --
password: 123321在我的大厅桌子上,我有三个条目: id,链接,目的地。ID是整数,链接和目标是varchars。
要成功地注入该条目并将其添加到数据库中,我需要做什么?我是否需要输入正确的用户名和密码,只输入用户名或其他东西?
发布于 2018-02-04 07:20:28
不,您不需要输入正确的用户名和密码。以下是几个步骤:
首先,确保在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。
https://stackoverflow.com/questions/48605579
复制相似问题