目录
MXSS攻击
UXSS攻击
FlashXSS
PDFXSS
MXSS攻击
MXSS,全称“Mutation XSS”,MXSS攻击是一种特殊的XSS攻击类型,简单来说,就是XSS攻击的一种特殊形式,它通过利用网页内容的动态变化或特定条件触发,使得原本安全的网页代码在特定情况下变得不安全,从而执行恶意脚本。
mXSS 主要是在DOM操作的过程中浏览器渲染造成的畸变引起的。比如,将数据赋值到a.innerHTML后,再取出重新赋值到b.innerHTML的过程中产生畸变。
可以理解为:用户可以输入破损的HTML,但浏览器必须要修复它。所以导致了变异,利用这个特性,从而绕过DOMPurify库,或者在第三方的可信机制认可的情况下预览时,对原网页内容进行提取和处理的过程中,将原本无害的XSS Payload进行了转码操作,于是导致了Payload 变异而产生了XSS,具体可以看下面的参考文章
参考文章:
利用突变XSS绕过DOMPurify 2.0.0 - 先知社区
跨站的艺术-XSS入门与介绍 [ Fooying ]
UXSS攻击
UXSS是利用浏览器或者浏览器扩展漏洞来制造产生XSS并执行代码的一种攻击类型。
造成这个漏洞不是因为你的网站问题,而是浏览器自身的问题。
MICROSOFT EDGE uXSS CVE-2021-34506
Edge浏览器翻译功能导致JS语句被调用执行,下面url是演示的案例
https://www.bilibili.com/video/BV1fX4y1c7rX
在微软低版本的edge浏览器中(版本 91.0.864.37)的案例中,特定的UXSS漏洞(CVE-2021-34506)源于翻译功能中的一段代码没有正确清洁输入。这意味着攻击者可以在网页的任意位置插入恶意的JavaScript代码,一旦用户点击地址栏的翻译提示按钮,这段代码就会被执行。
通过百度,bing,或者其他搜索引擎去搜索跨站语句并进入存在跨站语句的网页时候,如果使用到了浏览器的翻译功能的时候,这个语句会被执行。不是针对网站的,是针对浏览器自己的。
这些漏洞一般要隔很久才能爆一个,所以比较难挖掘。
FlashXSS
swf是小动画一些视频类的后缀,小游戏很多都是用的swf,网页广告等,
在互联网上显示矢量图形、动画、音频和视频内容。SWF文件通常包含ActionScript代码,这是一种专门为Flash平台设计的脚本语言。由三部分组成:
- 图形和动画数据
- ActionScript代码
- 声音和视频数据:
而swf和js是可以相互调用的,ActionScript中的ExternalInterface
类提供了一组方法,允许SWF文件与嵌入它的HTML页面中的JavaScript进行通信。
SWF文件可以使用ExternalInterface.call
方法来调用JavaScript函数。这个方法接受一个函数名和一个参数数组作为输入,并尝试在全局作用域中调用具有该名称的JavaScript函数。
// ActionScript代码
if (ExternalInterface.available) {ExternalInterface.call("myJavaScriptFunction", "Hello from SWF!");
}
在上面的例子中,myJavaScriptFunction
是JavaScript中定义的一个函数,它将接收来自SWF文件的字符串参数。
案例:phpwind9.0_5275
白盒分析,找相关swf文件进行反编译,直接打开看到的是乱码
黑盒角度其实也是,通过爬取是否找到swf文件,然后进行反编译
这里是下载了源码,找到项目中phpwind9.0_5275\phpwind\www\res\js\dev\util_libs\swfupload\Flash\swfupload.swf
利用反编译工具ffdec_15.1.0,可以对swf进行反编译处理。
主要看xx.swf文件的脚本代码:
上面提到swf调用js代码的函数:ExternalInterface.call 执行JS代码
在swf中,ExternalInterface.call函数调用JavaScript代码。
所以在反编译的代码中搜索ExternalInterface.call,这个函数是用来调用JavaScript代码的
phpwind9.0_5275\phpwind\www\res\js\dev\util_libs\jPlayer\Jplayer.swf可以搜索到关键代码ExternalInterface.call(this.jQuery,"jPlayerFlashEvent",JplayerEvent.JPLAYER_READY,this.extractStatusData(this.commonStatus));
通过this.jQuery这个变量进行传参,
追踪变量jQuery,可以看到关键性代码:this.jQuery = loaderInfo.parameters.jQuery + "(\'#" + loaderInfo.parameters.id + "\').jPlayer";
可以看到通过loaderInfo.parameters
属性,获取从宿主网页传递过来的参数,由jQuery变量接收。
那么就可以构造payload:
127.0.0.1:8104/res/js/dev/util_libs/jPlayer/Jplayer.swf?jQuery=alert(1))}catch(e){}//
this.jQuery = (((alert(1))}catch(e){}// + "('#") + loaderInfo.parameters.id) + "').jPlayer");
黑盒怎么测试呢,可以寻找网站有没有swf格式文件,然后下载下来进行反编译,看他是否有安全问题。地址mickeymouse24.com/games/
这个案例是从别人那里copy的,我个人持怀疑态度,我看代码理解的话,jQuery应该是js传入的,应该是这段代码,
var c, d = ...
:这里定义了两个变量,c
用于稍后存储创建的 Flash 对象元素,d
是一个字符串,包含了传递给 Flash 对象的参数(如jQuery
、id
、vol
、muted
等)。在var d = "jQuery=" + encodeURI(this.options.noConflict) + "&id=" + encodeURI(this.internal.self.id) + "&vol=" + this.options.volume + "&muted=" + this.options.muted;
这行代码中,虽然encodeURI
被用于对部分参数进行编码,但如果this.options.noConflict
、this.internal.self.id
、this.options.volume
和this.options.muted
这些值来自不可信的源我把代码copy出来:
if (this.flash.used) {var c, d = "jQuery=" + encodeURI(this.options.noConflict) + "&id=" + encodeURI(this.internal.self.id) + "&vol=" + this.options.volume + "&muted=" + this.options.muted;if (b.browser.msie && Number(b.browser.version) <= 8) {d = ['<param name="movie" value="' + this.internal.flash.swf +'" />', '<param name="FlashVars" value="' + d + '" />', '<param name="allowScriptAccess" value="always" />', '<param name="bgcolor" value="' + this.options.backgroundColor + '" />', '<param name="wmode" value="' + this.options.wmode + '" />'];c = document.createElement('<object id="' + this.internal.flash.id + '" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="0" height="0"></object>');for (var e = 0; e < d.length; e++) c.appendChild(document.createElement(d[e]))} else e = function(a, b, c) {var d = document.createElement("param");d.setAttribute("name", b);d.setAttribute("value", c);a.appendChild(d)}, c = document.createElement("object"), c.setAttribute("id", this.internal.flash.id), c.setAttribute("data", this.internal.flash.swf), c.setAttribute("type", "application/x-shockwave-flash"), c.setAttribute("width", "1"), c.setAttribute("height", "1"), e(c, "flashvars", d), e(c, "allowscriptaccess", "always"), e(c, "bgcolor", this.options.backgroundColor), e(c, "wmode", this.options.wmode);this.element.append(c);this.internal.flash.jq = b(c)}
我认为这里才是导致FlashXss的原因,关于这个理解我参考的是下面这篇文章:
Adobe Flash XSS traps
PDFXSS
这个比较好理解,就是制作pdf嵌入恶意脚本,然后上传到一些平台或者个人,别人下载打开就会触发
首先是制作带脚本的pdf,用到迅雷PDF 新建页面,视图 - 页面浓缩图
点击浓缩图,右键属性,属性里面 - 动作
选中,新添加JavaScript代码
新增代码app.alert(1);
然后保存为1.pdf,制作完成。
直接打开这个pdf没有任何问题(但不排除pdf阅读器也能执行脚本漏洞),但是把它放在浏览器进行访问,就会进行弹窗
测试中只有火狐不进行弹窗
漏洞利用:
很多网站有文件上传功能,把带有跨站代码的PDF进行上传上去,然后得到文件的下载地址(必须是直连地址),把地址发给别人访问,如果这个平台没有做PDFXSS的漏洞进行过滤,当别人打开这个链接,这个PDF就会弹窗,这样就可以做成一个钓鱼地址。
可以测试上传PDF文件的平台,比如腾讯文档、百度网盘等