【32】WEB安全学习----XSS攻击1
关于XSS跨站脚本攻击有太多文章和教材提供了,本章就简单介绍XSS攻击原理,重点介绍XSS代码构造和绕过。
一、XSS攻击原理
XSS攻击:即跨站脚本攻击,是指攻击者在网页中嵌入客户端JavaScript脚本,当用户使用浏览器浏览嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。
JavaScript可以用来获取用户cookie、改变网页内容、URL跳转等等,那么存在XSS漏洞的网站就可以盗取用户cookie、黑掉页面、导航到恶意网址等。
XSS攻击分为三类:反射型、存储型、DOM型。
反射型XSS
反射性XSS也叫非持久型XSS,是最容易出现的一种XSS漏洞,当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞。这个过程就像一次反射,故称为反射型XSS。
存储型XSS
存储型XSS又被称为持久型XSS,存储型XSS是最危险的一种跨站脚本。
允许用户存储数据的Web应用程序都可能出现存储型XSS漏洞,当攻击提交一段XSS代码后,被服务器端接受并存储,当攻击者再次访问页面时,这段XSS代码就会被读取出来并响应给浏览器,造成XSS跨站攻击。
DOM型XSS
学过JavaScript都知道DOM(文档对象模型),使用DOM可以允许程序动态的访问和跟新文档的内容和结构。
而基于DOM型的XSS是不需要与服务器端交互的,它只发生在客户端处理数据阶段。
二、XSS攻击利用
JavaScript语言非常强大,可以做很多事情,可利用JavaScript做如:经纬度定位、获取HTML源码、H5截屏、端口扫描、CSRF攻击、键盘记录、页面伪造、点击劫持、钓鱼等等。
具体功能可参考BEFF和一些XSS利用平台。
三、XSS攻击修复
1、HttpOnly
HttpOnly最早由微软提出,如今已成为一个标准,浏览器将禁止页面的JavaScript访问带有HttpOnly属性的Cookie。
所以,HttpOnly是解决XSS攻击后的Cookie劫持攻击,而不是解决XSS攻击。
2、输入检查
对用户提交的数据进行检查,如长度、类型等检查,或采用XSS Filter过滤器进行XSS检查。
3、输出编码
可采用HTML实体编码HtmlEncode。对&、<、>、"、'、/等进行转义编码。
四、XSS构造研究
1、插入<>标记
如果能插入<>标记,那么就能操作一个html标签,然后通过<script>标签就能插入任意的脚本代码。
<script>alert(/xss/)</script>
2、利用HTML标签属性值执行XSS
如果不能构造自己的HTML标签,但是还是可以通过其他形式来执行XSS,如HTML标签的属性值。
很多HTML标签中的属性都支持JavaScript:[code]伪协议的形式,如:
<img src="javascript:alert('xss');">
<table background="javascript:alert('xss');">
但目前支持这种伪协议的浏览器为老版本,如IE6。
并不是所有的标记属性都能产生XSS,通常只有引用文件的属性才能触发XSS。
如:href=、lowsrc=、bgsound=、background=、value=、action=、dynsrc=等等。
经测试,火狐、谷歌浏览器均不支持此伪协议:
只有IE6支持此伪协议:
3、利用事件触发
因为标签属性值只有特定浏览器才能触发,如IE6,那么有没有其他办法呢?事件就是其中一种方法。
事件就是浏览器自身执行的某种动作,如click、mouseover、load等,而响应事件的函数叫做事件处理函数(事件侦听器)。如:
<img src="#" onerror=alert(/xss/)>
onerror是IMG标记的一个事件,只要页面中发生错误,该事件立即被**。
4、利用CSS进行跨站攻击
使用CSS样式表执行JavaScript具有隐蔽性、灵活多变等特点,但是CSS样式表有一个很大的缺点:各浏览器不能通用,甚至于同一浏览器不同版本之间都不能通用。
<div style="background-image:url(javascript:alert(/xss1/))">
<style>
body {background-image:url("javascript:alert(/xss2/)");}
</style>
<style>
@import 'javascript:alert("xss3")';
</style>
经测试,此代码也只能在IE6中被触发:
可见,以上能通杀的就只有利用事件进行触发的方法。
5、XSS绕过
大小写绕过:jaVaSCript
单双引号互用:<img src='xxx'>、<img src="xxx">
不用引号:<img src=javascript:alert(xss);>
绕过空格:<img/src="javascript:alert('xss');">
编码绕过:HTML属性值支持ASCII码。
通用:
十进制编码
<img src="#" onerror=alert(/xss5/)>
十六进制编码
<img src="#" onerror=alert(/xss5/)>