最近的工作着实有点忙,然后最近一次是处理XSS的BUG问题,这个还是第一次来接触。然后秉着解决问题的想法就查询了很多相关内容的博客。并且顺利解决了这个BUG,想了想还是来写个文章记录一下这个知识点吧。
XSS指的是跨站脚本,主要是在前端页面加载(页面渲染的阶段)的时候会执行注入的那段JS脚本。
例如:攻击者在请求时带上参数
localhost/test/submit.do?text=<script>alert(document.cookie);</script>
然后在前后端开发人员都未做处理的时候,在页面上回显<p>${text}</p>
这个时候就会执行上面的脚本。
XSS分类
XSS分为持久型XSS、反射型XSS。
反射型XSS
恶意文本属于受害者发送给网站的请求中的一部分。随后网站又把恶意文本包含进用于响应用户的返回页面中,发还给用户。
又或者通常我们收到的垃圾短信里面会有带链接的文本(或者是短链接),用户点击后就会访问带攻击性的URL达到XSS的攻击。
还有一种是基于DOM的XSS攻击,它也属于反射型的XSS。推荐文章:
https://segmentfault.com/a/1190000012253319
持久型XSS
持久型的XSS攻击的例子可以参考上面那个例子,在文本中将攻击代码带到后台,然后存储到数据库中。用户只要获取这个文本就会执行这段攻击代码,这种XSS攻击叫持久型的原因是攻击代码存储在数据库中,只要用户获取这段文本,服务器渲染页面给用户就会执行这个攻击代码。
常见的xss攻击方法
1.绕过XSS-Filter,利用<>标签注入Html/JavaScript代码;
2.利用HTML标签的属性值进行xss攻击。
例如:<img src=“javascript:alert(‘xss’)”/>;(当然并不是所有的Web浏览器都支持Javascript伪协议,所以此类XSS攻击具有一定的局限性)
3. 空格、回车和Tab。如果XSS Filter仅仅将敏感的输入字符列入黑名单,比如javascript,用户可以利用空格、回车和Tab键来绕过过滤,
例如:<img src=“javas cript:alert(/xss/);”/>;
4. 利用事件来执行跨站脚本。例如:<img src=“#” οnerrοr= “alert(1)”/>,当src错误的视乎就会执行onerror事件;
5. 利用CSS跨站。例如:Body {backgrund-image: url(“javascript:alert(‘xss’)”)};
6. 扰乱过滤规则。例如:<IMG SRC=“javaSCript: alert(/xss/);”/>;
7.利用字符编码,透过这种技巧,不仅能让XSS代码绕过服务端的过滤,还能更好地隐藏Shellcode;(JS支持unicode、eacapes、十六进制、十进制等编码形式)
8.拆分跨站法,将xss攻击的代码拆分开来,适用于应用程序没有过滤 XSS关键字符(如<、>)却对输入字符长度有限制的情况下;
9.DOM型的XSS主要是由客户端的脚本通过DOM动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行。容易导致DOM型的XSS的输入源包括:Document.URL、Location(.pathname|.href|.search|.hash)、
Document.referrer、Window.name、Document.cookie、localStorage/globalStorage;
预防XSS攻击
结合我项目中的情况。我对传入的参数的特殊字符进行转义的处理,即将(<、>、”)进行转义(<、>、")
如果前端在输入时能够对这些字符串进行转义处理也是可以达到这样的效果的。
方法还有很多,上面是我对这种攻击进行的处理方式。大家可以参考其他博客来学习更多的处理方法。
参考博客:
https://segmentfault.com/a/1190000012253319