Hashy Hashy  • 03.06.16 22:14

Null Byte Injection Empty Null Byte Injection 03.06.16 22:14

Olá pessoal,

Nesse mini tutorial venho falar sobre as repercussões da injeção de um byte nulo contracenando com funções não binary safe do PHP.Outras linguagens também apresentam certas coisas a se comentar em relação a isso.
Um byte nulo não passa de um byte cuja representação na base hexadecimal é 00.Em C as strings são terminadas por um byte nulo.Em assembly regiões da memória preenchidas com valores e terminadas em um byte nulo afetam o comportamento de instruções de manipulação de strings (meramente um nome).
A linguagem de scripting chamada PHP é escrita em C,idem são suas funções nativas,extensoões,dentre outros.
O byte nulo é as vezes passado para o C sem ser escapado podendo assim alterar o funcionamento de certas funções e etc.
Um script falho como exemplo inicial:

<?php
$pagina =& $_GET['pagina'];
if(trim($pagina) && file_exists($pagina)) {
    include $pagina.'.php';
}
?>


Teoricamente não está falho (alguns diriam que está sucetivel a um LFI maligno mas no caso vamos descartar essa hipótese),inclui apenas scripts PHP como é desejado pelo programador.Na prática a coisa é diferente.
Deem uma olhada na seguinte requisição:


GET /nomeScript.php?pagina=arquivo.outraextensao%00
[Resto da requisição]

Podemos com uma requisição semelhante a essa incluir arquivos de qualquer extensão isso pois a função include não é binary safe (idem as semelhantes).Outro cenário interessante:
<?php
$exibir =& $_GET['exibir'];
trim(&$exibir);
if(!eregi('^[^a-z0-9\ \_\+\(\)]$', $exibir)) {
    echo $exibir;
}
?>


Teoricamente novamente tudo bem mas veja como a proteção é facilmente burlavel valendo-se da injeção do byte nulo e o fato da função eregi não ser binary safe:

GET /nomeScript.php?exibir=%00*-[]
[Resto da requisição]

Apesar de poucos exemplos terem sido apresentados acho que firmei meu ponto.Evitem ao máximo funções não binary safe e quando isso não for possivel tomem as devidas precauções como tirar os bytes nulos,escapar a string,etc...
Códigos mais interessantes (seguindo a linha) seriam:

<?php
$pagina =& $_GET['pagina'];
$pagina = str_replace(chr(0), '', $pagina);
if(trim($pagina) && file_exists($pagina)) {
    include $pagina.'.php';
}
?>



<?php
$exibir =& $_GET['exibir'];
trim(&$exibir);
if(!preg_match('#^[^a-z0-9\ \_\+\(\)]$#i', $exibir)) {
    echo $exibir;
}
?>



É muito comum erros como esse,que as vezes acabam trazendo problemas.
Qualquer duvida postem.



Por :
Hashy ( desenvolvimento e divulgação)
dbfn ( Criação do método)
Permissões neste sub-fórum
Não podes responder a tópicos

BH Servers

Recomendamos a BH Servers com proteção DDOS gratuita em Cloud Server de alta performance. Entrega imediata.