Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

PostScript语言安全研究(ImageMagick新漏洞分析)

0
0
Author :数据流 (Flyin9_L)

前言:主流的东西太多了,还是研究一些非主流的语言好玩。 PostScript(PS) 是一种页面描述性语言,由 Adobe 开发,后由 Apple 推进发展。开始是应用于工业印刷绘图排版,现在广泛适用于打印机。虽然 PostScript 是比较冷门的语言,但与我们比较熟悉的 PDF 的部分元素也是由 PostScript 语言编写。利用 PS 的特性与弱点可对解析器与打印机进行攻击,而一些基础组件例如 ImageMagick 解析 ps 文件时会依赖外部解析器,所以也可对 IM 进行攻击。

0x00 PostScript 语言入门

由于一般 PS 语言由机器自动生成,因此关于手写 PS 语言的资料非常罕见,只能从老外一些零星的资料与解析器的官方文档进行了解。这里我也顺便讲解下 PS 语言的基础,因为 PS 语言的中文资料寥寥无几。

用 PS 绘图,其实这语言都是绘图排版的。


PostScript语言安全研究(ImageMagick新漏洞分析)

( 绘出 Hello world)

因为 PS 是一种页面描述语言,关于绘图部分的基础我就不说了我也不了解。

解析器: Ghostscript ,是可跨平台的 PostScript 语言解析器。可将 PS 语言绘图出来, PS 与 PDF 互相转换,并带有命令行版本。现在 linux 发行版本都会自带 Ghostscript 。


PostScript语言安全研究(ImageMagick新漏洞分析)

文件一般是 .PS 后缀,且文件头是 %!PS , 在 PS 中 % 是注释符。

PostScript 是一种基于堆栈的解释语言,而且操作符都是在后的。作为一名 WEB 狗表示不太习惯。

例:

求 1+2 ,在 PS 中表示 1 2 add

在解析器中,先把 2 1 放进堆栈中,然后使用操作符 add 使两者相加然后再把结果放入堆栈中。

== 表示将栈顶中的元素出栈并打印


PostScript语言安全研究(ImageMagick新漏洞分析)

PostScript 最重要就是堆栈操作符: dup pop exch roll copy index

PS 也支持定义过程,类似于 function

我再举一个简单的例子:

%!PS /test {pop dup sub 0 index mul} def 1 2 test == quit

最后结果是 0

“ / ”是定义过程名称的符号,其他操作符熟悉其他语言的看字面都能猜出是什么作用了。在 PS 中过程不像我们其他语言一样直接跳到函数执行而是把位置替换而已。上面几行代码可以写成

1 2 pop dup sub 0 index mul ==

解析一下流程: 1 2 入栈, pop 把 2 出栈, dup 复制栈顶然后 sub 把两者相减, 0 index 取栈堆上第 0 个元素并入栈, mul 把栈顶两个元素相减, == 打印栈顶元素并出栈。

pstack 操作符可以打印当前栈的所有元素


PostScript语言安全研究(ImageMagick新漏洞分析)

这就是 PostScript 的基本语法,其他数据类型就不说了(这语言我也不精通啊)。

0x01 任意目录遍历 / 文件读取漏洞

虽然 PostScript 是页面描述语言,但也有自己的文件操作符,我们可以利用这个比较文件操作符 do some bad 。


PostScript语言安全研究(ImageMagick新漏洞分析)

不知道为何一个绘图排版打印用的语言也要提供如此丰富的文件操作符。

根据文档的文件操作符的关键字可以写出以下读取文件的代码:

%!PS /buff 1024 string def % 定义一个 1024 字节大小的空间 /file_obj (/etc/passwd) (r) file def % 定义一个文件对象并读取 /etc/passwd 文件 file_obj buff readstring % 用 readstring 操作符把文件对象的数据放入 buff buff print quit
PostScript语言安全研究(ImageMagick新漏洞分析)

当一些网站基于解析器解析 ps 或 pdf 并返回结果的话就会被读取文件。

目录遍历:

PostScript 的 filenameforall 操作符可以使用通配符匹配文件 所以可以利用这个来遍历目录。

%PS

(/home/*) {==} 256 string filenameforall

0x02 Ghostscript 安全模式与 ImageMagick 影响

由于上述的问题, Ghostscript 增加了安全模式。

启动时 加上参数 -dSAFER


PostScript语言安全研究(ImageMagick新漏洞分析)
Error: /invalidfileaccess in file Operand stack: file_obj (/etc/passwd) (r) Execution stack:

%interp_exit

启动安全模式后, file 系列操作符将被禁止,而在 ImageMagick 的 PS 解析器中是以安全模式启动的,所以无法直接使用以上 payload 进行攻击。但目录遍历可以。


PostScript语言安全研究(ImageMagick新漏洞分析)
使用ImageMagick套件的

Viewing all articles
Browse latest Browse all 12749