📘 第十一章 Web的攻击技术
📄 一句话概括

页面上没写链接,不等于访问不到。 Demo 里首页只链了一个文件,但直接请求 /admin/report.pdf、/backup.zip、 /.git/config 全都回了 200。靠「不公布路径」来保密,等于把门虚掩着。

📝 本节和前面几节的关系

注入那一类要构造 payload。这一节更省事:什么技术都不用,只把路径挨个试一遍。

一、两种「看不见」

第一种是目录列表没关:访问一个目录,服务器把里面的文件名全列出来。 这本来是早期 Web 的默认行为,现在多数服务器默认关了,但老系统和自己写的静态服务常常还开着。 第二种是文件还在,只是没链接:备份包、测试页、旧版本、.git 目录、 .env 配置文件——页面上一个链接都没有,但它们确实是能访问的静态文件。 Demo 测的是第二种。 首页只链了 /index.html,另外三个路径直接请求全是 200,其中一个里面就写着内部报表。 所以「页面上点不到」和「访问不了」是两件完全不同的事。前者是设计,后者才是安全。

二、为什么这种漏洞特别多

因为部署过程太容易留下东西。 开发时放一个 test.html、打包时留一个 app.zip、用 git 拉代码时整个 .git 目录跟着上去了、 用 .env 存口令也跟着上去了。 .git 这一条尤其常见:只要 .git/config 能读到,攻击者就能顺着把整个版本库拉下来,源码一行不落。 还有一类是「旧的没用但没删」:/admin_old/、/api/v1/、/upload_test.php。 它们往往是没有鉴权的,因为写的时候没打算对外。 这些都不是代码 bug,是运维和部署的疏漏。 所以修起来往往只是删文件、改配置——但前提是你得先知道它们在那儿。

三、防的办法:默认拒绝

核心思路是把「允许」翻过来:默认所有人访问不到,只把要公开的路径列出来放行。 这样新加的文件忘了配置,结果是「打不开」,而不是「谁都能看」。 具体做法:静态文件只从一个专门的目录提供、关掉目录列表、 把 .git/.env 这类敏感路径在服务器层面直接 403、部署流程里加一步「比对产物清单」。 还有一条成本最低的检查:定期拿一份常见路径清单扫自己。 后面 11.5.4 的 Demo 就是这个做法——八个路径扫一遍,回 200 但页面上没链接的,就是嫌疑。

四、动手 Demo:四个路径,前三个页面上都没链接

本机起一个静态服务端,手里有四个文件,但只在首页里链了一个。 然后直接按路径请求另外三个,看各回什么。再加一版「非公开路径要登录」的对照。

FILES = {
    u'/index.html': ...,
    u'/admin/report.pdf': ...,
    u'/backup.zip': ...,
    u'/.git/config': ...,
}
LINKED = (u'/index.html',)

实跑输出:

--------------------------------------------------------------------
强制浏览:没链接不等于访问不到
--------------------------------------------------------------------
  站点首页只链接了 /index.html,别的路径页面上一个字都没提。

  直接请求的路径              无鉴权        需要登录
  /index.html          200        200
  /admin/report.pdf    200        401
  /backup.zip          200        401
  /.git/config         200        401

  后三行在「无鉴权」那一列全是 200——页面上没有链接,但浏览器照样能打开。因为「有没有链接」和「能不能访问」是两件事。
  `.git/config` 那一行尤其常见:部署时把版本库目录一起传上去了,整个源码就都在那里。

四行里后三行在「无鉴权」那一列全是 200。 页面上没有链接,但浏览器照样能打开——因为 HTTP 不认识「链接」这个概念,它只认识路径。 加了鉴权之后,后三行变成 401,只有 /index.html 还是 200。 这就把「靠不公布来保密」换成了「靠鉴权来保护」。 .git/config 那一条最值得警惕:一个文件泄露,整个版本库可能跟着泄露,连历史提交里的口令都在里面。 注意这不是「攻击」,请求完全合法:三个 GET,没有 payload,没有越权。 服务端只是老老实实地把它有的文件给出去了。

30 秒实验

  1. 试试访问你自己项目的 /robots.txt、/.git/config、/backup.zip 看回什么。
  2. 打开浏览器的 Network 面板,看一个页面加载了多少个你没注意到的资源。
  3. 想一想:为什么「目录列表」这个功能在 1995 年是优点,今天是缺点?

常见误区

  1. 「没人知道这个路径就安全」——路径清单是公开的,扫一遍就知道了。
  2. 「服务器会拦住这种请求」——除非你配了规则,否则它对静态文件一视同仁。
  3. 「只是些测试文件,无所谓」——里面有 .env 和 .git 就很有所谓。
自测三问(点开对答案) 1. 强制浏览利用的是什么? —— 「没有链接」不等于「访问不到」,静态文件按路径就能取。 2. 为什么 `.git` 目录泄露特别严重? —— 攻击者可以顺着把整个版本库拉下来,包括历史提交里的敏感信息。 3. 防它的核心思路是什么? —— 默认拒绝:只放行明确要公开的路径,其余一律拒绝。

还有一种「泄露」不靠文件,靠报错信息。

相关笔记