为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕的地10843 2019-05-20 16:46:58
这个SQL做了什么:Robert'); DROP TABLE STUDENTS; --我知道这两个'并且--是用于评论,但是这个词也没有DROP被评论,因为它是同一行的一部分?
查看完整描述

6 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

它放下了学生桌。

学校计划中的原始代码可能看起来像

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时才有效


查看完整回答
反对 回复 2019-05-20
?
不负相思意

TA贡献1777条经验 获得超10个赞

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


查看完整回答
反对 回复 2019-05-20
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

单引号是字符串的开头和结尾。分号是声明的结尾。所以,如果他们做这样的选择:

Select *From StudentsWhere (Name = '<NameGetsInsertedHere>')

SQL将成为:

Select *From StudentsWhere (Name = 'Robert'); DROP TABLE STUDENTS; --')--             ^-------------------------------^

在某些系统上,select会首先运行,然后是drop语句!消息是:不要将值嵌入到您的SQL中。而是使用参数!


查看完整回答
反对 回复 2019-05-20
  • 6 回答
  • 0 关注
  • 896 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信