OWASP之XSS漏洞(一)

XSS漏洞简介:

XSS(跨站脚本攻击,Cross-Site Scripting),允许攻击者在网页注入恶意脚本代码,当其他用户加载包含恶意代码的网站时候,就会触发该漏洞。

该漏洞攻击对象为受害者浏览器。

可能被注入的地方:微博、留言板、聊天室等收集用户输入的地方都可能被注入js代码,只要没有对用户的输入进行严格过滤,就可能被注入js代码。

XSS漏洞危害:

1、盗取各种用户账号;

2、窃取用户cookie资料,冒充用户身份进入网站;

3、劫持用户会话,执行恶意操作(操作用户浏览器);

4、刷流量,执行弹窗广告;

5、传播蠕虫病毒等等。

XSS的一般攻击流程:

首先要找到输入点和输出点(不能只找到输入点,还需要找到输出点,因为有输出点,浏览器才会解析恶意代码脚本)

攻击者将恶意代码注入到服务器中-》用户访问了被注入恶意代码的服务器-》服务器将含有恶意js代码的网页响应到了客户端-》在客户端浏览器中触发恶意js代码。

哪些地方存在输入点:url栏(如果是get传参数,可以在url寻找可能存在漏洞的地方);其次就是输入框。

防御方法:总体是对输入进行过滤,对输出进行编码。

1、对用户提交的数据进行严格过滤;

2、用户输入的内容,在输出到网页之前将其转换为HTML实体形式,比如将<转换为< 以阻止期作为HTML标签被解析;

3、设置HTTP头,限制网页可以加载的资源来源,防止外部恶意脚本的执行;

4、设置cookie为HTTP-only,防止通过js访问,减少被盗取后的风险等等。

类型:

1、反射型XSS:

参数型跨站脚本(一次性的),非持久性。注入恶意js代码在web应用的参数中,如搜索框中的反射型。

漏洞产生的原因:攻击者注入的数据反映在响应中(发送请求然后响应)。一个典型的非持久性XSS包含一个带XSS攻击向量的链接(可以理解为将路径导向具有恶意代码的网站的链接),每次进行XSS漏洞攻击的时候都需要用户点击这个链接,然后服务器返回一个响应包,里面就带着攻击者的eyijs代码,然后浏览器进行解析,就触发了该漏洞。

所以反射型的利用方式,就是诱导用户点击恶意链接。所以不要点击来历不明的链接。

除了常规地使用javascript弹框进行检测,还可以使用HTML事件方式触发。

2、DOM型XSS:

DOM型和反射型一样都是非持久性XSS即一次性,但是DOM型相比反射型XSS来说会更简单些。DOM型XSS的攻击代码不需要服务器解析响应(反射型和持久性都需要。),而是通过浏览器端的DOM解析来触发。攻击者可以通过客户端的js脚本访问浏览器的DOM并修改页面内容,不依赖服务器中的数据,直接从浏览器端获取数据并执行。这种类型的XSS漏洞通常在客户端直接输出DOM内容时候触发,例如使用document.getElementById("x").innerHTML或document.wtite等方法。

对页面的某个东西进行操作时,javascript就需要获得对html文档中所有元素进行访问的入口,这个入口就是dom,所以在dom型的xss漏洞利用中,dom可以看成一个访问html的标准程序接口。

可以使用HTML事件的方式或者使用javascript伪协议进行检测。

总结:作为企业,前两种(反射型和DOM型)漏洞一般都不会刻意去进行管理,而且很多时候给企业提交SRC的时候,都不会回复。

3、存储型XSS:恶意js代码不是某个参数,而是写进数据库或文件等可以永久保存数据的介质中。存储型xss通常发生在留言板等地方。多出现于论坛、博客和留言板中。攻击者在发帖的过程中,将恶意代码写入了帖子中,然后随帖子一起保存在了服务器中,当其他用户浏览这个帖子时,就会执行改恶意脚本。

存储型XSS可能出现的位置:

用户注册、留言板、上传文件的文件名处、管理员可见的报错信息、在线聊天框、客服、问题反馈区、邮件信箱

理论上,见框就插入

存储型XSS作用:获取cookie,内网IP等。

检测方法:存储型不使用弹框地方式进行检测,使用打印控制台日志来进行检测。

比如:<script>console.log(‘aa’);</script>,然后在控制台中查看是否打印出aa,如果打印出来了就说明代码生效了,就存在该漏洞。

XSS练习靶场:xss-labs-master

 

### Spring MVC 中基于 OWASPXSS 防护最佳实践 XSS(跨站脚本攻击)是种常见的 Web 安全漏洞,允许攻击者注入恶意脚本并影响其他用户。在 Spring MVC 应用程序中,可以通过多种方式结合 OWASP 推荐的最佳实践来有效防护 XSS 攻击。 #### 输入验证与清理 确保应用程序能够正确验证和清理来自客户端的所有输入数据。可以采用 JavaScript 或服务器端逻辑实现这目标。例如,在前端使用自定义函数对用户输入进行清理[^2]: ```javascript function sanitize(input) { const escapeMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return input.replace(/[&<>"']/g, function(match) { return escapeMap[match]; }); } ``` 上述代码片段展示了如何通过简单的替换策略清除潜在危险字符。然而,更复杂的场景可能需要依赖成熟的库如 DOMPurify 来完成更加全面的安全保障。 #### 输出编码 无论何时向 HTML 页面写入动态内容,都应对其进行适当形式的编码以防止意外解析为可执行代码。Spring 提供了内置支持用于自动转义模板中的变量值。如果正在使用 Thymeleaf,则只需启用 `th:utext` 属性即可获得默认保护措施;而对于 JSP 用户来说,推荐切换至 EL 表达式的标准语法 `${}` 并确认其已开启隐式转义功能[^1]。 另外值得注意的是,当涉及 JSON 数据返回给 AJAX 请求时也需格外小心。因为即使服务端已经做好充分准备,但如果前端框架未能妥善处理接收到的数据仍可能导致风险暴露。因此建议总是将响应体设置成纯文本而非直接嵌套于 script 标签内部[^5]。 #### CSRF Token 实现 虽然主要讨论的是针对 XSS 的解决方案,但实际上两者之间存在紧密联系——成功防范前者往往有助于间接缓解后者带来的威胁。具体而言,在每次提交表单前附加独无二且难以预测的次性令牌作为额外参数传递给后台校验不失为种行之有效的手段之: ```java @ControllerAdvice public class CsrfTokenResponseInterceptor extends HandlerInterceptorAdapter { @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { if (modelAndView != null && !CollectionUtils.isEmpty(modelAndView.getModel())) { CsrfToken csrf = (CsrfToken) modelAndView.getModel().get(CsrfToken.class.getName()); modelAndView.addObject("csrfToken", csrf.getToken()); } } } ``` 此拦截器负责提取当前会话关联的 CSRF token 并将其加入视图模型以便后续渲染过程中引用。 --- ### 总结 综上所述,要有效地应对 Spring MVC 环境下的 XSS 挑战,应当综合运用输入净化、输出编码以及引入必要的认证机制等多种技术手段共同构筑防线。同时定期开展安全性评估活动也是不可或缺的部分工作内容[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值