使用Polyglot JPEG绕过CSP

使用Polyglot JPEG绕过CSP

詹姆士向我挑战,看看是否可以创建一个Polyglot JavaScript/JPEG。这样做可以让我绕过CSP在几乎所有在同一域上托管使用beplay体育能用吗用户更易图像的网站上。我欢呼抓住挑战,开始剖析格式。前四个字节是有效的非ASCII JavaScript变量0xff 0xd8 0xff 0xe0。然后,下两个字节指定JPEG标头的长度。如果我们将标头的长度0x2f2a使用字节0x2f 0x2a您可能猜测,我们有一个非ASCII变量,然后是多行JavaScript评论。然后,我们必须将JPEG标头添加到0x2f2a用无效。这就是它的样子:

FF D8 FF E02F 2A4A 46 49 46 00 01 01 01 01 00 48 00 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

在JPEG评论中,我们可以关闭JavaScript评论,并为我们的非ASCII JavaScript变量创建作业,然后进行有效载荷,然后在JPEG评论末尾创建另一个多行评论。

ff fe00 1C2A 2F 3D 61 6C 65 72 74 28 22 42 75 72 70 20 72 6f 63 6b 73 2e 22 22 29 3b 2f 2a

0xff 0xfe是评论标题0x00 0x1c指定评论的长度,其余是我们的JavaScript有效载荷,当然是*/=警报(“ Burp Rocks。”)/*

接下来,我们需要关闭JavaScript注释,我在图像标记结束之前编辑了图像数据的最后四个字节。这是文件的末尾的样子:

2a 2f 2f 2fFF D9

0xff 0xd9是图像标记的结尾。太好了,所以还有我们的polyglot jpeg,还不是。如果您不指定charset,则可以在Firefox上使用UTF-8字符设置为文档,它会损坏我们的多面形图时,当包含在脚本中时,它会效果很好!在MDN上,它没有声明脚本支持Charset属性,但确实如此。因此,要使脚本进行工作,您需要在脚本标签上指定ISO-8859-1 charset,并且可以执行正常。

值得注意的是,Polyglot JPEG在Safari,Firefox,Edge和IE11上工作。Chrome明智地执行图像作为JavaScript。

这是polyglot jpeg:

polyglot jpeg

按照JavaScript执行图像的代码如下:

<脚本charset =“ iso-8859-1” src =“ http://pbeplay官网可以赌ortswigger-labs.net/polyglot/jpeg/xpeg/xss.jpg”>

文件大小限制

我试图将此图形上传为PHPBB配置文件图片,但它具有限制。有一个6k的文件大小限制,最大尺寸为90x90。我通过裁剪来减少徽标的大小,并考虑如何减少JPEG数据。在JPEG标头I中使用 /*,在十六进制中为0x2F和0x2a,合并为0x2f2a,其长度为12074,这是很多填充物,并且会导致图形太大,无法将其作为配置图片拟合。查看ASCII表,我尝试找到一个有效JavaScript的字符组合,并减少JPEG标头中所需的填充量,同时仍被识别为有效的JPEG文件。

我能找到的最小的启动字节是0x9(一个标签字符),其次是0x3a(结肠),导致组合的十六进制值为0x093a(2362)从我们的文件中剃光了许多字节并创建有效的非ASCII JavaScript标签语句,然后使用JFIF标识符进行变量。然后,我在JFIF标识符的末端放置一个前向斜线0x2F,而不是null字符,并将星号为版本号。这是十六进制的样子:

FF D8 FF E009 3A4A 46 49 46 2F 2A

现在,我们继续将其余的JPEG标头继续使用,然后用空填充并注入JavaScript有效载荷:

FF D8 FF E0 09 3A 4A 46 49 46 2F 2A 01 01 01 01 01 01 00 48 00 48 00 00 00 00 00 00 00 00 00 00 00 00 ...(填充更多nulls)2A 2F 3D 61 61 6C 65 72 72 72 74 28 22 74 22 42 72 72 72 72 72 72 70 20 72 72 70 20 72 6F63 6b 73 2e 22 29 3b 2f 2a

这是较小的图形:

jpeg较小

影响

如果您允许用户上传JPEG,则这些上传与应用程序在相同的域上,并且您的CSP允许脚本“自我”,您可以通过将脚本注入脚本并将其指向该图像来绕过CSP。

结论

总而言之,如果您允许JPEG上传在网站或实际上任何类型的文件上,则值得将这些资产放在单独的域上。在验证JPEG时,您应该重写JPEG标头,以确保在其中没有代码并删除所有JPEG注释。显然,您的CSP不会为脚本的图像资产域名白色。

没有出色的工作,这篇文章是不可能的安格·艾伯蒂尼(Ange Albertini)。我用他JPEG格式图形广泛地创建Polygot JPEG。贾斯维尔·纳格拉(Jasvir Nagra)也启发了我的博客文章polyglot gifs

POC

更新...

Mozilla是在Firefox 51中解决这个问题

访问我们的网络安全学beplay体育能用吗院了解有关跨站点脚本(XSS)的更多信息

回到所有文章

相关的研究

每日Swig的推荐故事beplay2018官网