如何从“Bobby Tables”XKCD漫画中注入SQL?

这个SQL做了什么:

Robert'); DROP TABLE STUDENTS; --

我知道这两个'并且--是用于评论,但是这个词也没有DROP被评论,因为它是同一行的一部分?


慕的地10843
浏览 897回答 6
6回答

大话西游666

它放下了学生桌。学校计划中的原始代码可能看起来像q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";这是将文本输入添加到查询中的天真方式,非常糟糕,正如您将看到的那样。在第一个名称,中间名称文本框FNMName.Text(即Robert'); DROP TABLE STUDENTS; --)和最后一个名称文本框LName.Text(让我们调用它Derper)的值与查询的其余部分连接之后,结果现在实际上是由两个查询分隔的查询语句终止符(分号)。第二个查询已注入第一个查询。当代码对数据库执行此查询时,它将如下所示INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')用简单的英语粗略地翻译成两个查询:使用名称值“Robert”向Students表添加新记录和删除学生表超过第二个查询的所有内容都标记为注释: --', 'Derper')将'在学生的名字是不是一个评论,它的收盘字符串分隔符。由于学生的名字是一个字符串,因此在语法上需要完成假设的查询。注入攻击仅在它们注入的SQL查询产生有效SQL时才有效。

不负相思意

正如其他人已经指出的那样,');关闭原始陈述,然后是第二个陈述。大多数框架(包括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注入,但如果您能够提供多个语句,则可以执行更具破坏性的操作。

慕妹3146593

单引号是字符串的开头和结尾。分号是声明的结尾。所以,如果他们做这样的选择:Select&nbsp;*From&nbsp;StudentsWhere&nbsp;(Name&nbsp;=&nbsp;'<NameGetsInsertedHere>')SQL将成为:Select&nbsp;*From&nbsp;StudentsWhere&nbsp;(Name&nbsp;=&nbsp;'Robert');&nbsp;DROP&nbsp;TABLE&nbsp;STUDENTS;&nbsp;--')--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^-------------------------------^在某些系统上,select会首先运行,然后是drop语句!消息是:不要将值嵌入到您的SQL中。而是使用参数!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL