信息泄露漏洞-Web Security Academy学习笔记

什么是信息泄露?

Information disclosure (aka,information leakage):网站在设计意图外向用户暴露敏感数据,如:

  • 用户信息,如用户名、资产信息
  • 敏感的商业数据或业务数据
  • 站点(及其架构)的技术细节信息

前二者的危害显而易见,而技术信息有时会为攻击者进行攻击提供线索,危害也十分严重。

信息泄露的例子

  • robots.txt 或目录列表文件会泄露站点隐藏路径,目录结构和内容
  • 通过临时备份文件访问到部分源代码
  • 报错信息泄露数据库表名、列名等信息
  • 源代码中hard-coded的API keys,IP地址,数据库用户名密码等
  • 通过应用行为的细微差异,提示资源、用户名等信息(e.g. 时间盲注,布尔盲注等)

信息泄露的途径

  • 没有从公开的内容中移除内部信息(e.g. 源代码中的开发者注释没有删除)
  • 站点相关的技术配置不安全(e.g. 没有禁用调试和诊断功能;使用默认配置导致输出包含敏感信息的报错)
  • 应用设计和行为存在缺陷(e.g. 在不同错误发生时返回不同的响应,可能被攻击者利用来枚举敏感数据等)

信息泄露的影响

  • 泄露用户身份、财产等敏感信息:不用说了
  • 泄露技术信息:帮攻击者打开思路,缩小尝试范围,如使用某站点架构特定版本的漏洞。严重程度取决于攻击者如何利用这些信息

如何寻找并利用信息泄露漏洞

常见信息泄露源

  • 爬虫相关文件

    /robots.txt 和 /sitemap.xml 包含了站点中不想让爬虫扫描的路径,这些路径通常不与站点内其他页面链接,因此可能不出现在 Burpsuite 等扫描器的 site map中。可以尝试手动访问获取有用信息。

  • 目录列表

    Web 服务器可以被配置为,对没有index页面的目录,自动列出路径下内容。大大方便攻击者确定站点结构,寻找敏感信息。

    目录列表本身并不一定是安全漏洞,但当站点没有很好地实现访问控制时。目录列表对敏感资源位置的泄露就十分危险了。

  • 开发者注释

    开发过程中的HTML行间注释可能出于疏忽或开发者安全意识不足而未被删除,从而部署至生产环境。这些注释很容易通过工具定位。并有可能包含对攻击者有用的信息,如提示隐藏的目录或包含业务逻辑的线索。

  • 错误信息

    过于冗长的错误信息是最常见的信息泄露方式之一。在渗透测试过程中,需要对触发的每一个错误信息加以关注。

    错误信息可能提示的信息举例:

    • 输入的数据类型与预期参数类型;这可以帮助攻击者确定可供攻击的参数。
    • 站点使用的技术信息:web engine、数据库、服务器的类型及版本号等;攻击者可以针对特定版本进行后续攻击。如站点使用开源架构,可以针对其源码进行代码审计以寻找攻击点。
    • 错误信息的差异可以提示web应用行为的不同,观察错误信息的差异是很多攻击技术的重要方面。如SQL注入(盲注)、用户名枚举(Username不存在 or Username或password不正确)。
  • 调试数据

    站点因调试目的而生成的错误信息和日志可能包含大量攻击者需要的信息,如:

    • Values for key session variables that can be manipulated via user input
    • Hostnames and credentials for back-end components
    • File and directory names on the server
    • Keys used to encrypt data transmitted via the client
  • 用户账户页

    某些站点在访问用户个人账户页面时存在逻辑缺陷,如GET /user/personal-info?user=carlos改变user参数可能导致访问任意用户账户页。

  • 包含源代码的备份文件

    源代码可以:

    • 帮助攻击者理解站点应用行为和业务逻辑
    • 一些敏感信息(API keys,访问后端组件的认证信息(如数据库用户名密码))可能硬写在源代码中。

    在站点中发现的源代码文件(如.php)通常不能直接访问文本而是被执行。但在某些情况下可以尝试获取源码文本。

    文本编辑器常在文件变动时创建临时备份文件,通常在文件名前加~,或者添加特定后缀(如.bak),尝试访问这些文件可能会得到源代码文本。

  • 不安全配置导致的泄露

    站点的不正确配置常常会导致安全漏洞,这是由于站点普遍使用第三方技术,这些技术有大量的接口和配置项,配置站点人员并未完整理解。

    此外,开发者常常忘记在生产环境中禁用一些调试项。例如,HTTP 的 TRACE方法 是为诊断目的而设计,使用该方法会返回exact request that was received。通常是无害的,但有可能会导致信息泄露。如internal authentication headers可能会被反向代理添加到用户请求后。

  • 版本控制历史

    /.git 目录包含站点所有的版本控制数据,可能被部署到生产环境。可以直接访问路径,也可用本地的git来访问。

    可能不能得到全部的源代码,但对比各版本的diff可以读到部分代码片段,或许能找到敏感信息(如上文所述的hard-coded的key或者credentials)。

如何预防信息泄露漏洞

信息泄露漏洞可能在各种地方出现,预防此类漏洞的原则如下;

  • 所有开发者应明确什么信息是敏感信息
  • 生产过程中对所有代码进行审计