来自“Bobby Tables”XKCD漫画的SQL注入是如何工作的?

只是看着:

XKCD Strip (来源:https://xkcd.com/327/)

这个SQL做什么:

Robert'); DROP TABLE STUDENTS; --

我知道'--都是为了评论,但是DROP这个词不会被评论,因为它是同一行的一部分?


它放弃学生表。

学校程序中的原始代码可能看起来像这样

q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";

这是将文本输入添加到查询中的天真方式,非常糟糕,正如您将看到的。

从名字,中间名文本框FNMName.Text(这是Robert'); DROP TABLE STUDENTS; -- Robert'); DROP TABLE STUDENTS; -- Robert'); DROP TABLE STUDENTS; -- )和姓氏文本框LName.Text(我们称之为Derper )与查询的其余部分连接在一起,结果现在实际上是由语句终结符(分号)分隔的两个查询。 第二个查询已被注入到第一个查询中。 当代码对数据库执行此查询时,它将如下所示

INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')

用简单的英语粗略地翻译为两个查询:

向名称值为'Robert'的学生表中添加一条新记录

删除学生表

过去第二个查询的所有内容都被标记为注释: --', 'Derper')

'在学生的名字中不是注释,而是字符串分隔符。 由于学生的姓名是一个字符串,因此需要从语法上完成假设的查询。 注入攻击仅在SQL查询注入结果为有效SQL时才有效。

按照dan04的精明评论再次编辑


假设这个名字被用在一个变量$Name 。 然后你运行这个查询:

INSERT INTO Students VALUES ( '$Name' )

你得到的是:

INSERT INTO Students VALUES ( 'Robert' );  DROP TABLE STUDENTS; --' )

--仅评论该行的其余部分。


正如其他人已经指出的那样, '); 关闭原来的声明,然后接下来的第二个声明。 大多数框架,包括PHP等语言,现在都有默认的安全设置,不允许在一个SQL字符串中使用多个语句。 例如,在PHP中,只能使用mysqli_multi_query函数在一个SQL字符串中运行多个语句。

但是,您可以通过SQL注入操作现有的SQL语句,而无需添加第二条语句。 比方说,你有一个登录系统,用这个简单的选择来检查用户名和密码:

$query="SELECT * FROM users WHERE username='" . $_REQUEST['user'] . "' and (password='".$_REQUEST['pass']."')";
$result=mysql_query($query);

如果您提供peter作为用户名和secret作为密码,则生成的SQL字符串将如下所示:

SELECT * FROM users WHERE username='peter' and (password='secret')

一切安好。 现在想象你提供这个字符串作为密码:

' OR '1'='1

然后生成的SQL字符串是这样的:

SELECT * FROM users WHERE username='peter' and (password='' OR '1'='1')

这将使您能够在不知道密码的情况下登录到任何帐户。 所以你不需要能够使用两条语句来使用SQL注入,但是如果你能够提供多条语句,你可以做更多破坏性的事情。

链接地址: http://www.djcxy.com/p/2731.html

上一篇: How does the SQL injection from the "Bobby Tables" XKCD comic work?

下一篇: Are PDO prepared statements sufficient to prevent SQL injection?