这一章我们介绍信息泄露漏洞,并描述如何寻找漏洞和利用漏洞。

发现可能的服务器路径泄露模式 nginx 服务器信息泄露_Burp

1. 什么是信息泄露?

2. 信息泄露是如何发生的?

信息泄露漏洞可以出现在各种各样的场景中,大致可以归纳为以下几种:
(1)未能从公开内容中移除内部信息
例如,开发人员添加的注释信息可以在公开内容中看到,这对攻击者理解业务逻辑非常有帮助。
(2)网站不安全的配置信息
例如,忘记关闭调试功能,将会为攻击者提供有用的工具,用于获取敏感信息。即便是默认的配置也依然存在问题,譬如会提供冗余的错误信息。
(3)应用中存在有缺陷的设计
例如,在不同错误发生的时候,返回不同的相应。这可以让攻击者可以枚举敏感信息,譬如,合法的用户凭证等。

3. 如何发现漏洞?

3.1 Fuzzing

如果发现有趣的参数,可以尝试提交不在期望范围内的数据类型,以及特定构造的字符串,看看应用会发生什么。例如,处理请求所耗的时间会略有差异。即使错误信息的内容没有明显的敏感信息,但是不同的错误信息也是有用的信息。
上面说的这些,都可以使用Burp Intruder完成。这个工具提供以下功能:
(1)可以将payload位置添加到参数中,并使用预设的模糊字符串单词列表来快速连续地测试大量不同的输入;
(2)可以通过比较HTTP response的状态码、响应时间、长度等,简单快速地识别差异;
(3)可以使用grep匹配规则,快速识别关键词,譬如:error,invalid,SELECT,SQL, and so on.
(4)可以使用grep抽取规则,抽取和比较感兴趣的内容。
也可以使用Logger++扩展,它可以定义一些高级的过滤规则,用于方便地发现泄漏的敏感信息。

3.2 使用Burp Scanner

Burp Suite专业版用户可以直接体验Burp Scanner,它提供了浏览时的用于审计的实时扫描功能,或者也可以自动地做抓取和审计站点的任务,这两种方法都可以发现一些信息泄露的漏洞。譬如,Burp Scanner发现敏感信息时会提示用户,如:私钥、邮箱地址、信用卡号等,也可以识别出备份文件、目录枚举等。

3.3 使用Burp的Engagement tools

Burp的Engagement tools也可以用于发现敏感信息,可以通过右键上下文菜单访问相应的功能。不过,好像也是仅对pro版本开放功能。

3.4 工程信息

让应用去处理非法的输入,有时会暴露出一些有意思的工程技术细节,这些都发现问题也是有帮助的。

4. 常见的信息泄露

4.1 用于网页爬虫的文件

很多站点提供/robots.txt和/sitemap.xml文件,用于帮助爬虫程序浏览他们的站点。此外,它们也列出了爬虫程序应该忽略的文件或目录,这些通常都是包含了敏感信息的。通常情况下,这些文件不会从网站内链接,所以,他们可能不会出现在Burp的网站地图上。然而,可以手工地看看这些文件,看看有没有什么是值得关注点。

4.2 目录枚举

很多web服务器的配置中,如果没有index页面,则会列出当前目录下的所有文件/目录。这对攻击者而言,可以快速地浏览当前站点的目录结构信息,并有针对性的分析和攻击特定页面。这种方式也暴露了很多不想被用户看到的信息,如临时文件和转储文件等。

目录枚举本身对安全漏洞并非是必须的,但是,如果站点没有实现适当的访问控制,以这种方式泄露了敏感信息,也是一个问题。

4.3 开发人员的注释信息

一般情况,开发人员的注释信息在部署到生产环境前,会被去除掉。但是,如果忘记了。那么,注释信息将可以提供大量的信息,帮助理解应用的逻辑。

4.4 错误信息

