XSS(Cross Site Scripting)跨站脚本攻击,为区别于CSS改首字母为X。XSS攻击使一种注入攻击,攻击者在网页中插入精心构造的JS(Javascript)代码,当用户浏览网页时便会触发恶意代码。
XSS带来的危害:窃取用户身份凭证cookie信息、控制用户浏览器功能点,强制发表文章,强制转账、获取受害者浏览器信息(浏览记录、主机信息、真实ip、开放端口等)、控制受害者浏览器向其他网站发起恶意请求、传播蠕虫病毒。
XSS分类及实例
1、反射性XSS
通常出现在需要提交的表单的场景,将恶意代码提交给后端,执行。受害者通常是通过点击带有恶意代码的url从而被攻击,但这类攻击的实现前提是受害者需要主动点击链接。
我们就可以通过这个点提交恶意代码。如果而已代码较长提交框有限制,有两种方式解决。1、因为是get方式提交,我们可以直接在url进行修改传参。2、修改提交框的maxlength值。
提交后出现弹窗,执行成功
除行内引入的方式还可以采用事件引入,对应的payload为
<img src='#' onerror=alert('xss')>
触发弹窗,说明提交的脚本被执行(如果这里是一串恶意代码,那么危害会很大)
如果有正则匹配alert不能用,我们可以用其他弹窗方式(prompt、confirm),或者大小写混写的方式进行绕过。
上传一个网页链接payload为<script>window.location="http://www.baidu.com"</script>提交后就会跳转网页,同理如果是个钓鱼网站,隐藏在url中,会直接跳转至钓鱼网站,带来危害。
2、存储型XSS
通常出现在有留言板的场景,数据回传至后端并保存在服务器中,如果将恶意代码上传并存储在后端,受害者只要浏览该页面就会受到攻击,不需要主动点击或输入任何内容。
上传payload,成功后只要访问该页面就会触发上传的代码
3、DOM型XSS
通常以点击一个按钮的方式出现,与反射型XSS和存储型XSS有很大的区别在于不传给后端。
由网页的源码可以看到,传入的内容被拼入字符串,包裹在a标签里,这时候想要执行上传的东西就需要闭合a标签,payload如下
'><img src='#' onerror="alert('xss')">
这种方式为还较小,不能像存储型直接将恶意代码存储在网页上(平等刺伤每一个人)仅仅可以任意执行js代码。
通过Xss平台还可以获取到用户的Cookie值,这样漏洞的危害就很大了。
XSS fuzz
在burpsuite插件市场中找到XSS Validator并且安装
安装完成
安装好之后,可以更换payload也可以不换,Grep Phrase后的字段为成功标志,可以按照自己情况修改。
设置完毕后,在需要fuzz的地方进行抓包。
将抓到的包放入intruder模块
设置需要爆破的字段
设置payload
将我们设置的成功匹配加入
设置完成后,开始攻击,successful为1的就是有效的payload。
绕过方式
js支持unicode编码,所以可以采用Unicode对payload进行编码,但是不可以对script标签编码
XSS防御
将Cookie设为HTTP-Only(浏览器将阻止Javascript访问Cookie)
对输出的信息使用实体化编码(通常代码中有很多特殊符号,特殊符号经过实体化编码后就失效了,从而防止恶意代码的执行)
加正则判断,不允许提交常见的函数以及特殊符号