甲方工作以来,深感安全与研发的种种矛盾点,安全:为什么研发一点都不懂安全,研发:为什么安全一点都不懂开发?本着平衡的理念,开启了从开发视角着手如何降低代码漏洞与从安全测试视角着手如何测出漏洞的思路,进行安全checklist梳理,以此更好的推进安全开发落地,今天先来第一篇AJAX安全。AJAX基本概念AJAX是 "Asynchronous JavaScript and XML" 的缩写,意为“异步JavaScript和XML”。它是一种Web开发技术,允许网页与服务器进行异步通信,无需重新加载整个页面即可更新网页的部分内容。
核心组件:JavaScript:使用JavaScript来创建请求、发送数据和处理响应。XMLHttpRequest或 Fetch API:用于在浏览器中创建HTTP请求。JSON或 XML:常用的数据交换格式,JSON因其简洁性而更受欢迎。工作原理发起请求:使用JavaScript创建一个HTTP请求,发送到服务器。服务器响应:服务器处理请求并返回数据(通常是JSON或XML格式)。处理数据:JavaScript接收到数据后,更新页面的相应部分,而无需重新加载整个页面。AJAX的优势用户体验:页面无需全页刷新,提供更流畅的交互体验。性能:减少不必要的数据传输,提高页面加载速度。灵活性:可以独立于服务器逻辑更新前端页面。举例:搜索建议:当你在搜索引擎中输入查询时,可能会看到下拉列表中实时显示搜索建议。这是通过AJAX实现的,它在后台发送请求到服务器,然后动态更新搜索建议列表。动态内容加载:社交媒体网站中的“加载更多”功能,允许用户在滚动到页面底部时加载更多内容,而不是刷新整个页面。实时聊天应用:在线聊天应用通常使用AJAX来实时接收和发送消息,无需刷新页面即可查看新消息。动态表单验证:当你在网站上填写表单时,AJAX可以在后台验证输入的有效性,并实时给出反馈,比如检查用户名是否已被注册。股票价格更新:金融网站上的股票价格可能会每隔几秒自动更新,这是通过AJAX定期从服务器获取最新数据实现的。AJAX安全(研发视角):客户端(JavaScript)使用 .innerText而非 .innerHTML使用 .innerText属性,因为它会自动对文本进行编码,降低XSS的风险
禁止使用 eval函数eval()函数在JS中可有将字符作为代码执行,可能会导致RCE、XSS等风险。
对数据进行规范化处理(即在使用前进行编码)当使用数据构建 HTML、脚本、CSS、XML、JSON 等时,需要正确对数据进行编码,以防止注入式问题,并确保逻辑意义得以保留。
所有逻辑实现均需放在服务端来实现针对客户端的攻击手法很多,包括可以使用多种浏览器插件来设置断点、跳过代码、更改值等。同时攻击者有可能会绕过客户端的逻辑。
避免编写序列化代码避免动态构建 XML 或 JSON动态构建xml或json时容易出现注入问题,或者至少使用编码库或安全的 JSON 或 XML 库来确保属性和元素数据的安全。如json-stringify-safe、libxml、RapidXML等
不要在客户端代码中执行加密所有的密钥均需要存在服务器端,同时并在服务器端进行加密
服务器端使用 CSRF 保护使用CSRFToken规避CSRF攻击
始终返回最外层为对象的 JSON始终让 JSON 字符串的最外层原始类型是一个对象:
可利用的:
json
[{"object":"inside an array"}]
不可利用的:
json
{"object":"not inside an array"}
同样不可利用的:
json
{"result":[{"object":"inside an array"}]}
避免在服务器端编写序列化代码服务可能被用户直接调用,需要做好校验避免手工构建 XML 或 JSON,尽可能使用框架进行构建使用框架安全地进行操作,尽量避免手工操作
对 Web 服务使用 JSON 和 XML SchemaAJAX安全(安全人员视角):从安全人员的视角来看,如何进行ajax测试呢?这里我简单梳理部分checklist供各位师傅参考
1. 输入验证验证AJAX请求是否对所有用户输入进行了充分的验证。2. 输出编码检查AJAX响应是否对输出进行了适当的编码,以防止XSS攻击。3. AJAX特定XSS防护测试AJAX响应中的数据是否可能导致跨站脚本(XSS)。4. CSRF令牌检查确保AJAX请求中包含CSRF令牌,并在服务器端进行验证。5. 访问控制测试AJAX端点是否正确实施了访问控制,防止未授权访问。6. 身份验证和会话管理验证AJAX请求是否在需要时正确地进行了身份验证和会话管理。7. AJAX端点的隐藏和保护确保AJAX端点不被搜索引擎索引,且难以被猜测。8. 安全配置检查AJAX请求是否使用了安全的配置,例如使用HTTPS。9. 错误处理检查AJAX请求的错误处理是否安全,不泄露敏感信息。10. AJAX请求的速率限制测试AJAX端点是否存在速率限制,以防止暴力攻击。11. AJAX响应的缓存和存储确保敏感数据不被浏览器缓存或本地存储不当存储。12. AJAX请求的来源检查验证AJAX请求是否来自合法的页面或框架。13. 第三方库和框架的安全性检查使用的AJAX相关库和框架是否有已知漏洞。14. AJAX接口的API安全性测试AJAX接口的API调用是否安全,例如检查参数範围和类型。15. 跨域资源共享(CORS)检查CORS策略是否正确配置,防止恶意的跨域请求。16. AJAX请求的日志记录确保AJAX请求的日志记录不包含敏感信息。17. 数据泄露防护测试AJAX请求和响应是否可能导致数据泄露。18. 移动设备上的AJAX安全针对移动应用中的AJAX请求进行专项测试。19. AJAX请求的完整性验证检查是否对AJAX请求的数据进行了完整性验证。20. 测试AJAX请求的可篡改性验证AJAX请求参数是否可以被篡改。