2017年,攻破网站一位安全研究员用一份公开的攻破网站Struts2漏洞利用代码,在半小时内拿到了某省级政务系统的攻破网站一台服务器权限。他没用什么高深技术,攻破网站只是攻破网站把网上现成的POC改了两个参数。这件事说明一个事实:大部分网站被攻破,攻破网站不是攻破网站因为攻击者多强,而是攻破网站因为防守方漏掉了太基础的东西。
攻破网站的攻破网站核心逻辑就一句话——找到系统处理输入时没考虑到的边界情况,让它执行本该拒绝的攻破网站操作。所有花哨的攻破网站术语,SQL注入、攻破网站XSS、攻破网站SSRF、攻破网站文件包含,攻破网站本质都是这个。
打开一个网站,第一步不是急着找漏洞,是搞清楚它跑在什么上面。浏览器按F12,看响应头里的Server字段、X-Powered-By字段。有时候直接暴露:Server: Apache/2.4.49。这个版本号一查,CVE-2021-41773,路径穿越漏洞,一个curl命令就能读服务器上的任意文件。2021年这个漏洞出来的时候,全球大量服务器中招,原因就是管理员没及时升级。
如果响应头被清理了,还有其他办法。URL后缀是.php还是.aspx,基本能判断后端语言。Cookie里有没有JSESSIONID,有的话大概率是Java应用。前端用了什么框架,看页面源码里的wp-content(WordPress)、/_next/(Next.js),这些指纹信息拼在一起,能缩小攻击面。
一个登录框,你输入用户名和密码,后端拿去数据库查。如果后端写的是SELECT * FROM users WHERE name='$name' AND pass='$pass',那你在一号输入框里填' OR 1=1 --,SQL语句就变成了SELECT * FROM users WHERE name='' OR 1=1 --' AND pass=''。条件永远为真,直接绕过登录。
这手法二十年前就有了,但现在还有网站在用。为什么?因为写代码的人觉得“前端已经校验了”。前端校验是给普通用户用的,攻击者直接发HTTP请求,根本不经过你的JavaScript。
SQL注入只是其中一种。搜索框输入<script>alert(1)</script>,如果页面直接把这段内容渲染出来,就是XSS。用户在浏览器里执行了攻击者的脚本,Cookie就被偷走了。还有一种更隐蔽的,叫盲注——页面不回显数据,但你可以通过页面响应时间或状态码的差异,一个字符一个字符地把数据库里的内容猜出来。我见过有人用sqlmap跑盲注,跑了六个小时,最后把管理员密码哈希拖出来了。
很多网站允许用户上传头像、附件。如果后端只检查了文件扩展名,你把shell.php改成shell.php.jpg,有些服务器照样当PHP解析。更粗暴的,直接在文件名里加空字节shell.php%00.jpg,老版本的PHP会截断后面的内容。
路径穿越也类似。一个下载文件的接口,URL是/download?file=report.pdf。你把它改成/download?file=../../../../etc/passwd,如果后端没做路径规范化,服务器的用户密码文件就被你读出来了。2021年Apache那个漏洞就是这个原理,攻击者用/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd读到了系统文件。
找到一个漏洞拿到一个shell,只是开始。实际攻防里,防守方会封IP、会打补丁、会查日志。攻击者要做的是维持访问、横向移动、清理痕迹。这涉及提权、内网穿透、权限维持,每一步都可能暴露。
我见过最离谱的一次,某网站后台用了默认密码admin/admin,登录进去之后发现数据库连接字符串直接写在配置文件里,数据库端口还对外网开放。从发现到拿到全站数据,总共花了不到十分钟。这不是技术问题,是态度问题。
攻破网站这件事,技术含量最高的部分往往不是“攻”,而是“发现”。发现那个别人没注意到的细节,发现配置里多出来的一行,发现某个接口忘了做权限校验。工具能帮你自动化扫描,但真正管用的漏洞,通常藏在业务逻辑里,扫描器扫不出来。