# 信息泄露

## 介绍

信息泄露漏洞是指网站在无意中向用户泄露敏感信息，根据上下文，网站可能会在无意中向攻击者泄露各种信息，包括：

* 其他用户信息
* 敏感商业或业务数据
* 有关网站以及基础设置的技术细节

## 原因

信息泄露可能存在无数不同的方式出现，但是可以大致分为以下几类：

* 没有从公共内容删除内部数据 eg: 开发人员注释
* 网站和相关技术的不安全配置 eg: 没有禁用调试和诊断功能
* 应用程序的设计和行为存在缺陷

## 影响

信息泄露的产生可以帮助攻击者更好的了解关于目标的认识

## 攻击

### 1. 网站爬虫文件

许多网站会提供 /robots.txt 或者 /sitemap.xml 配置文件，这些文件中可能存在一些利用的位置

### 2. 目录列表

WEB 服务器可以配置为自动列出没有索引页的目录的内容，这会帮助攻击者快速识别路径上的资源并直接进行分析和攻击

### 3. 开发者注释

有时候开发者会忽略在页面中的一些注释内容，这可能帮助攻击者访问一些特殊的网页

### 4. 错误信息

错误信息的内容可以帮助攻击者了解有关给定参数的输入或数据类型的信息，这可以帮助我们缩小攻击范围

详细的错误信息还可能提供有关网站的不同技术的信息

### 5. 调试数据

许多网站会生成自定义错误消息和日志，其中包含了大量有关应用程序的信息，在实际环境中调试信息会包含对发起进攻的至关重要的信息：

* 后端组件的主机名和凭据
* 服务器上的文件和目录名称
* 用于加密通过客户端传输的数据的密钥

### 6. 用户账户页面

用户的个人资料中通常会包含用户的敏感信息，eg: 电子邮件地址、电话号码、API 密钥等，但是一般用户只能访问自己的页面，这并不会产生漏洞，但是一些网站可能会包含 `逻辑缺陷`这可能会让攻击者利用该缺陷查看其他用户数据

### 7. 备份文件泄露源代码

#### 1. .DS\_Stor 源码泄露

在发布代码时未删除隐藏的 .DS\_Stor 被发现后，获取敏感文件名等信息

```shell
dumpall -u http://example.com/.DS_Store/
```

#### 2. .hg 源码泄露

hg init的时候会生成.hg

```shell
./rip-hg.pl -v -u http://www.example.com/.hg/

cat .hg/store/fncache
```

#### 3. CVS 泄露

```shell
/CVS/Root 返回根信息
/CVS/Entries 返回所有文件的结构

rip-cvs.pl -v -u http://www.example.com/CVS/
```

#### 4. .SVN 源码泄露

漏洞概述： 在使用 SVN 管理本地代码过程中，使用 svn checkout 功能来更新代码时，项目目录下会自动生成隐藏的`.svn`文件夹。

一些网站管理员在发布代码时，不愿意使用“导出”功能，而是直接复制代码文件夹到WEB服务器上，这就使得`.svn`隐藏文件夹被暴露于外网环境

访问目标存在以下文件

```shell
.svn/entries
.svn/wc.db
```

漏洞利用

**`.svn/pristine` 目录** ： 直接访问获得文件源代码

**wc.db文件**

用`Navicat`软件打开 `wc.db`文件，可以看到 NODES 表，遍历这个表里的每一行，就可以下载到整个项目里的代码了，而且还能得到对应的真实文件名。

`REPOSITORY`表里面存储了svn的项目路径和 uuid，如果没有做访问IP限制的话，可以直接使用此信息取得此项目的SVN权限（下载、提交等）

```shell
./rip-svn.pl -v -u http://www.example.com/.svn/

http://47.110.235.233:8089/.svn/pristine/
```

#### 5. .Git 源码泄露

* 漏洞概述： 在运行git init初始化代码库的时候，会在当前目录下面产生一个.git的隐藏文件，用来记录代码的变更记录；在发布代码的时候，.git目录没有删除，使用这个文件，可以恢复源代码
*   漏洞验证：

    ```shell
    /.git/config 页面存在
    ```
*   漏洞利用:

    ```shell
    文件夹分析

    index：文件保存暂存区信息
    info：存放仓库的信息
    object：存放所有git对象的地方
    refs：存放提交hash的地方
    config：github的配置信息
    description：仓库的描述信息，主要给gitweb等git托管系统使用
    HEAD：映射到ref引用，能够找到下一次commit的前一次哈希值
    ```

    ```shell
    rip-git.pl -v -u http://www.example.com/.git/
    ```
*   Stash

    ```shell
    #需要使用可还原历史版本那个Githack才行

    1、查看 .git/refs/stash 找到 stash 对应的 hash

    2、git diff hash值
    ```
*   Log

    ```shell
    # 1、执行 git log 查看历史记录
    # 2、与上（某）次提交进行比对
    git diff log中的hash前四位
    # 或者
    git diff HEAD^

    # 3、或者直接切换到上个 (3e25d) 版本
    git reset --hard 3e25d
    # 或
    git reset --hard HEAD^
    ```

## 防御

因为信息泄露的方式多种多样，因此要完全防止信息泄露送很困难，但是我们可以设置一些比较通用的做法来降低风险

* 开发人员应该了解那些信息被视为敏感信息
* 我们需要审计代码以发现潜在的信息泄露
* 尽可能使用通用的错误信息
* 仔细检查是否在开发环境中禁用了调试和诊断功能
