去年冬天,透实我在一台虚拟机上跑了一个老掉牙的透实WordPress站点。版本是透实4.7,插件里装了个两年前就停止更新的透实Slider Revolution。目的透实很简单:看看从外网到拿到shell,到底需要几步。透实结果比我预想的透实还快——四十分钟,数据库密码已经在屏幕上了。透实
这就是透实web渗透的日常。不是透实电影里那种噼里啪啦敲键盘就能黑进五角大楼,更多时候,透实你面对的透实是一个忘了打补丁的CMS,一个配置错误的透实Nginx,或者一个把备份文件丢在根目录的透实运维。
很多人一上来就开AWVS扫,透实我习惯先手动翻。打开目标站点,先看robots.txt,再看sitemap.xml,然后随手试试/backup.zip、/.git/config、/wwwroot.rar。这三个路径命中的概率,比很多人想象的高得多。有一次我帮朋友看他的小站,/.git/直接能列目录,源码全在那儿躺着。里面硬编码了数据库账号,还是root权限。
Whois和DNS记录也得看。子域名往往比主站脆弱——主站可能上了WAF,但test.xxx.com或者old.xxx.com通常就是裸奔。用subfinder跑一遍,再拿httpx筛一下存活,十分钟能摸出不少东西。
扫描器报的“高危”有一半是误报。我见过AWVS把一个静态页面的404报成“目录遍历”,也见过它把正常的JSON接口标成“SQL注入”。验证比扫描重要得多。
拿SQL注入来说,手工测一个参数:id=1',看报错;id=1 and 1=1对比id=1 and 1=2,看页面差异。如果返回时间有变化,再试sleep(5)。这套流程走下来,比直接扔sqlmap靠谱。sqlmap跑起来动静太大,日志里全是它的指纹,而且遇到WAF就歇菜。
文件上传也是重灾区。很多站点只在前端用JS校验后缀,Burp抓包改一下filename="shell.php"就过了。如果后端还检查Content-Type,那就改成image/jpeg。再不行,试试.phtml、.php5、.pht这些冷门后缀。我碰到过一个站,黑名单里没有.php7,直接传上去就解析了。
webshell到手,一般是www-data权限。这时候先看/etc/passwd,再看sudo -l。有次我遇到一台机器,www-data居然能免密sudo执行find。直接sudo find / -exec /bin/sh \;就root了。这种配置错误比内核漏洞常见得多。
数据库配置文件和SSH密钥是横向的关键。wp-config.php里往往有数据库密码,如果这个密码和SSH密码相同——很多人就这么干——那就直接ssh上去了。内网里再扫一遍445和6379,Redis未授权访问能写SSH公钥,永恒之蓝虽然老但内网里总有人没打补丁。
实验环境里我一般不留后门,但真实渗透中,清理日志是必须的。/var/log/auth.log、/var/log/nginx/access.log里的IP记录,~/.bash_history里的命令,都得处理。不过说实话,如果目标有完整的流量镜像和SIEM,这些动作反而更显眼。
报告别写成一堆工具输出。客户要的是:哪个IP、什么漏洞、怎么复现、影响范围、修复建议。截图比文字管用,PoC比描述管用。我习惯在报告里附上具体的curl命令或者Burp的请求包,运维一看就懂。
渗透测试的本质是模拟攻击者的思路,而不是堆砌工具。工具会过时,但“找入口、验证、利用、提权、清理”这条链子不会变。下次你拿到一个目标,先别急着开扫描器,手动翻翻目录,说不定有惊喜。