最常见的信息泄露方式就是冗余的错误信息,所以,当我们审计的时候,要格外注意这些错误信息。错误信息可以暴露出指定的参数接受什么样类型的数据,这对于识别可利用的参数、减小攻击面非常有帮助。甚至,也可以让你不要浪费时间在那些不可利用的地方。

冗余的错误信息也可以暴露出站点用的是什么技术栈,甚至有时也可以暴露出使用的模板引擎、数据库类型,甚至相应的版本信息等。这些信息非常有用,因为可以方便地搜到相关的漏洞,以及利用方式。类似的,也可以搜索有没有常见的配置错误,或者不安全的默认设置等,这些可以在官网上有说明。同时,也可以知道网站使用了哪些开源框架,可以分析开源框架的code,这也是构建自己的漏洞利用的宝贵资源。

不同错误信息之间的差异也暴露了幕后的不同的应用行为,观察这些差异是很多利用技术的重要环节,如SQL injection,username enumration等。

4.5 调试数据

为了便于调试,许多网站会生成调试日志,包含大量的调试信息用于记录应用的行为。这些调试信息对于开发是非常重要的,同时,如果攻击者在生产环境上获取了这些调试日志,也会非常有助于他们了解和攻击web应用。

4.6 用户账户页面

通常,用户的profile和账户页面会包含很多敏感信息,如用户的邮箱地址、电话号码、API key等。对于用户而言,一般只能访问自己的账户页面,所以,这并不算是信息泄露。但是,有些应用存在逻辑漏洞,允许攻击者利用漏洞查看其它用户的数据。

举例:假设有一个web应用,可以允许通过参数user传入查看的用户信息。

GET /user/personal-info?user=carlos

在讨论访问控制时,我们会更进一步讨论这类问题。

4.7 通过backup文件泄露源码

如果能够获取源码,对于攻击者理解应用的逻辑和构造高危的漏洞利用非常有帮助。有些敏感信息是hardcode在源码中的,典型的例子是访问后端组件的API key和证书等。如果可以识别出使用的开源技术,那么,就可以获取相应的源码。

另外一种可能会发生的情况:当绘制玩一个站点以后,你可能发现一些文件是被显式引用的,但是,直接访问它们,并不会获取相应的源码。因为web应用在处理请求时,会执行对应的文件,如.php文件。然而,在有些情况下,我们是可以欺骗web应用的。因为有些文本编辑工具在编辑文本时,默认会留下backup文件,一般会以不同的后缀结尾,我们可以尝试请求这些backup文件,获取相应的源码信息。

4.8 不安全的配置导致信息泄露

由于配置不当,网站有时容易受到攻击。由于第三方技术的广泛使用,这种情况尤其普遍,这些技术的大量配置选项不一定能被实现它们的人很好地理解。

在其他情况下,开发人员可能忘记在生产环境中禁用各种调试选项。例如,HTTP TRACE方法是为诊断目的设计的。如果启用,web服务器将响应使用TRACE方法的请求,在响应中响应接收到的确切请求。这种行为通常是无害的,但偶尔会导致信息泄露,比如反向代理可能会将内部身份验证头的名称附加到请求中。

4.9 版本控制的历史

事实上,几乎所有的web应用都是被某种版本控制工具所管理,如git。默认情况下,git将项目的版本控制信息都保存在.git目录下。偶尔程序在生产环境暴露了这个目录,在这种情况下,可以简单地通过/.git访问到这个目录。

当然,手工地遍历原始文件和内容是不可行的,现在有很多工具可以下载整个.git目录。然后,可以在本地使用git访问版本控制历史,这里包含了各种提交记录,可能会包含一些有价值的信息。

这可能没法让你访问全部的source code,但是,通过diff是可以看到部分的code,并从中挖掘出有价值的信息,尤其是那些hardcode的信息。

5. 参考

https://portswigger.net/web-security/information-disclosure https://portswigger.net/web-security/information-disclosure/exploiting