服务报价 | 域名主机 | 网络营销 | 软件工具| [加入收藏]
 热线电话: #
当前位置: 主页 > php教程 > php教程 >

高级PHP应用程序漏洞审核技术(2)

时间:2011-03-10 14:59来源:未知 作者:最模板 点击:
漏洞审计策略 PHP版本要求:无 系统要求:无 审计策略:通读代码 变量覆盖 很多的漏洞查找者都知道extract()这个函数在指定参数为EXTR_OVERWRITE或者没有指

 

漏洞审计策略
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);

 (责任编辑:最模板)

顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容