为何软件测试者需要了解OWASP TOP 10?
OWASP(开放Web应用安全项目)TOP 10,是一份由全球安全专家共同梳理出的、最具代表性和危害性的Web应用安全风险清单。它不仅是一份威胁目录,更是一张安全的“检查清单”。对于软件测试从业者而言,掌握OWASP TOP 10意味着:
- 补齐知识短板:在传统测试维度上,增加安全维度,提升个人综合竞争力。
- 建立风险地图:面对复杂应用时,能快速定位高危攻击面,提高测试效率。
- 推动安全左移:在测试阶段主动发现并推动修复安全漏洞,降低项目后期修复成本。
本文将从漏洞原理简述和手工检测速成两个方面,为您逐一拆解2021版(当前最新版)OWASP TOP 10的核心内容,力求通俗实用。
A01:2021-失效的访问控制
漏洞原理:
访问控制决定了“谁能访问什么资源”。失效的访问控制意味着系统未能正确执行这一策略,导致攻击者能够绕过身份验证或权限检查,访问未授权数据或执行未授权操作。例如,通过修改URL参数中的用户ID,直接访问他人账户数据。
手工检测速成:
- 水平越权测试:使用同一权限级别的不同账户(如普通用户A和B)。登录用户A,获取其专属资源链接(如
/user/view?id=1001),退出登录,再登录用户B,直接尝试访问用户A的链接(将id改为1001),看是否成功。 - 垂直越权测试:使用一个低权限账户(如普通用户)。登录后,寻找其界面中可能隐藏的高权限功能接口或URL(如
/admin/deleteUser)。直接尝试访问或调用,检查系统是否仅依赖前端菜单隐藏,而未在后台进行权限校验。 - 直接对象引用测试:遍历或猜测资源的标识符,如订单号、文件名(
/download?file=confidential.pdf)、数据库记录ID等,看能否访问到不属于自己的数据。 - 检查敏感URL/API接口:检查
robots.txt文件,或使用浏览器开发者工具观察网络请求,发现后台管理、配置、API接口地址。尝试未授权直接访问。
A02:2021-加密机制失效
漏洞原理:
这不是指未加密,而是不正确或不安全地使用加密技术。包括:使用弱加密算法(如MD5、SHA-1)、在传输或存储中未加密敏感数据(如密码、信用卡号)、硬编码密钥、使用默认或弱加密密钥、不正确地验证SSL/TLS证书等。
手工检测速成:
- 检查传输安全(HTTPS):
- 确认登录、支付等所有敏感操作的页面是否全程使用
https://。 - 使用浏览器检查证书有效性(点击地址栏锁标志),确认是否为受信任机构签发、是否过期。
- 尝试将
https手动改为http访问敏感页面,观察系统是强制跳转回https还是允许不安全访问。
- 确认登录、支付等所有敏感操作的页面是否全程使用
- 检查会话管理:
- 登录后,检查Cookie(如
sessionid,jsessionid)是否标记了Secure(仅HTTPS传输)和HttpOnly(防止XSS窃取)属性。可以在浏览器开发者工具的“应用程序”(Application)标签页查看。 - 登出后,尝试用之前的会话Cookie再次访问需要登录的页面,看会话是否真正失效。
- 登录后,检查Cookie(如
- 推测性检查:
- 在登录或注册时,提交后观察浏览器开发者工具“网络”标签中的请求,查看密码等敏感数据在请求体中是明文还是密文?即使是密文,也可能是前端加密,需结合后端验证。
A03:2021-注入
漏洞原理:
攻击者将恶意数据(命令或查询语句)作为指令的一部分发送给解释器(如SQL、NoSQL、OS命令、LDAP解释器),欺骗解释器执行非预期的命令或访问未授权数据。最常见的仍是SQL注入。
手工检测速成(以SQL注入为例):
- 寻找注入点:任何用户可控的输入点都可能成为入口,如URL参数(
?id=1)、表单字段(搜索框、登录框)、HTTP头部(如Cookie、User-Agent)。 - 基础探测:在疑似注入点输入特殊字符,观察应用反应。
- 单引号探测:输入
'。如果页面返回数据库错误信息(如MySQL、SQL Server错误),则存在注入可能。 - 永真/永假条件探测:
- 对于数字型参数(如
id=1),尝试改为id=1 and 1=1和id=1 and 1=2。观察页面内容是否因逻辑真假而不同。 - 对于字符串型参数(如
name=admin),尝试name=admin' and '1'='1和name=admin' and '1'='2。
- 对于数字型参数(如
- 单引号探测:输入
- 简单联合查询尝试:如果应用返回了数据库错误,可以尝试闭合原有语句并拼接查询。例如:
id=1' order by 5--(猜测列数),id=-1' union select 1,2,database()--(查询数据库名)。注意:此步骤仅用于验证学习,在未授权测试环境中禁止使用。
A04:2021-不安全设计
漏洞原理:
这是一个较新的类别,强调在设计阶段就存在的安全缺陷,而非编码或配置错误。例如,缺乏关键的威胁建模、安全设计模式,业务逻辑本身存在安全缺陷(如奖励机制可被无限刷取)。
手工检测速成:
这需要测试者更多地从业务逻辑和架构层面思考,而非简单的输入输出测试。
- 业务逻辑滥用测试:
- 重复提交:完成一个业务操作(如领券、抽奖)后,不刷新页面,快速重复提交请求(可借助浏览器开发者工具重放请求),看是否被重复执行。
- 流程绕过:分析关键业务流程(如找回密码:1输入邮箱->2验证码验证->3重置密码)。尝试不进行第2步,直接跳转到第3步的URL并提交请求。
- 负值或极值测试:在涉及金额、数量、积分的地方,尝试输入负数、0或极大的数值,看系统如何处理。
- 设计缺陷思考:问自己:“这个功能的设计初衷是什么?一个恶意用户可能会如何歪曲这个设计?”例如,一个“邮箱+验证码”的注册接口,是否缺乏防短信轰炸和验证码暴力破解的设计?
A05:2021-安全配置错误
漏洞原理:
由于不安全的默认配置、不完整的临时配置、开放的云存储、错误配置的HTTP头部、冗杂的错误信息等导致的安全问题。攻击往往通过未修复的漏洞、默认账户、未使用的页面等方式发起。
手工检测速成:
- 信息泄露探测:
- 访问
/robots.txt,/sitemap.xml,/.git/,/.svn/,/.env等常见配置文件或目录,看是否存在信息泄露或源码泄露。 - 触发应用错误(如注入探测时),观察返回的错误信息是否过于详细(暴露堆栈跟踪、数据库结构、服务器版本等)。
- 访问
- 检查默认/调试功能:
- 尝试访问管理后台的默认路径,如
/admin,/wp-admin,/manager/html等。 - 在URL后添加
/.php或/index.php等后缀,检查是否存在备份文件(如index.php.bak,index.php.swp)。
- 尝试访问管理后台的默认路径,如
- 检查HTTP安全头:
- 使用浏览器开发者工具“网络”标签,或在线工具,检查响应头是否包含关键安全头部:
Content-Security-Policy: 防止XSS。X-Frame-Options: 防止点击劫持。X-Content-Type-Options: nosniff: 防止MIME类型混淆。
- 使用浏览器开发者工具“网络”标签,或在线工具,检查响应头是否包含关键安全头部:
A06:2021-脆弱和过时的组件
漏洞原理:
应用程序使用了包含已知漏洞的组件(库、框架、模块),且这些漏洞可被利用。已知漏洞包括未打补丁的CVE(公共漏洞和暴露)。攻击者利用一个组件的漏洞,可能造成数据泄露或服务器沦陷。
手工检测速成:
- 识别技术栈:
- 观察Cookie名称(如
JSESSIONID可能为Java,PHPSESSID为PHP)、错误信息、HTTP响应头(如Server: nginx/1.18.0,X-Powered-By: Express)。 - 查看网页源码,从引用的JavaScript/CSS库路径(如
/jquery-1.8.3.min.js)或注释中推断。
- 观察Cookie名称(如
- 检查已知公开漏洞:
- 将识别出的组件名称和版本号,到中国国家信息安全漏洞共享平台(CNVD)等漏洞库进行搜索。
- 重点关注:Struts2, Spring, Log4j2, Fastjson,以及老版本的Web服务器、数据库等。
- 手工测试示例:如果怀疑是某个版本的Apache Struts2有远程代码执行漏洞,可以尝试在URL后附加特定的测试Payload(需根据公开的POC构造),观察响应。注意:此操作风险极高,仅应在授权测试环境中进行。
A07:2021-身份认证和识别失败
漏洞原理:
认证(登录)和会话管理功能实现不当,允许攻击者破解密码、密钥或会话令牌,或暂时或永久地冒充其他用户的身份。例如,允许弱密码、暴力破解、在URL中暴露会话ID、会话固定攻击等。
手工检测速成:
- 弱密码策略测试:
- 尝试注册或修改密码时,设置如
123456、password、与用户名相同的密码等,看系统是否接受。
- 尝试注册或修改密码时,设置如
- 暴力破解测试(谨慎进行):
- 观察登录失败后的提示信息。是否区分“用户名不存在”和“密码错误”?统一的错误提示更安全。
- 查看登录失败多次后,是否有账户锁定、验证码(CAPTCHA)或登录延时等防护机制。
- 会话管理测试:
- 会话固定:在未登录状态下获取一个会话ID(Session Cookie),然后用这个会话ID去登录。登录成功后,检查会话ID是否发生变化。如果没变,则存在会话固定风险。
- 登出测试:登录后,点击退出。然后尝试用浏览器“后退”按钮回到登录后的页面,或直接重新输入登录后页面的URL,看是否仍然可以访问。
A08:2021-软件和数据完整性故障
漏洞原理:
指在不验证完整性的情况下,使用来自不受信任来源的软件或数据。例如,从不可信的CDN加载JavaScript库、不安全的CI/CD管道被入侵导致恶意代码被部署、自动更新机制未签名验证等。
手工检测速成:
对于测试者,此漏洞的检测更多在于检查和提问。
- 检查外部资源:使用浏览器开发者工具“网络”标签,查看页面加载的所有资源(JS、CSS、图片)。检查是否有从非官方、不可信的第三方域名加载的脚本(如
http://untrusted-cdn.com/jquery.js)。 - 询问与审查:
- 向开发团队询问:项目的依赖包(
package.json,pom.xml,requirements.txt)是否从官方源获取?是否校验过哈希值? - CI/CD流程中,代码构建和部署的环节是否有安全校验?谁有权限触发部署?
- 客户端(如手机App)的更新包是否经过数字签名校验?
- 向开发团队询问:项目的依赖包(
A09:2021-安全日志和监控故障
漏洞原理:
缺乏有效的日志记录、监控和告警,导致发生安全事件时无法及时检测、告警和响应。例如,未记录登录失败、关键业务操作;日志未妥善保护被篡改;实时告警缺失等。
手工检测速成:
- 触发并检查日志记录:
- 执行一系列应被记录的操作:多次登录失败、修改密码、敏感数据导出、高权限操作(如添加管理员)。
- 然后向运维或开发团队询问:“我刚才做了X操作,能帮忙查一下后台日志是否有完整记录吗?记录里包含了哪些关键信息(时间戳、源IP、用户标识、操作类型、结果)?”
- 检查日志保护:如果条件允许(如测试环境),询问日志文件的存储位置和访问权限。是否所有内网用户都可随意读写?这可能导致日志被攻击者删除以掩盖行踪。
A10:2021-服务端请求伪造 (SSRF)
漏洞原理:
攻击者诱使服务器端应用向攻击者选定的内部或外部系统发起HTTP请求。利用此漏洞,攻击者可以绕过防火墙等网络边界控制,扫描或攻击内网服务,甚至在某些情况下读取服务器本地文件。
手工检测速成:
- 寻找SSRF潜在点:寻找应用中任何由用户提供URL或IP地址,并由服务器发起二次请求的功能。例如:
- 网页内容抓取/预览功能。
- 文档转换/处理服务。
- 从指定URL下载文件的功能。
- 设置头像时支持远程URL。
- 基本探测:
- 如果发现此类功能,尝试让服务器请求一个你自己可控的外网服务器(如使用
http://your-webhook-site.com/, 或http://127.0.0.1:8080这样的内网地址)。 - 观察你的服务器是否收到了来自目标应用的请求。如果收到,说明存在SSRF。
- 如果发现此类功能,尝试让服务器请求一个你自己可控的外网服务器(如使用
- 尝试访问内部资源:在授权测试环境中,可以尝试请求内网地址,如
http://192.168.1.1(路由器)、http://127.0.0.1:3306(MySQL数据库)或file:///etc/passwd(读取本地文件),观察应用响应(可能是时间延迟、错误信息或返回的数据)。