Seis arquivos que também são um PHP válido

E um GIF que também é um Python

A história começa comigo tentando fazer um GIF que também é um Haskell válido, tudo isso para um desafio de CTF . Embora tenha sido uma dor na bunda para matar esse desafio, a idéia de ter um arquivo com dois formatos foi realmente interessante e um pouco útil para ignorar as restrições de upload e executar o tipo inesperado de seu arquivo com algum LFI.

O arquivo GIF / Haskell, feito por Manoel (@reefbr)

GIF + PHP

Eu estava lendo o PoC || GTFO Journal e eles adoram a idéia de um arquivo de políglota , uma das suas questões é uma ROM de PDF / Zip e NES , então eu comecei com o mais simples – e provavelmente o único que é útil – formato de arquivo : PHP. Por que é o mais simples? Porque você pode indicar onde o código começa com <? e onde termina com?>, com isso posso colocar o código PHP em qualquer lugar do arquivo.

Eu já conheci algo sobre GIF, então vamos começar com isso. Tendo em mente que o conteúdo do GIF é inútil para nós, o mais ínfimo GIF possível é um ótimo lugar para começar:

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

Conforme explicado na publicação do blog, isso faz um 1×1 gif preto e deve quebrar porque não possui a Tabela de cores global , mas funciona porque os leitores não seguem a especificação em risco. Agora eu quero colocar minha cadeia de PHP em algum lugar lá. Lendo a especificação GIF89a, encontrei a Extensão de comentários que nos permite colocar um comentário no GIF no final do arquivo. Algo parecido :

 7 6 5 4 3 2 1 0 Nome do campo Tipo 
 + --------------- + 
 0 | 0x21 | Extensão Introdução Byte 
 + --------------- + 
 1 | 0xFE | Comentário Label Byte 
 + --------------- + 

 + =============== + 
 | <? | 
 N | phpinfo (); | Comentar Sub-blocos de dados de dados 
 | | 
 + =============== + 

 + --------------- + 
 0 | ; | Block Terminator Byte 
 + --------------- +

Então, agora podemos anexar nosso código PHP como um comentário no 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 ();

Observe que! Þ = 0x21 0xFE e PHP não requer o?> No final. Também o GIF facilita o fato de termos o EOF como um ponto-e-vírgula.

PHP + PDF

Seguindo as etapas de PoC || GTFO vamos jogar com PDF. O plano ainda é o mesmo, obtenha o PDF mais simples possível e tente anexar um comentário.

Eu tive um problema com a primeira parte do plano, eu uso OS X e seu leitor de PDF é restringido como foda, quase todos os PDF simples que eu encontrei na internet têm algum erro para o leitor do OS X. O único que está tudo em ASCII e trabalhou para mim foi este: 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

Tem muitas partes que não são necessárias para outros leitores, como o leitor do Chrome, e isso deve ser muito menor, mas não importa. O PDF é muito mais simples, como qualquer idioma do programa, tem um código para comentários que é%, então basta colocar isso depois de qualquer linha e anexar o código PHP.

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

Abordagem mais simples

Navegando na WEB, encontrei algo realmente bonito , um repositório com uma enorme lista com o “Menor possível arquivo […]”, então eu comecei a tentar adicionar PHP a alguns desses arquivos.

Como se mostra, a maioria dos arquivos tem um EOF de algum tipo para indicar que o arquivo terminou, e a maioria dos leitores simplesmente ignora qualquer coisa que seja colocada depois desse EOF . Aqui estão quatro exemplos:

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 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 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 ();?>

Anexar o PHP ao JPEG é realmente antigo, mas todos simplesmente colocam o EXIF , e considero isso trapacear.

BMP + PHP

 HEX: 42 4D 1E 00 00 00 00 00 00 00 1A 00 00 00 0C 00 00 00 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 ();?>

Rodada de bônus:

Depois dessa descoberta, comecei a jogar com algo mais incondicional. Um GIF que também é um Python válido. Nenhuma das ” técnicas ” anteriores funciona porque você não pode simplesmente dizer ao Python Interpreter onde começar a executar o código como PHP. Vamos dar uma outra olhada em outro 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 01 00 00 02 02 4C 01 00 3B 
 ASCII: GIF89a?? € ?ÿÿÿ???! Ù 
 ??, ???????L?;

Vamos tentar uma análise baseada em erro, qual é o erro que este arquivo dá quando executado como um .py?

 $ python tinytrans.gif 
 Arquivo "tinytrans.gif", linha 1 
 GIF89a 
 ^ 
 SyntaxError: sintaxe inválida

Ele lança um erro de sintaxe no byte 0x01, o que é esperado. O Número Mágico do GIF especifica que é um GIF e que sua versão é “89a”, verifica-se que todos os leitores apenas exigem que a versão seja 89 ou 87 ignorando a parte “a”, então podemos substituir o “a” por um ” “=” E declare que “GIF89” é uma variável, que deve ser um bom começo. Vamos correr de novo.

 $ python tinytrans.gif 
 Arquivo "tinytrans.gif", linha 1 
 GIF89 = 
 ^ 
 SyntaxError: sintaxe inválida

Mais uma vez, conforme esperado. A primeira idéia que eu tive foi apenas comentar a parte do gibberish do GIF e colocar um comentário, assim como no PHP + GIF, que é uma pitão válida e que ficaria bem. Mas no meio do gibberish tem um byte 0x0a, que também é uma nova linha, que brigue todas as minhas tentativas. Eu estava tentando fazer algo assim:

 GIF89 =  
 #GIBBERISH $ @! _ K $! @ $! (@ # @! _ #)! @! @! Þ  
 __import __ ('os'). sistema ('ls');

Ou seja, uma declaração de variável de várias linhas que usa o ” e no meio dele apenas comentando o Non-ASCII, depois disso adicionando o ‘! Þ’ para iniciar um comentário GIF, saltando para outra linha e colocando o código real , seguindo pelo ponto-e-vírgula do EOF, que também é válido em Python.

Mas tentar fazer um comentário em uma declaração de variável de várias linhas era simplesmente impossível, mas fazer isso entre parênteses era válido: https://stackoverflow.com/a/22914853 . Nova tentativa:

HEX:

 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 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'). sistema ('ls'));

Observe que o intérprete apenas ignorará a linha que começa com um caractere não-ASCII, o que é estranho, então não precisamos do #. E correndo:

 $ 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

Yay !

 

Hacker Noon é como os hackers começam suas tardes. Somos uma parte da família @AMI . Agora estamos aceitando envios e estamos felizes em discutir oportunidades de propaganda e patrocínio .

Se você gostou desta história, recomendamos ler nossas últimas histórias de tecnologia e histórias de tecnologia de tendências . Até a próxima, não concorde com as realidades do mundo!