一、XSS的基本概念
XSS又叫CSS (Cross Site Script) ,为了和css(层叠样式表)区分,我们通常称它为(xss)跨站脚本攻击。它指的是恶意攻击者往
Web 页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。
xss是一种发生在web前端的
漏洞 ,所以其危害的对象也主要是前端用户.在OWASP Web Application Top 10排行榜中长期霸榜,从未掉出过前三名。XSS这类安全问题发生的本质原因在于,
浏览器 错误的将攻击者提供的用户输入数据当做JavaScript脚本给执行了。
XSS有几种不同的分类办法,例如按照恶意输入的脚本是否在应用中存储,XSS被划分为“存储型XSS”和“反射型XSS”,如果按照是否和服务器有交互,又可以划分为“
Server Side XSS”和“DOM based XSS”。
二、XSS攻击的主要途径
XSS攻击方法只是利用HTML的属性,作各种的尝试,找出注入的方法。现在对三种主要方式进行分析。
第一种:对普通的用户输入,页面原样输出,用户通过对JSCODE的伪装,经过一些操作就会跳出一个木马界面,取得登录用户的Cookie. 第二种:在代码区里有用户输入的内容,原则就是,代码区中,绝对不应含有用户输入的东西。 第三种:允许用户输入HTML标签的页面。 用户可以提交一些自定义的HTML代码,这种情况是最危险的。因为,IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,又可以使用”/”连接16进制字符串来写,使得过滤变得异常复杂
三、XSS攻击的危害包括:
(1)窃取管理员帐号或Cookie,入侵者可以冒充管理员的身份登录后台。使得入侵者具有恶意操纵后台数据的能力,包括读取、更改、添加、删除一些信息。
(2)窃取用户的个人信息或者登录帐号,对网站的用户安全产生巨大的威胁。例如冒充用户身份进行各种操作。
(3)网站挂马。先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该挂马页面时,用户的计算机会被植入木马。
(4)发送广告或者垃圾信息。攻击者可以利用XSS漏洞植入广告,或者发送垃圾信息,严重影响到用户的正常使用。
(5)控制受害者机器向其它网站发起攻击
四、XSS的分类
XSS可以分为三种:反射型XSS(非持久型)、存储型XSS(持久型)和DOM XSS。
反射型XSS
用户在请求某条URL地址的时候,会携带一部分数据。当客户端进行访问某条链接时,攻击者可以将恶意代码植入到URL,如果服务端未对URL携带的参数做判断或者过滤处理,直接返回响应页面,那么XSS攻击代码就会一起被传输到用户的浏览器,从而触发反射型XSS。
例如,当用户进行搜索时,返回结果通常会包括用户原始的搜索内容,如果攻击者精心构造包含XSS恶意代码的链接,诱导用户点击并成功执行后,用户的信息就可以被窃取,甚至可以模拟用户进行一些操作。它的利用过程如图所示。
反射型XSS不会永久存储用户的数据,仅发生在用户的一次访问过程之后。这个过程就像一次反射,因此得名反射型XSS。反射型XSS的触发条件比较苛刻,需要攻击者想方设法引导用户点击链接,但产生的危害不容忽视。
存储型XSS
存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(
数据库 、内存、文件系统等),下次请求目标页面时不用再提交XSS代码。最典型的例子就是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言就会从数据库中加载出来并显示,于是出发了XSS攻击
DOM XSS
DOM XSS和反射型XSS、存储型XSS的区别在于DOM XSS代码并不需要服务器参与,出发XSS靠的是浏览器的DOM解析,完全是客户端的事情,文档型的 XSS 攻击并不会经过服务端,而是作为中间人的角色,在数据传输过程劫持到网络数据包,然后修改里面的 html 文档,这样的劫持方式包括WIFI路由器劫持或者本地恶意软件等。
五、防范措施
明白了三种XSS攻击的原理,我们能发现一个共同点 都是:让恶意脚本直接能在浏览器中执行。那么要防范它,就是要避免这些脚本代码的执行。
简单来讲就是永远不要相信任何用户的输入!
无论是在前端和服务端,都要对用户的输入进行转码或者过滤。
当然也可以利用关键词过滤的方式,将 script. 标签给删除。那么现在的内容只剩下:
什么也没有了:)
利用 CSP
CSP,即浏览器中的内容安全策略,它的核心思想就是服务器决定浏览器加载哪些资源,具体来说可以完成以下功能:
限制其他域下的资源加载。
禁止向其它域提交数据。
提供上报机制,能帮助我们及时发现 XSS 攻击。
利用 HttpOnly
很多 XSS 攻击脚本都是用来窃取Cookie, 而设置 Cookie 的 HttpOnly 属性后,JavaScript. 便无法读取 Cookie 的值。这样也能很好的防范 XSS 攻击。
防御手册
https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
自动检测dom缺陷的chrome插件 http://code.google.com/p/domsnitch/
**** XSS过滤绕过请参考 https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet。
当网站应用清理输入、网站应用防火墙或浏览器内置的机制阻止恶意输入时,反射型xss就会被阻拦。但是
测试 者必须假定浏览器不会阻拦这类攻击,比如版本陈旧、内置安全功能被禁用等,并测试所有可能的漏洞。类似的,网站防火墙不能保证识别新奇的、未知的攻击。攻击者能构造防火墙无法识别的攻击字符串。 因此,防御xss攻击主要依赖网站应用清理不可信任的用户输入。有几种清理办法,比如返回错误、过滤或转义关键字。同时这些预防手段也造就了另外一个弱点:黑名单不可能囊括所有可能的攻击字符串、白名单可能过渡授权,这时清理就会失败,导致某类输入被不正确的信任并未被清理。
**** 攻击测试的例子
- http://example.com/index.php?user=
alert(123) - http://example.com/index.php?user=
window.onload = function() {var AllLinks=document.getElementsByTagName("a"); AllLinks[0].href = "http://badexample.com/malicious.exe"; } - 标签属性值
" nfocus="alert(document.cookie)
- 不同的语法或编码
">"%3cscript%3ealert(document.cookie)%3c/script%3e
- 非递归性过滤
ipt>alert(document.cookie)
- 绕过正则过滤
模式串 $re = "/
六、抵御XSS
抵御XSS攻击,只需做到两点即可:
1、所有前端的页面渲染,尽量使用ajax异步进行,从后台获取要显示的数据。
2、前端提交过来的数据,在后台入口处统统对HTML中的关键字进行html编码转义。
做到上面方可基本无忧。
/* 1.用正则表达式实现html转码 */
htmlEncodeByRegExp(str) {
let s = '';
if (str.length === 0) return '';
s = s.replace(//g, '>');
s = str.replace(/&/g, '&');
s = s.replace(/ /g, ' ');
s = s.replace(/\'/g, '''); //eslint-disable-line
s = s.replace(/\"/g, '"'); //eslint-disable-line
return s;
},
/* 2.用正则表达式实现html解码 */
htmlDecodeByRegExp(str) {
let s = '';
if (str.length === 0) return '';
s = s.replace(/</g, '<');
s = s.replace(/>/g, '>');
s = str.replace(/&/g, '&');
s = s.replace(/ /g, ' ');
s = s.replace(/'/g, "\'"); //eslint-disable-line
s = s.replace(/"/g, '"'); //eslint-disable-line
return s;
},
可使用 he 组件 来进行转码