最著名的漏洞类别之一往往是注入漏洞,尤其是毫无争议的后起之秀--SQL 注入漏洞:SQL 注入。在科技界,很难不听到 SQL 注入,所以我们就来谈谈它。
通过 SQL 注入,可以操纵 SQL 查询的行为,使其听命于攻击者。
此外,还有许多其他类型的注射,虽然表面上各不相同,但工作原理都是一样的。
概括地说,最常见的注射类型包括
- SQL 注入
- 跨站脚本(HTML/JavaScript 注入)
- 路径遍历(路径/链接注入)
- 指令注入
- 代码注入
注射 101
如果你看一下前面的注入类型列表,它们都有一个共同点:它们都涉及一个字符串,该字符串通过一个解释器运行,然后解释器执行该字符串所代表的任何操作。我们用大括号标记了 "用户输入"。
类型 | 输入示例 | 如何解释 |
查询语言 | SELECT name FROM users WHERE username = '{admin}' Name | 从用户表中用户名为 "admin "的所有行中选择 "姓名 "列 |
超文本标记语言 | {约翰-史密斯} | 用粗体字显示 "约翰-史密斯 "的名字 |
路径 | /var/www/app/documents/{privacy-policy.pdf} | 指向 `/var/www/app/documents/`文件夹中的文件 `privacy-policy.pdf`。 |
指挥 | ping {8.8.8.8} | 向 IP "8.8.8.8 "发送一系列 ICMP ping |
代码 | const name = '{John Smith}'; | 将常量变量 `name` 设置为 `John Smith |
那么,如果用户输入的插入不安全会发生什么情况?攻击者能做什么?同样,在这种情况下,大括号内的所有内容都被视为 "用户输入"。
类型 | 输入示例 | 如何解释 |
SQL - 注入 | 从用户中 SELECT name WHERE username = '{1' UNION 从用户中 SELECT passwordhash WHERE username = 'admin}' | 从用户表中用户名为 "admin "的所有行中选择 "姓名",并从用户名为 "admin "的用户中选择密码哈希值 |
HTML - 注入 | {} | 用粗体字显示 "约翰-史密斯 "这个名字 |
路径 - 注射 | /var/www/app/documents/{.../.../.../.../etc/shadow}。 | 指向 `/etc/` 文件夹中的 `shadow` 文件 |
命令 - 注入 | ping {8.8.8.8 && ls .} | 向 IP `8.8.8.8` 发送一系列 ICMP ping,并用 `ls` 打印当前目录的内容 |
代码 - 注入 | const name = '{John Smith'; exec('ls .'); # }'; | 将常量变量 `name` 设置为 `John Smith` 的值,然后执行系统命令 `ls . |
在这些示例中,请注意如何利用输入来影响用户输入的结果。
这就是注入的本质。它影响传递给解释器的内容,从而使解释器做一些与程序员初衷不同的事情。
这些只是需要考虑的基本问题。我们将一些不同的注射类型分到了各自的页面上,因为它们值得更多关注。
您可以在这里找到它们:
命令注入
路径遍历
SQL 注入
跨站脚本