扫描一个网站
打开浏览器,扫描输入一串网址,个网回车。扫描页面加载的个网那零点几秒里,我总习惯盯着状态栏看,扫描像在等一个陌生人开门。个网
扫描一个网站,扫描本质上是个网这么回事——你敲了门,对方开了门,扫描然后你得决定要不要走进去,个网或者绕到后门看看。扫描
我干这行纯属偶然。个网去年帮朋友查一个钓鱼链接,扫描点进去是个网个仿冒银行登录页,做得几乎以假乱真。扫描但地址栏里那串域名拼写错了一个字母,这大概是钓鱼网站最常见的破绽。我随手按了F12,开发者工具弹出来,那个页面背后藏着一段被注释掉的代码,写着"test2_final_v3"——连攻击者自己都在版本管理上犯糊涂。
从那以后我就养成了习惯,见到有意思的网站就扫一遍。不是那种黑客式的攻击性扫描,更像拆解一台旧收音机,看里面零件怎么咬合。
第一步永远看响应头。HTTP头里藏着服务器吐出的第一口气。用curl -I敲一下,服务器软件版本、是否开了HSTS、Cookie有没有标HttpOnly,这些信息像门卫的胸牌,挂得明明白白。有次扫一个本地生活平台,响应头里赫然写着"Server: nginx/1.14.0",这版本号至少落后四年,好几个已知漏洞都跟它沾边。对方运维大概觉得没人会看这个,但互联网从不藏秘密。
第二步查robots.txt。这文件本来是给搜索引擎爬虫指路的,但人人可读。有些站长天真地把后台路径写在里面,以为加了"Disallow"就没人看见。我扫过一个电商站,robots.txt里老老实实列着/admin、/backup、/old_version,简直像在门上贴了张纸条:钥匙在花盆底下。
当然,真正有意思的是那些藏在页面源码里的注释。开发者偶尔会留下调试信息,或者一句抱怨。有回在一个企业官网的HTML底部,我找到一行:
<!-- TODO: 把这里的图片换掉,老板说太丑了 -->
这行字比整个网站都有人情味。
扫描不等于入侵。我从不往别人服务器里写东西,也不试图绕过登录验证。顶多用浏览器开隐身模式多翻几页,看看URL参数里有没有SQL注入的痕迹——那种?id=1后面加个单引号会报错的,多半是新手写的代码。真正让我警惕的是那种把所有参数都加密过的站点,那说明对方至少知道自己在做什么。
有一次我扫到一个本地论坛,注册流程里有个隐藏字段叫"is_admin",默认值是0。我把它改成1提交试试,居然真的注册出了管理员账号。那一刻我愣了几秒,然后默默把这个发现报告给了站方。他们回信说"已修复,谢谢",语气平淡得像在说今天天气不错。但我知道,如果这漏洞落进有心人手里,整个论坛的用户资料都会裸奔。
扫描网站这事,说到底是在跟另一头的程序员对话。他们留下的每一个配置失误、每一段遗留代码,都像没擦干净的黑板。你读得懂,就能看见他们当时怎么思考、怎么偷懒、怎么赶工。
前几天扫一个政务网站,发现它还在用HTTP协议,没有HTTPS加密。登录页输密码时数据是明文传输的,在公共WiFi下等于把密码写在明信片上寄出去。我截了图发给他们技术咨询邮箱,隔了三天收到自动回复:"您的信件已收到,我们会尽快处理。"
到现在也没下文。
但我不觉得沮丧。每个网站都是一扇门,有人把锁装得严实,有人只用根绳子系着。扫描不过是轻轻推一下,看门会不会自己开。这个世界上的门大多数都开着,只是没人去推而已。
