去年冬天,黑客一个做渗透测试的网站朋友给我发来一条链接,说“你打开看看”。代码点进去,入口页面只有一行字和一个输入框,黑客背景是网站纯黑。输入框下面写着“Enter code”。代码我输了几个常见目录名,入口全错。黑客他后来告诉我,网站正确入口是代码 /gate/7f3a,一个静态路径,入口没有数据库,黑客没有后端——就是网站一个藏在CDN缓存规则里的文件夹。这件事让我意识到,代码所谓“黑客网站代码入口”根本不是电影里那种满屏绿色字符的登录界面,它往往就是一段被刻意遗忘的URL,或者一个只在特定Header下才返回200状态码的接口。
大部分人对“入口”的想象停留在登录框。真实的入口分三种。第一种是路径型,比如 /admin_2023_backup/,服务器没配目录列表,但你知道文件名就能直接下载。第二种是参数型,一个正常的 index.php?id=1,把id换成 1' OR '1'='1 就进了另一个世界——当然现在很少这么裸奔了,更多是 ?debug=true 这种开发者忘了删的开关。第三种最隐蔽,Header型,请求里带 X-Forwarded-For: 127.0.0.1,或者 User-Agent 改成某个内部爬虫的名字,WAF直接放行。
我见过一个真实案例。某电商的优惠券接口,正常请求返回“无权限”。但如果你把HTTP方法从GET改成POST,再在body里加一个空JSON { },它返回了200,并且带着一张满减券。开发人员大概只在前端做了按钮禁用,后端没校验方法。这个入口没有任何“黑客”气息,就是HTTP协议本身的一个缝隙。
找入口的工具链也变了。以前用御剑、DirBuster扫目录,现在用 ffuf 配合自定义字典。字典里不只有 admin、login,还有 .git/config、.env.bak、swagger-ui.html。我自己的字典里有一条 /actuator/env,Spring Boot没关这个端点的话,直接吐环境变量,里面经常躺着数据库密码。这算入口吗?算。但它不是“网站代码”的入口,是配置的入口。
代码层面的入口更依赖阅读。拿到一个开源CMS,别急着扫。先看 route.php 或者 urls.py,把所有路由列出来。然后找那些没有 auth 中间件的。有一次我在一个GitHub项目里看到 /api/v1/export,注释写着“TODO: add permission check”。这个TODO就是入口。它甚至不需要你懂漏洞利用,只要构造一个带 table=users 的GET请求,整张用户表就变成CSV下载下来。
说回我朋友那个 /gate/7f3a。后来我问他为什么不直接放个登录页。他说:“登录页会被爬虫扫,会被hydra爆破。一个不存在的路径,只有知道的人才会访问。而且我不记录任何日志,CDN边缘节点直接返回文件,源站根本不知道有人来过。” 这大概是入口设计的终极形态——入口即隐身。你找不到它,不是因为它加密多强,而是因为它假装自己不存在。
所以下次你看到一个网站,别只盯着登录框。试试 /robots.txt 里Disallow的那几行,试试 /.well-known/ 下面有没有奇怪的文件,试试把 GET 换成 OPTIONS 看返回的Allow头。入口往往就在那些“不该有东西”的地方。它可能是一个拼写错误的路径,一个返回空白的接口,或者一个只对特定IP段开放的端口。找到它不需要多高深的技术,需要的是对“正常”的怀疑。