WEB安全新玩法 [7] 加密不安全下载路径

提供下载功能的网站,其下载资源的链接是任何用户都能获取的。如若设计不当,攻击者通过分析链接的文本,能够构造出意外但有效的链接,访问网站功能之外的资源,从而窃取主机上的敏感信息。


以下就是这样一个例子:网站将下载资源的文件路径作为参数传入,但没有对这个参数进行检查,于是攻击者可以构造多级父路径来尝试获取操作系统的配置文件。使用 iFlow 业务安全加固平台能够加密 URL 中的关键部分,使得攻击者的这种构造行为无从进行。

一、原始网站

1.1 正常用户访问

用户点击进入下载页面,点击选择其中一名球星,网站弹出下载框,用户点击确定后图片下载成功。

pic1

HTTP 交互过程如下:

sequenceDiagram participant 正常用户 participant 浏览器 participant Web服务器 正常用户->>浏览器: 点击进入【下载页面】 浏览器->>Web服务器: 请求:下载页面 Web服务器->>浏览器: 返回:下载页面 浏览器->>正常用户: 显示:下载页面 正常用户->>浏览器: 点击选择球星【科比】 浏览器->>Web服务器: GET /vul/dl/execdownload.php?filename=kb.png Web服务器->>浏览器: 返回:球星图片 浏览器->>正常用户: 得到:球星图片

1.2 攻击者访问

同样地,攻击者点击进入下载页面,点击选择其中一名球星,网站弹出下载框,攻击者点击确定后图片下载成功。

pic1

以火狐浏览器为例,攻击者单击工具栏中的下载按钮,可查看下载的图片,并复制下载链接。

pic2

攻击者在新的标签中嵌入拷贝下来的下载链接,将 kb.png 作如下修改—— ../../../../../../../../Windows/System32/drivers/etc/hosts 回车后即可看到敏感文件下载框。

pic3

攻击者点击确定后,就取得了 Windows 系统的敏感文件: /Windows/System32/drivers/etc/hosts

HTTP 交互过程如下:

sequenceDiagram participant 攻击者 participant 浏览器 participant Web服务器 攻击者->>浏览器: 点击进入【下载页面】 浏览器->>Web服务器: 请求:下载页面 Web服务器->>浏览器: 返回:下载页面 浏览器->>攻击者: 显示:下载页面 攻击者->>浏览器: 点击选择球星【科比】 浏览器->>Web服务器: GET /vul/dl/execdownload.php?filename=kb.png Web服务器->>浏览器: 返回:球星图片 浏览器->>攻击者: 得到:球星图片 rect rgb(250, 128, 128) 攻击者->>浏览器: 复制链接,修改参数 end 浏览器->>Web服务器: GET /vul/dl/execdownload.php?filename=../../../../../../../../Windows/System32/drivers/etc/hosts Web服务器->>浏览器: 返回:系统敏感文件 rect rgb(250, 128, 128) 浏览器->>攻击者: 得到:系统敏感文件 end

二、iFlow虚拟补丁后的网站

我们在 Web 服务器前部署 iFlow 业务安全加固平台,它有能力拦截、计算和修改双向 HTTP 报文并具备存储能力,成为 Web 应用的虚拟补丁。在本例中,iFlow 将下载页面中的下载链接加密,使得攻击者无从构造 URL。

2.1 正常用户访问

用户访问下载页面时,Web 服务器原始页面上的下载链接是明文的,iFlow 将它们全部加密后发给用户;用户点击其中一项后,浏览器发出密文链接的请求,iFlow 将密文链接解密为明文,再向 Web 服务器端发出请求。

pic4

正常用户的 HTTP 交互流程如下:

sequenceDiagram participant 正常用户 participant 浏览器 participant iFlow participant Web服务器 正常用户->>浏览器: 点击进入【下载页面】 浏览器->>Web服务器: 请求:下载页面 Web服务器->>iFlow: 返回:包含明文链接的下载页面 rect rgb(160, 250, 160) Note over iFlow: 加密每一个下载链接 end iFlow->>浏览器: 返回:包含密文链接的下载页面 浏览器->>正常用户: 显示:下载页面 正常用户->>浏览器: 点击选择球星【科比】 浏览器->>iFlow: GET /vul/dl/WTJSdmQyNXNiMkZrTG5Cb2NEOW1hV3hsYm1GdFpUMQ== rect rgb(160, 250, 160) Note over iFlow: 解密链接 end iFlow->>Web服务器: GET /vul/dl/execdownload.php?filename=kb.png Web服务器->>浏览器: 返回:球星图片 浏览器->>正常用户: 得到:球星图片

2.2 攻击者访问

攻击者得到如下的下载链接:

<a href="/vul/dl/WTJSdmQyNXNiMkZrTG5Cb2NEOW1hV3hsYm1GdFpUMQ==">

显然,攻击者无法通过分析这段文本来构造攻击请求。

2.3 代码

iFlow 内置的 W2 语言是一种专门用于实现 Web 应用安全加固的类编程语言。它介于配置和通用语言之间,具备编程的基本要素和针对 HTTP 协议的特有扩展,能为业务系统编写涉及复杂判断和动态修改的逻辑。

考虑到安全产品的使用者通常为非程序员,他们习惯面对配置文件而非一段代码。因此,W2 语言虽包含语言要素,仍以规则文件方式呈现,并采用可以体现层次结构和方便词法校验的 JSON 格式。

用 W2 语言实现上述虚拟补丁的代码如下:

[
	{
        "if": true,
        "then": "TX.key='kj2Hdsol'"
    },
    {
		"if": [
			"streq(REQUEST_FILENAME, '/vul/dl/down_nba.php')",
			"REQUEST_METHOD == 'GET'"
		],
		"then": {
			"directive": "alterResponseBody",
			"op": "regex",
			"target": "execdownload.*png",
			"target_transform": ["rc5_enc(TX.key)", "btoa"],
			"substitute": "$0"
		}
    },
	{
		"if": "begin(REQUEST_FILENAME, '/vul/dl/')",
		"then": [
            "TX.part = rc5_dec(atob(REQUEST_FILENAME[8:]), TX.key)",
            {
                "if": "begin(TX.part, 'execdownload.php?filename=')",
                "then": {
                    "directive": "alterRequestLine",
                    "op": "url",
                    "value": "/vul/dl/${TX.part}"
                }
            }
        ]
    }
]

示例代码中有三条规则,分别作用如下:

第一条规则

定义了一个加密/解密用的密钥字符串,这个可以自行修改。

第二条规则

当服务器返回下载页面时,iFlow 截获此响应。iFlow 用正则表达式匹配出页面中的每一个下载链接,将其内容替换为用 RC5 加密后再进行 Base64 编码的结果。

第三条规则

当浏览器请求图片时,iFlow 截获此请求。iFlow 用 Base64 解码并用 RC5 解密请求 URL 中的密文部分。如果解密后的结果是明文符合原始下载链接的格式,则将这个明文作为 URL 发给后端 Web 服务器。

注意:上述密码算法和密钥完全是在服务器端的 iFlow 中实现和运算的,攻击者在客户端是看不到算法和密钥的。

三、总结

iFlow 在不改动后端程序的情形下,防范攻击者通过分析和构造链接来下载系统敏感文件。值得说明的是,规则中的所有计算均在服务器端实现,浏览器端不执行任何代码,攻击者无法通过代码分析来破解。(张戈 | 天存信息)

posted @ 2021-07-01 15:44  天存信息  阅读(191)  评论(0编辑  收藏  举报