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标签的属性输出:
比如:
${username},
此时的转义规则如下:
< 转成 <
> 转成 >
& 转成 &
" 转成 "
' 转成 '
2> javascript事件
除了上面的那些转义之外,还要附加上下面的转义:
\ 转成 \\
/ 转成 \/
; 转成 ;(全角;)
3> URL属性
如果