漏洞审计策略 |
PHP版本要求:无
系统要求:无
审计策略:通读代码 |
变量覆盖
很多的漏洞查找者都知道extract()这个函数在指定参数为EXTR_OVERWRITE或者没有指定函数可以导致变量覆盖,但是还有很多其他情况导致变量覆盖的如:
遍历初始化变量
请看如下代码:
<?php //var.php?a=fuck $a='hi'; foreach($_GET as $key => $value) { $$key = $value; } print $a; ?>
很多的WEB应用都使用上面的方式(注意循环不一定是foreach),如Discuz!4.1的WAP部分的代码:
$chs = ''; if($_POST && $charset != 'utf-8') { $chs = new Chinese('UTF-8', $charset); foreach($_POST as $key => $value) { $$key = $chs->Convert($value); } unset($chs);
漏洞审计策略 |
PHP版本要求:无
系统要求:无
审计策略:通读代码 |
parse_str()变量覆盖漏洞
//var.php?var=new $var = 'init'; parse_str($_SERVER['QUERY_STRING']); print $var;
该函数一样可以覆盖数组变量,上面的代码是通过$_SERVER'QUERY_STRING'来提取变量的,对于指定了变量名的我们可以通过注射“=”来实现覆盖其他的变量:
//var.php?var=1&a[1]=var1%3d222 $var1 = 'init'; parse_str($a[$_GET['var']]); print $var1;
上面的代码通过提交$var来实现对$var1的覆盖。
漏洞审计策略(parse_str) |
PHP版本要求:无
系统要求:无
审计策略:查找字符parse_str |
漏洞审计策略(mb_parse_str) |
PHP版本要求:php4<4.4.7 php5<5.2.2
系统要求:无
审计策略:查找字符mb_parse_str |
import_request_variables()变量覆盖漏洞
//var.php?_SERVER[REMOTE_ADDR]=10.1.1.1 echo 'GLOBALS '.(int)ini_get("register_globals")."n"; import_request_variables('GPC'); if ($_SERVER['REMOTE_ADDR'] != '10.1.1.1') die('Go away!'); echo 'Hello admin!';
漏洞审计策略(import_request_variables) |
PHP版本要求:php4<4.4.1 php5<5.2.2
系统要求:无
审计策略:查找字符import_request_variables |
PHP5 Globals
从严格意义上来说这个不可以算是PHP的漏洞,只能算是一个特性,测试代码:
<? // register_globals =ON //foo.php?GLOBALS[foobar]=HELLO php echo $foobar; ?>
但是很多的程序没有考虑到这点,请看如下代码:
//为了安全取消全局变量 //var.php?GLOBALS[a]=aaaa&b=111 if (ini_get('register_globals')) foreach($_REQUEST as $k=>$v) unset(${$k}); print $a; print $_GET[b];
如果熟悉WEB2.0的攻击的同学,很容易想到上面的代码我们可以利用这个特性进行crsf攻击。
漏洞审计策略 |
PHP版本要求:无
系统要求:无
审计策略:通读代码 |
magic_quotes_gpc与代码安全
什么是magic_quotes_gpc
当打开时,所有的 '(单引号),"(双引号),\(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。还有很多函数有类似的作用 如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。目前大多数的主机都打开了这个选项,并且很多程序员也注意使用上面那些函数去过滤变量,这看上去很安全。很多漏洞查找者或者工具遇到些函数过滤后的变量直接就放弃,但是就在他们放弃的同时也放过很多致命的安全漏洞。 :)
哪些地方没有魔术引号的保护
1) $_SERVER变量
PHP5的$_SERVER变量缺少magic_quotes_gpc的保护,导致近年来X-Forwarded-For的漏洞猛暴,所以很多程序员考虑过滤X-Forwarded-For,但是其他的变量呢?
漏洞审计策略($_SERVER变量) |
PHP版本要求:无
系统要求:无
审计策略:查找字符_SERVER |
2) getenv()得到的变量(使用类似$_SERVER变量)
漏洞审计策略(getenv()) |
PHP版本要求:无
系统要求:无
审计策略:查找字符getenv |
3) $HTTP_RAW_POST_DATA与PHP输入、输出流
主要应用与soap/xmlrpc/webpublish功能里,请看如下代码:
if ( !isset( $HTTP_RAW_POST_DATA ) ) { $HTTP_RAW_POST_DATA = file_get_contents( 'php://input' ); } if ( isset($HTTP_RAW_POST_DATA) ) $HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
(责任编辑:最模板) |