如何将Phar文件包转化成图像从而绕过文件类型检测
副标题[/!--empirenews.page--]
在美国举办的BlackHat 2018大会上,已经有白帽黑客证明可以从PHAR包获得RCE,而且,通过调整其二进制内容,可以将其伪装成完整的有效图像,绕过安全检查。 背景 在美国举办的BlackHat 2018期间,来自英国网络安全公司Secarma的研究总监Sam Thomas召开了一个关于在PHP中利用phar://流包装器(stream wrapper)在服务器上执行代码执行的会议。 一个PHP应用程序往往是由多个文件构成的,如果能把他们集中为一个文件来分发和运行是很方便的,这样的列子有很多,比如在window操作系统上面的安装程序、一个jquery库等等,为了做到这点PHP采用了PHAR文档文件格式,这个概念源自java的jar,但是在设计时主要针对PHP的Web环境,与JAR归档不同的是PHAR归档可由PHP本身处理,因此不需要使用额外的工具来创建或使用,使用PHP脚本就能创建或提取它。PHAR是一个合成词,由PHP和Archive构成,可以看出它是PHP归档文件的意思。 在执行PHAR包时,PHP将反序列化其内容,允许攻击者启动PHP对象包含链。其中最有趣的部分是如何触发有效载荷,因为归档上的任何文件操作都将执行它。最后,不需要猜测正确的文件名,因为即使失败的文件调用也需要PHP来反序列化内容。 另外,完全可以将PHAR包伪装成100%有效的图像。 在这篇文章中,我将介绍伪装的详细过程。 降级至字节码级别 有时我们会忘记文件只是遵循预定义结构的一堆字节,但应用程序将检查它们是否能够管理这样的数据流,如果能,它们将生成一个输出。 在演讲中,Thomas给出了一个关于如何创建具有有效JPEG标头的PHAR包的提示。 按着提示,我们要做的是创建一个具有JPEG标头的文件,并相应的更新PHAR校验和。通过这种方式,文件将被视为一个图像,但PHP还能够执行它。 如果你认为更改几个字节并更新校验和就可以轻松完成操作,那你就想得太简单了。 计算校验和(至少对我来说)是件痛苦的事情,然后我就想,如果我让PHP为我做这些工作呢? 所以我改编了Thomas在演讲中提到的做法,如下所示。
如你所见,我将原始HEX字节添加到PHAR归档的存根部分。以下就是原HEX结果:
它是一个有效的PHAR和JPEG图像吗?
PHP将其识别为图像,但我仍然可以看到归档上的内容。 请查看存根部分并注意它是如何缺少开始的PHP标记的。这是大多数内容扫描器都无法看到的关键内容。要使归档有效,惟一需要的是__HALT_COMPILER()函数,我认为这被PHP用来表示它应该跳过多少数据。 我有一个文件,它可以通过任何基于文件标头的检查,然而任何比它更复杂的检查都会失败。例如,使用getimagesize检查图像将返回false,因为图像必定是伪造的。
解决图像是伪造的问题? 但我看到我可以在__HALT_COMPILER()标记之前插入我想要的任何乱码,试想,如果我用它来制作完整的图像,会怎么样呢? (编辑:淮安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |