来自“Bobby Tables”XKCD漫画的SQL注入是如何工作的?
只是看着:
(来源: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?