H5应用(包括运行在移动端WebView、PC浏览器及小程序Web-view组件中的页面)因跨平台、易分发的特点而广受欢迎,但也继承了Web应用的固有安全风险。中,跨站脚本攻击(XSS)和数据泄露是出现频率最高、危害最大的两类漏洞。我们将深入探讨如何对它们进行系统性的安全测试。
跨站脚本攻击(XSS)测试
XSS的重点在于攻击者能够将恶意脚本注入到页面中,并被他用户的浏览器执行。测试目的是发现所有可能的输入点,并验证输出是否被妥善处理。
1.XSS分类和测试方法
反射型XSS
原理:恶意脚本作为HTTP请求的一部分(如URL参数、POST数据),被服务器直接“反射”到返回的HTML页面中并立即执行。
测试步骤:
识别输入点:找到所有用户可控的输入,包括URL查询参数、表单项、HTTP头(如User-Agent,Referer)。
构造Payload:向这些输入点注入测试Payload,观察响应。
基础探测:<script>alert('XSS')</script>
绕过过滤:
使用大小写混合:<ScRiPt>alert(1)</ScRiPt>
使用HTML实体编码绕过:<script>alert(1)</script>
使用事件处理器:<imgsrc=xonerror=alert(1)>
使用javascript:协议:<ahref="javascript:alert(1)">点击</a>
使用SVG标签:<svgonload=alert(1)>
验证执行:检查返回的HTML源码,确认Payload是否被原样输出且未被转义。如果弹窗出现或通过浏览器开发者工具的Console看到脚本执行,则漏洞存在。
存储型XSS
原理:恶意脚本被持久化地保存到服务器(如数据库、文件系统),当他用户访问包含此数据的页面时,脚本被加载并执行。危害远大于反射型。
测试方法:
寻找持久化输入点:用户资料、评论、留言、文章内容、上传文件的文件名等。
注入和观察:使用和反射型XSS类似的Payload,提交到这些持久化功能点。
多上下文触发:访问所有可能展示该数据的页面(如个人主页、论坛帖子列表),观察脚本是否在不同上下文中都被执行。
DOM型XSS
原理:整个攻击过程完全在客户端浏览器中完成,不涉及服务器。前端JavaScript通过innerHTML、outerHTML、document.write()、eval()、location.hash等不安全的方式操作DOM,引入了恶意脚本。
测试方法(白盒+黑盒):
黑盒测试:在URL片段(Hash)或参数中注入Payload,如#<imgsrc=xonerror=alert(1)>。
代码审查(关键):审查前端JavaScript代码,寻找以下“危险”的Sink(接收点):
innerHTML/outerHTML
document.write()
eval()/setTimeout()/setInterval()中执行字符串
location/document.location/document.URL的直接使用
window.postMessage的事件监听器未验证来源
动态分析:使用浏览器开发者工具的“Debugger”功能,在这些危险的Sink处设置断点,跟踪数据流,看用户输入是否未经净化就流入中。
2.XSS测试的技巧
使用编码混淆:尝试使用不同的编码(如URL编码、Unicode编码)来绕过WAF(Web应用防火墙)或简单的输入过滤。
测试ContentSecurityPolicy:检查响应头中是否存在Content-Security-Policy。一个配置得当的CSP能极大地缓解XSS的影响。测试有效性,尝试寻找绕过策略的方法(如允许unsafe-inline或过宽的script-src域)。
数据泄露测试
数据泄露是指敏感信息被意外暴露给未授权方。测试目的是确保数据在传输、存储、显示三个环节都是安全的。
1.传输过程泄露
测试目的:验证所有敏感数据的传输是否都使用了强加密。
测试方法:
代理抓包:使用BurpSuite、Charles等工具拦截所有H5应用发起的网络请求(HTTP/HTTPS,WebSocket)。
检查协议:确认所有请求,特别是涉及登录、支付、个人信息查询的,都使用了HTTPS(TLS加密),而非明文的HTTP。
检查混合内容:一个HTTPS页面内是否加载了HTTP资源(脚本、图片、Iframe)。现代浏览器会阻止这种“混合内容”,但它仍是潜在的风险点。
2.客户端存储泄露
H5应用常在客户端存储数据以提升体验,但如果存储了敏感信息,则极易被泄露。
测试目的:检查所有客户端存储介质中是否包含敏感数据。
测试方法:
检查LocalStorage/SessionStorage:在浏览器开发者工具的“Application”标签下,直接查看这些存储空间。API密钥、Token、用户明文密码、个人身份信息(PII)绝不应存在于此。
检查IndexedDB/WebSQL:同样在“Application”标签下,检查这些更复杂的客户端数据库。
检查Cookies:检查Cookie是否被标记为Secure(仅HTTPS传输)和HttpOnly(禁止JavaScript访问,防XSS盗取)。会话标识符必须是HttpOnly的。
检查全局变量:在Console中输入window并展开,检查是否有敏感数据被意外暴露在全局对象上。
3.逻辑错误导致泄露
测试目的:验证业务逻辑的访问控制是否健全。
测试方法:
水平越权:用户A能否通过修改URL或请求体中的ID(如user_id=123)来访问用户B的数据。
垂直越权:普通用户能否访问或操作仅限管理员使用的功能API。
不安全的直接对象引用:应用程序直接使用数据库键值作为参数,未做权限校验。测试方法就是系统性地遍历这些ID。
错误信息泄露:触发应用的错误(如SQL语法错误、文件未找到),观察返回的错误信息是否暴露了堆栈跟踪、数据库结构、服务器路径等敏感信息。
4.缓存和浏览历史泄露
测试目的:确保敏感页面不被缓存,或敏感数据不暴露在历史记录中。
测试方法:
检查响应头:敏感页面的响应头应包含Cache-Control:no-store或no-cache。
测试浏览器历史:对于使用hash路由的SPA,确保敏感信息(如Token)不会作为URLhash的一部分被记录在浏览器历史中。
测试工具和流程建议
工具链:
代理工具:BurpSuite(专业版自带主动/被动扫描器)、OWASPZAP。
浏览器工具:Chrome/Firefox开发者工具是重点。
辅助工具:Postman(用于API测试)、Fiddler。
测试流程:
信息收集:爬取H5应用的所有功能点和接口。
手动测试为主,工具扫描为辅:自动化工具难以理解复杂的业务逻辑和DOM操作,因此手动测试至关重要。
渗透和验证:对发现的漏洞进行渗透验证,评估实际危害。
报告和修复:清晰描述漏洞原理、复现步骤、潜在危害,并提供修复建议(如:对输出进行编码、使用安全的DOMAPItextContent代替innerHTML、实施严格的CSP等)。
对H5应用进行XSS和数据泄露测试,要求测试人员具备深厚的Web安全知识,并采用系统化的方法,覆盖从用户输入到数据持久化和传输的每一个环节。通过持续的测试和修复,才能构建起坚固的安全防线。