提供下载功能的网站,其下载资源的链接是任何用户都能获取的。如若设计不当,攻击者通过分析链接的文本,能够构造出意外但有效的链接,访问网站功能之外的资源,从而窃取主机上的敏感信息。
以下就是这样一个例子:网站将下载资源的文件路径作为参数传入,但没有对这个参数进行检查,于是攻击者可以构造多级父路径来尝试获取操作系统的配置文件。使用 iFlow 业务安全加固平台能够加密 URL 中的关键部分,使得攻击者的这种构造行为无从进行。
用户点击进入下载页面,点击选择其中一名球星,网站弹出下载框,用户点击确定后图片下载成功。
HTTP 交互过程如下:
同样地,攻击者点击进入下载页面,点击选择其中一名球星,网站弹出下载框,攻击者点击确定后图片下载成功。
以火狐浏览器为例,攻击者单击工具栏中的下载按钮,可查看下载的图片,并复制下载链接。
攻击者在新的标签中嵌入拷贝下来的下载链接,将 kb.png
作如下修改—— ../../../../../../../../Windows/System32/drivers/etc/hosts
回车后即可看到敏感文件下载框。
攻击者点击确定后,就取得了 Windows 系统的敏感文件: /Windows/System32/drivers/etc/hosts
HTTP 交互过程如下:
我们在 Web 服务器前部署 iFlow 业务安全加固平台,它有能力拦截、计算和修改双向 HTTP 报文并具备存储能力,成为 Web 应用的虚拟补丁。在本例中,iFlow 将下载页面中的下载链接加密,使得攻击者无从构造 URL。
用户访问下载页面时,Web 服务器原始页面上的下载链接是明文的,iFlow 将它们全部加密后发给用户;用户点击其中一项后,浏览器发出密文链接的请求,iFlow 将密文链接解密为明文,再向 Web 服务器端发出请求。
正常用户的 HTTP 交互流程如下:
攻击者得到如下的下载链接:
<a href="/vul/dl/WTJSdmQyNXNiMkZrTG5Cb2NEOW1hV3hsYm1GdFpUMQ==">
显然,攻击者无法通过分析这段文本来构造攻击请求。
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 在不改动后端程序的情形下,防范攻击者通过分析和构造链接来下载系统敏感文件。值得说明的是,规则中的所有计算均在服务器端实现,浏览器端不执行任何代码,攻击者无法通过代码分析来破解。