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!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *