4.1 Web 应用的功能与安全隐患的对应关系
安全隐患产生于何处
在逐项细述 Web 应用的安全隐患之前,让我们先对安全隐患有一个整体认识。图 4-1 展示了 Web 应用的各项功能与安全隐患的对应关系。图中使用经典的“输入-处理-输出”模型来表示 Web 应用。从 HTTP 请求的输入开始,经过应用的各种处理,最后由 HTTP 响应进行输出。而除了 HTTP 响应外,此处的“输出”还包括访问数据库、读写文件、收发邮件等“与外界交流”的操作。
图 4-1 Web 应用的功能与安全隐患的对应关系
换一个角度来看,图 4-1 中的“输出”也能被理解为向外部媒介输出脚本。Web 应用常见的脚本输出和与其对应的安全隐患如下所示。
- 输出 HTML(跨站脚本)
- 输出 HTTP 消息头(HTTP 消息头注入)
- 调用 SQL 语句(SQL 注入)
- 调用 Shell 命令(OS 命令注入)
- 输出邮件头和正文(邮件头注入)
关于各隐患的详情在后面的章节中会进行细述,而从图 4-1 中,我们可以得出以下结论。
- 处理过程与输出过程会产生安全隐患
- 输入过程不会产生安全隐患 1
- 输出过程产生的安全隐患的名称中多数都带有“注入”
1 仅限于本书探讨的应用程序的安全性。如果将讨论范围扩大至中间件(Middleware),输入校验时也有可能引入安全隐患。
其实,跨站脚本有时也被称为“HTML 注入”或“JavaScript 注入”,因此,图 4-1 中输出过程产生的安全隐患全部为注入型隐患。
综上所述,安全隐患和 Web 应用的功能息息相关。所以在程序设计或编写代码时,就能够根据此时正在实现的功能而得知应当对哪些安全隐患提高警惕。鉴于这种情况,下一节开始,我们将按照 Web 应用的各项功能分类,来详细阐述与其对应的安全隐患。
由于所有的注入型隐患都是基于一些共同的原理,因此,接下来就让我们首先来看一下注入型隐患产生的原因。
注入型隐患
Web 应用中传递的信息多数为文本格式。HTML、HTTP 和 SQL 等支撑 Web 应用的技术多数都采用了文本格式的接口。
这些文本格式都由各自的语法构成,其中还混合了命令、运算符和数据等。多数情况下,数据部分会通过使用引号(单引号或双引号)或使用被称为分隔符(Delimiter)的符号(逗号、Tab 或换行符等)隔开的方式来加以区分。Web 应用的普遍形式为,首先确定文本的框架结构,然后再将数据填入其中。例如,以下的 SQL 语句中, $id
就是被填入的数据。
SELECT * FROM users WHERE id='$id '
$id
以外的部分即事先确定的文本结构。然而,如果应用存在安全隐患,就能够更改此 SQL 语句的结构。
举例来说,假设要将以下字符串作为 $id
的值填入 SQL 语句。
';DELETE FROM users --
填入数据后的 SQL 语句如下。阴影部分即 $id
的值。
SELECT * FROM users WHERE id='';DELETE FROM users -- '
外界传入的单引号和分号迫使 SELECT 语句结束后,又被添加了 DELETE FROM 语句,这就是 SQL 注入攻击,详情将在 4.4.1 节讲述。
SQL 注入攻击产生的原因为,在被认定为“数据”的位置插入单引号使得数据部分结束,从而更改了 SQL 语句的构造。
这个原理同样也适用于其他的注入型隐患。通过插入引号或分隔符等用于表示“数据部分边界”的字符,从而改变了文本的结构。
表 4-1 列举了各种注入型攻击采用的恶意手段和表示“数据部分边界”的字符。详情在之后介绍各个隐患时会进行细述,此处首先对注入型隐患的产生有着共同的原理这一事实有一大致印象,将有助于理解后面章节的内容。
表 4-1 注入型隐患的比较
隐患名 | 接口 | 恶意手段 | 数据部分边界 |
---|---|---|---|
跨站脚本 | HTML | 注入 JavaScript 等 | < " 等 2 |
HTTP 消息头注入 | HTTP | 注入 HTTP 响应消息头 | 换行符 |
SQL 注入 | SQL | 注入 SQL 命令 | ' 等 |
OS 命令注入 | Shell 脚本 | 注入系统命令 | ; | 等 |
邮件头注入 | sendmail 命令 | 注入或更改邮件头或正文 | 换行符 |
2 之所以将“<”作为数据部分的边界,是因为 HTML 元素的内容(一般为文本)以“<”为结束符,“<”表示标签的开始。
总结
本节作为讲解安全隐患的序幕,介绍了安全隐患产生地点和安全隐患种类的关联性。此外,对由输出引发的安全隐患,即注入型隐患的产生原理也进行了介绍。
下一节开始,我们将把 Web 应用以功能为单位进行细分,并详细讲解每一功能容易产生的安全隐患。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论