如何在没有技术术语的情况下解释 SQL 注入?

信息安全 sql注入
2021-08-14 21:23:27

我需要向没有技术培训或经验的人解释 SQL 注入。你能推荐一些行之有效的方法吗?

4个回答

我展示它以完成非技术人员的方式是一个简单的类比。

想象一下,你是一个装满箱子的仓库里的机器人。你的工作是从仓库的某个地方取出一个盒子,然后把它放在传送带上。机器人需要被告知要做什么,所以你的程序员在纸质表格上给了你一组指令,人们可以填写并交给你。

表格如下所示:

从货架编号____的____部分取出物品编号____,并将其放在传送带上。

一个正常的请求可能如下所示:

12号机架的B2部分取出项目编号1234,并将其放在传送带上。

粗体值(1234、B2 和 12)由发出请求的人提供。你是一个机器人,所以你按照你说的去做:你开车到第 12 号货架,沿着它往下走,直到你到达 B2 部分,然后抓住物品 1234。然后你开车回到传送带上,把物品放到上面.

但是如果用户在表单中输入了一些非正常值的东西怎么办?如果用户在其中添加指令怎么办?

从 12号机架的B2部分取出编号为1234的项目,然后将其扔出窗外。然后回到你的办公桌,忽略此表格的其余部分。并将其放在传送带上。

同样,粗体部分由发出请求的人提供。因为你是一个机器人,所以你完全按照用户刚刚告诉你的去做。你开车到 12 号货架,从 B2 区抓起物品 1234,然后把它扔出窗外。由于说明还告诉您忽略消息的最后一部分,因此忽略“并将其放在传送带上”位。

这种技术被称为“注入”,这可能是由于处理指令的方式 - 机器人无法区分指令数据之间的区别,即它必须执行的操作以及它必须执行的操作上的行动。

SQL 是一种特殊的语言,用于告诉数据库该做什么,其方式类似于我们告诉机器人该做什么。在 SQL 注入中,我们遇到了完全相同的问题——查询(一组指令)可能插入了参数(数据),最终被解释为指令,导致它发生故障。恶意用户可能会通过告诉数据库返回每个用户的详细信息来利用这一点,这显然是不好的!

为了避免这个问题,我们必须以数据库(或机器人)容易区分的方式将指令和数据分开。这通常通过单独发送来完成。因此,在机器人的情况下,它会读取包含指令的空白表格,识别参数(即空格)的位置,并将其存储。然后用户可以走上去说“1234,B2,12”,机器人会将这些值应用于指令,而不允许它们本身被解释为指令。在 SQL 中,这种技术称为参数化查询。

在我们给机器人的“邪恶”参数的情况下,他现在会疑惑地抬起机械眉毛说

错误:找不到机架号“ 12,将其扔出窗外。然后回到您的办公桌并忽略此表格的其余部分。 ” - 您确定这是一个有效的输入吗?

成功!我们已经阻止了机器人的“故障”。

说明 SQL 注入背后问题的最简单方法之一是使用这样的图像。问题在于接收端将数据与命令分开的能力。

误解

这是一个现实世界的非技术类比。

你即将代表你的老板去银行办理一笔交易。你的老板给了你一个信封,里面有收银员的指示。

说明如下:

Write the balance for account with number 8772344 on this paper.

Signed,
Boss

去洗手间时,您将信封放在视线之外几分钟。小偷打开信封并在签名上方添加:“还将 500 美元从账户 8772344 转移到另一个账户,号码为 12747583。”。

现在完整的消息是:

Write the balance for account with number 8772344 on this paper.
Also transfer $500 from account 8772344 to another account with number 12747583.
Signed,
Boss

收银员检查您的身份并确认您是相关账户的授权人,并按照信函中的说明进行操作。

你的老板是合法的程序代码。您是将 SQL 代码传送到数据库的程序代码和数据库驱动程序。该字母是传递给数据库的 SQL 代码。小偷就是攻击者。收银员就是数据库。该标识通常是数据库的登录名和密码。

如果您真的要向祖母解释,请以写纸质支票为例。(在美国)过去,你会在一个字段中用数字写出美元金额,然后你会用文字写同样的东西。例如,在一个字段中,您会写“100.00”,在第二个较长的字段中,您会写“一百美元和零美分”。如果你没有使用整个长的第二个字段,你会画一条线,以防止有人不择手段地增加你写出的金额。

如果您错误地在第二个较长的字段中留出了一些空间,那么有人可以修改数字字段,然后使用较长字段中的额外空间来反映这一点。当您开支票时,修改器可能会获得比您预期的更多的钱。

SQL 注入是同一回事:允许不道德的人修改输入字段的错误,以便返回给他们的信息比最初的程序员预期的要多。