六个文件也是有效的PHP

还有也是Python的GIF

这段历史始于我尝试制作也是有效的Haskell的GIF,这一切都是CTF挑战所必需的 。 尽管为解决这一难题而费劲,但让一个文件具有两种格式的想法确实很有趣,并且对于绕过上传限制并使用某些LFI执行意外类型的文件有些有用。

GIF / Haskell文件,由Manoel(@reefbr)制作

GIF + PHP

我正在阅读PoC || GTFO期刊,他们喜欢多语言文件的想法,他们的问题之一是PDF / Zip和NES ROM ,所以我从最简单的(也许也是唯一有用的文件)格式开始:PHP。 为什么最简单? 因为您可以声明代码以<?开头。 以及以?>结尾的地方,可以将PHP代码放在文件中的任何位置。

我已经对GIF有所了解,所以让我们开始吧。 考虑到GIF的内容对我们来说毫无价值,所以可能最小的GIF是一个很好的起点:

HEX : 47 49 46 38 39 61 01 00 01 00 00 FF 00 2C 00 00 00 00 01 00 01 00 00 02 00 3B ASCII : GIF89a ÿ , ;

正如博客文章中所解释的那样,这会产生1x1黑色gif,并且应该会中断,因为它没有Global Color Table ,但是它会起作用,因为读者没有遵循该规范会遇到危险。 现在,我想将我的PHP字符串放在那里。 阅读GIF89a规范后,我发现了注释扩展,它使我们可以在文件末尾的GIF中添加注释。 像这样:

7 6 5 4 3 2 1 0 Field Name Type +---------------+ 0 | 0x21 | Extension Introducer Byte +---------------+ 1 | 0xFE | Comment Label Byte +---------------+ +===============+ | <? | N | phpinfo(); | Comment Data Data Sub-blocks | | +===============+ +---------------+ 0 | ; | Block Terminator Byte +---------------+

因此,现在我们可以将PHP代码作为注释添加到GIF中:

HEX : 47 49 46 38 39 61 01 00 01 00 00 FF 00 2C 00 00 00 00 01 00 01 00 00 02 00 21 FE 3C 3F 70 68 70 69 6E 66 6F 28 29 3B ASCII : GIF89a ÿ , !þ<?phpinfo();

请注意,!þ= 0x21 0xFE,而PHP不需要结尾处的?>。 此外,GIF使我们更容易将EOF作为分号。

PHP + PDF

按照PoC || GTFO的步骤,让我们玩PDF。 计划仍然相同,请尽可能获取最简单的PDF,然后尝试添加注释。

我对计划的第一部分有问题,我使用OS X,并且他的PDF阅读器受到限制,因为我在互联网上发现的几乎所有简单的PDF都对OS X的阅读器有一些错误。 唯一全用ASCII并为我工作的是这个: https : //stackoverflow.com/a/32142316

%PDF-1.2 9 0 obj << >> stream BT/ 9 Tf(Test)' ET endstream endobj 4 0 obj << /Type /Page /Parent 5 0 R /Contents 9 0 R >> endobj 5 0 obj << /Kids [4 0 R ] /Count 1 /Type /Pages /MediaBox [ 0 0 99 9 ] >> endobj 3 0 obj << /Pages 5 0 R /Type /Catalog >> endobj trailer << /Root 3 0 R >> %%EOF

它具有很多其他阅读器不需要的部件,例如Chrome的阅读器,它应该确实很小,但这并不重要。 PDF更加简单,就像任何程序语言一样,它都有一个%的注释代码,因此只需将其放在任何一行之后并附加PHP代码。

%PDF-1.2 %<?phpinfo()?> ...

最简单的方法

在Web上冲浪时,我发现了一些非常漂亮的东西 ,一个带有巨大列表的存储库,其中包含“最小的[...]文件”,因此我开始尝试将PHP附加到某些文件中。

事实证明,大多数文件都具有某种EOF ,以表明文件已结束,并且大多数读者只是忽略了放在该EOF之后的任何内容。 这是四个例子:

