1、攻击是什么意思?
拿到本不该被拿到的隐私的信息。
比如,用户的登录状态;窃取 Cookie 信息;监听用户行为;修改 DOM;
其他攻击类型还有:
(1)网络钓鱼,包括盗取各类用户账号;
(2)窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作;
(3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等;
(4)强制弹出广告页面、刷流量等;
(5)网页挂马,进行恶意操作,例如任意篡改页面信息、删除文章等;
(6)进行大量的客户端攻击,如DDoS攻击;
(7)获取客户端信息,例如用户的浏览历史、真实IP、开放端口等;
(8)控制受害者机器向其他网站发起攻击;
(9)结合其他漏洞,如CSRF漏洞,实施进一步作恶;
(10)提升用户权限,包括进一步渗透网站;
(11) 传播跨站脚本蠕虫等;
2、XSS攻击的定义?
1)定义:(Croess SiteScripting)XSS意思是跨站脚本攻击(脚本代码注入)。
2)大致分为三种类型 :Persistent型(持久型),Non-persistent(反射型)及Dom-based型(区别是是否通过 HTTP 请求数据)。
反射型是最常用,也是使用得最广的一种攻击方式。它通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特有的恶意代码参数被HTML解析、执行。它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。
3、什么是CGI?
公共网关接口(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与浏览器进行交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括流行的C、C ++、Java、VB 和Delphi 等。
CGI分为标准CGI和间接CGI两种。标准CGI使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入输出方式。间接CGI又称缓冲CGI,在CGI程序和CGI接口之间插入一个缓冲程序,缓冲程序与CGI接口间用标准输入输出进行通信
4、XSS测试方法
1、工具扫描:APPscan、AWVS
2、手工测试:Burpsuite、firefox(hackbar)、XSSER XSSF
使用手工检测Web应用程序是否存在XSS漏洞时,最重要的是考虑那里有输入,输入的数据在什么地方输出。在进行手工检测XSS时,人毕竟不像软件那样不知疲惫,所以一定要选择有特殊意义的字符,这样可以快速测试是否存在XSS。
(1)在目标站点上找到输入点,比如查询接口,留言板等;
(2)输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理;
(3)通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);提交构造的脚本代码,看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
5、如何防御?
XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。
1、DOM 节点内容进行转义
对于一些标签的 < 和 > 进行转移,是他们在 HTML 中不会以一个 script 标签形式执行。
主要的思路就是将容易导致XSS攻击的边角字符替换成全角字符。< 和 > 是脚本执行和各种html标签需要的,比如 ,& 和 # 以及 % 在对URL编码试图绕过XSS filter时,会出现。我们说对输入的过滤分为白名单和黑名单。上面的XSS filter就是一种黑名单的过滤,黑名单就是列出不能出现的对象的清单,一旦出现就进行处理。还有一种白名单的过滤,白名单就是列出可被接受的内容,比如规定所有的输入只能是“大小写的26个英文字母和10个数字,还有-和_”,所有其他的输入都是非法的,会被抛弃掉。很显然如此严格的白名单是可以100%拦截所有的XSS攻击的。但是现实情况一般是不能进行如此严格的白名单过滤的。
对于输入,处理使用XSS filter之外,对于每一个输入,在客户端和服务器端还要进行各种验证,验证是否合法字符,长度是否合法,格式是否正确。在客户端和服务端都要进行验证,因为客户端的验证很容易被绕过。其实这种验证也分为了黑名单和白名单。黑名单的验证就是不能出现某些字符,白名单的验证就是只能出现某些字符。尽量使用白名单。
2、DOM 节点的处理
对于 DOM 节点影响比较大的就是单引号和双引号, 因为他们会关闭属性的值。所以也是对单引号和双引号进行字符转义。
3、JavaScript 代码的处理
对于避免造成 javascript 注入的情况,一般会对从 url 上取到的数据进行 encode ,这样就可以避免双引号提前封闭。
只是这里也要注意一下 ,这里一般会使用 encode 的方式格式化参数会更好一些,不然也要考虑类似 \" 这样的双引号转义符,是不是会和 下一个 " 又相互抵消。 当然,解决的方法还是给 \ 做转义。
4、富文本配置白名单
在富文本中,可以其实可以使用配置黑白名单的方法,配置禁止某些标签出现或者是只允许某些标签出现。
但更多时候建议使用的还是白名单,因为配置黑名单实在是太麻烦了而且一旦漏了,问题也就大了。网上已经有一些库可以使用,但是这些库是别人写的,可能有些地方不是自己想要的。所以,如果想完全定制那么就是使用白名单配置,如果只是一个小需求,快速开发影响也不大,那就可以考虑引用个库。
5、CSP(据说最有效防御手段,需验证)
前面说的一些防御方法是有效果,但是始终还是远远不够。所以,现在防御XSS 有一个更好的方法就是使用 CSP 规则。
CSP 概念
CSP 即 content security policy 内容安全策略,是一个 HTTP header ,用于指定哪些内容可以执行。
CSP 规则
child-src connect-src default-src...
child-src:指定一些子页面元素,比如 ifame 。
connect-src :指定网络请求比如 ajax 的请求。
default-src:默认规则,当其他规则没有配置时,会直接读取这里。
font-src ifame-src img-src
font-src:指定字体源。
ifame-src:指定 ifame 的访问域。
img-src:指定 图片资源的访问域。
script-src style-src
script-src :指定脚本访问域
style-src:指定样式文件访问域
配置方法
http.set(`content-security-policy`,`default-src 'self'`);
上面这个意思就是允许当前域下的任意请求。 至于详细配置,可以参考 ,https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP 这个说明。
6、对输出进行编码
1> 作为body文本输出,作为html标签的属性输出:
比如:
<span>${username}</span>, <p><c:out value="${username}"></c:out></p>
<input type="text" value="${username}" />
此时的转义规则如下:
< 转成 <
> 转成 >
& 转成 &
" 转成 "
' 转成 '
2> javascript事件
<input type="button" onclick='go_to_url("${myUrl}");' />
除了上面的那些转义之外,还要附加上下面的转义:
\ 转成 \\
/ 转成 \/
; 转成 ;(全角;)
3> URL属性
如果 <script>, <style>, <imt> 等标签的 src 和 href 属性值为动态内容,那么要确保这些url没有执行恶意连接。
确保:href 和 src 的值必须以 http://开头,白名单方式;不能有10进制和16进制编码字符。
7、HttpOnly 与 XSS防御
XSS 一般利用js脚步读取用户浏览器中的Cookie,而如果在服务器端对 Cookie 设置了HttpOnly 属性,那么js脚本就不能读取到cookie,但是浏览器还是能够正常使用cookie。
一般的Cookie都是从document对象中获得的,现在浏览器在设置 Cookie的时候一般都接受一个叫做HttpOnly的参数,跟domain等其他参数一样,一旦这个HttpOnly被设置,你在浏览器的 document对象中就看不到Cookie了,而浏览器在浏览的时候不受任何影响,因为Cookie会被放在浏览器头中发送出去(包括ajax的时 候),应用程序也一般不会在js里操作这些敏感Cookie的,对于一些敏感的Cookie我们采用HttpOnly,对于一些需要在应用程序中用js操作的cookie我们就不予设置,这样就保障了Cookie信息的安全也保证了应用。
如果你正在使用的是兼容 Java EE 6.0 的容器,如 Tomcat 7,那么 Cookie 类已经有了 setHttpOnly 的方法来使用 HttpOnly 的 Cookie 属性了。
1cookie.setHttpOnly(true);
设置完后生成的 Cookie 就会在最后多了一个 ;HttpOnly
另外使用 Session 的话 jsessionid 这个 Cookie 可通过在 Context 中使用 useHttpOnly 配置来启用 HttpOnly,例如:
<Context path="" docBase="D:/WORKDIR/oschina/webapp" reloadable="false" useHttpOnly="true"/>
也可以在 web.xml 配置如下:
<session-config>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
<session-config>
对于 不支持 HttpOnly 的低版本java ee,可以手动设置(比如在一个过滤器中):
String sessionid = request.getSession().getId();
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");
8、其他注意点
csp 规则一般会在服务器配置,当然前端页面也是可以配置,但是更多的是以服务器为准,在日常开发中也经常会遇到引用了第三方的东西,这个时候 csp 规则不通过,都需要向服务器端的同学要求加个规则。
参考链接
1、反射型xssDemo
https://blog.csdn.net/huli870715/article/details/8615473
2、CGI(通用网关接口)
https://baike.baidu.com/item/CGI/607810?fr=aladdin&fromid=6717913&fromtitle=%EF%BC%A3%EF%BC%A7%EF%BC%A9