使用 Javascript/JPEG Polyglot 利用 XSS

admin 2022年4月23日01:39:24评论66 views字数 1847阅读6分9秒阅读模式

点击上方蓝字“Ots安全”一起玩耍

使用 Javascript/JPEG Polyglot 利用 XSS

什么是多语种?

就像 PNG、JPEG 和 DOC 是有效的文件类型一样,多语言是两种不同文件类型的组合。例如 Phar + JPEG(PHP 存档和 JPEG 文件)、GIFAR(Gif 和 Rar 文件)Javascript + JPEG 等。


应用程序仅允许某些文件类型具有文件上传等功能,并且不允许其他文件类型(如 .php 或 .js 文件),因为这些文件可以使攻击者在应用程序上上传恶意文件。应用程序执行扩展过滤检查,如双扩展 (.jpg.php) 或在扩展 (.php%00.jpg)、文件名 (.htaccess、.config 等) 中使用空字节,以及上传文件的签名是否也匹配其内容类型。


不同的应用程序使用不同的方法,并且可以使用多语言绕过其中一些验证检查。


JPEG结构

JPEG 图像表示为一系列片段,其中每个片段都以标题开头。每个标头都以某个字节开头。标头后面的有效负载因标头类型而异。常见的 JPEG 标记类型如下所列:

0xffd8: “Start of Image”,0xffe0: “Application Default Header”,0xffdb: “Quantization Table”,0xffc0: “Start of Frame”,0xffc4: “Define Huffman Table”,0xffda: “Start of Scan”,0xffd9: “End of Image”

每个二进制文件都包含几个头文件。它们对于文件非常重要,因为它们定义了文件的特定信息。大多数标头后跟长度信息。这告诉我们该特定段有多长。


图像标题的开头包含 FF D8。如果我们没有看到它,我们可以假设这是其他文件。另一个重要的标记是 FF D9,它表示图像的结尾。


为了使有效载荷看起来像一个合法的 JPEG 文件,我们将添加标题的长度、注释标题、空字节到 pad,然后是我们的 javascript 攻击向量。


假设攻击向量*/=alert(“XSS”)/*将其转换为十六进制将如下所示。

使用 Javascript/JPEG Polyglot 利用 XSS

十六进制的有效载荷:-

2A 2F 3D 61 6C 65 72 74 28 22 58 53 53 2E 22 29

我们可以使用十六进制编辑器在图像元数据中注入 javascript。这是因为浏览器在将图像呈现为 HTML 时会解释代码。

使用 Javascript/JPEG Polyglot 利用 XSS

test.jpg(目标图像文件)

我有一个图像test.jpg,下面是 test.jpg 的 hexdump。在ghex 编辑器的帮助下,我们将替换一些十六进制字符并保存它们。

使用 Javascript/JPEG Polyglot 利用 XSS

我们知道第一个FF D8是图像的开头,接下来的两个字节代表即将到来的两个字节,00 10 代表 JPEG 标头的长度,十进制等效为 16 个字节。


注射时间

我们将在FF E0和之间注入我们的有效载荷FF DB。让我们从2F 2A/* 的十六进制表示开始

使用 Javascript/JPEG Polyglot 利用 XSS

如果您注意到我们00 10之前刚刚替换2F 2A为,十六进制的十进制等效2F 2A值为 12074 字节。所以现在图像头从 16 字节变为 12074 字节。

使用 Javascript/JPEG Polyglot 利用 XSS

从上面的屏幕截图中,我们可以看到我们的有效负载大小为 18 字节,因此我们必须用 12074–16–18=12040 字节的空值填充剩余的字节。

使用 Javascript/JPEG Polyglot 利用 XSS

上述命令将读取 test.jpg,将我们的有效负载插入2F 2A FF DB到将十六进制更改为缓冲区的中间,添加 12040 个空字节并将其写入文件 test_new.jpg。现在在 ghex 编辑器中关闭之前的评论标签FF D9

使用 Javascript/JPEG Polyglot 利用 XSS

test_new.jpeg 的十六进制转储(修改)

Code to execute image as javascript:-<script charset="ISO-8859-1" src="test_new.jpeg">

在 Firefox 上,当对文档使用 UTF-8 字符集时,它会在作为脚本包含时破坏多语言!所以要让脚本工作,我们需要在脚本标签上指定 ISO-8859–1 字符集,它可以正常执行。


让我们在浏览器中测试一下。

使用 Javascript/JPEG Polyglot 利用 XSS

我们的javascript/jpeg 多语言工作!


更新:Mozilla在 Firefox 51及更高版本中修复了此问题


本文翻译自:

https://systemweakness.com/exploiting-xss-with-javascript-jpeg-polyglot-4cff06f8201a?source=read_next_recirc---------1---------------------5bdf9270_f4d6_40bd_b126_fa41f5d95edc-------

使用 Javascript/JPEG Polyglot 利用 XSS

原文始发于微信公众号(Ots安全):使用 Javascript/JPEG Polyglot 利用 XSS

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月23日01:39:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   使用 Javascript/JPEG Polyglot 利用 XSShttps://cn-sec.com/archives/929219.html

发表评论

匿名网友 填写信息