ELF + PHP
HEX : 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 19 40 CD 80 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 40 CD 80 00 40 CD 80 4C 00 00 00 4C 00 00 00 05 00 00 00 00 10 00 00 3C 3F 70 68 70 69 6E 66 6F 28 29 3B 3F 3E ASCII : ?ELF @Í€, 4 @Í€ @Í€L L <?phpinfo();?>
MP3 + PHP
HEX : FF E3 18 C4 00 00 00 03 48 00 00 00 00 4C 41 4D 45 33 2E 39 38 2E 32 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 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 3F 70 68 70 69 6E 66 6F 28 29 3B 3F 3E ASCII : ÿãÄ H LAME3.98.2 <?phpinfo();?>
JPG + PHP
HEX : FF D8 FF DB 00 43 00 03 02 02 02 02 02 03 02 02 02 03 03 03 03 04 06 04 04 04 04 04 08 06 06 05 06 09 08 0A 0A 09 08 09 09 0A 0C 0F 0C 0A 0B 0E 0B 09 09 0D 11 0D 0E 0F 10 10 11 10 0A 0C 12 13 12 10 13 0F 10 10 10 FF C9 00 0B 08 00 01 00 01 01 01 11 00 FF CC 00 06 00 10 10 05 FF DA 00 08 01 01 00 00 3F 00 D2 CF 20 FF D9 3C 3F 70 68 70 69 6E 66 6F 28 29 3B 3F 3E ASCII : ÿØÿÛ C ÿÉ ÿÌ ÿÚ ? ÒÏ ÿÙ<?phpinfo();?>

将PHP附加到JPEG确实很老,但是每个人都只EXIF放进去了,我认为它是作弊的。

BMP + PHP
HEX : 42 4D 1E 00 00 00 00 00 00 00 1A 00 00 00 0C 00 00 00 01 00 01 00 01 00 18 00 00 00 FF 00 3C 3F 70 68 70 69 6E 66 6F 28 29 3B 3F 3E ASCI : BM ÿ <?phpinfo();?>

奖励回合:

在发现之后,我开始玩一些更严格的东西。 也是有效的Python的GIF。 上述“ 技术 ”均无效,因为您不能仅仅对Python Interpreter说从哪里开始运行PHP之类的代码。 让我们再看看另一个GIF:

HEX : 47 49 46 38 39 61 01 00 01 00 80 01 00 FF FF FF 00 00 00 21 F9 04 01 0A 00 01 00 2C 00 00 00 00 01 00 01 00 00 02 02 4C 01 00 3B ASCII : GIF89a € ÿÿÿ !ù , L ;

让我们尝试基于错误的分析,以.py运行时此文件给出什么错误?

$ python tinytrans.gif File "tinytrans.gif", line 1 GIF89a ^ SyntaxError: invalid syntax

它将在0x01字节上引发语法错误,这是预期的。 GIF魔幻数字指定是GIF,并且其版本为“ 89a”,事实证明,每个读者都只要求版本为89或87,而忽略了“ a”部分,因此我们可以将“ a”替换为a “ =”并指出“ GIF89”是一个变量,应该是一个不错的开始。 让我们再次运行。

$ python tinytrans.gif File "tinytrans.gif", line 1 GIF89= ^ SyntaxError: invalid syntax

再次,正如预期的那样。 我的第一个想法是只注释GIF的乱码部分,然后像在PHP + GIF上那样添加注释,那是一个有效的python,就可以了。 但是在胡言乱语的中间,它有一个0x0a字节,这也是一个新行,这使我的所有尝试都感到烦恼。 我试图做这样的事情:

GIF89=\ #GIBBERISH$@!_K$!@$!(@#@!_#)!@!@!þ\ __import__('os').system('ls');

也就是说,使用'\'进行多行变量声明,并在其中声明非ASCII字符,然后附加'!þ'以开始GIF注释,跳至另一行并放入实际代码,其后是EOF的分号,这在Python中也有效。

但是,试图在多行变量声明中进行注释只是不可能的,但是在括号内进行注释是有效的: https : //stackoverflow.com/a/22914853 。 新尝试:

十六进制:

47 49 46 38 39 3D 28 0A 00 00 80 01 00 FF FF FF 00 00 00 21 F9 04 01 00 00 01 00 2C 00 00 00 00 01 00 01 00 00 02 02 4C 01 00 21 FE 0A 5F 5F 69 6D 70 6F 72 74 5F 5F 28 27 6F 73 27 29 2E 73 79 73 74 65 6D 28 27 6C 73 27 29 29 3B

ASCII:

GIF89=( € ÿÿÿ !ù , L !þ __import__('os').system('ls'));

注意,解释器将只忽略以Non-ASCII字符开头的行,这很奇怪,因此我们不需要#。 并运行:

$ python python.gif bash.gif handtinyblack.gif php.elf php.mp3 tinytrans.gif bmp.bmp php-logo-virus.jpg php.gif php.pdf tinytrans.gpy dude.gif php.bmp php.jpg python.gif tinytrans.py

好极了 !

From: https://hackernoon.com/six-files-that-are-also-a-valid-php-540343ad35c8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值