高级PHP应用程序漏洞审核技术(2) - 超全局变量

Pader2009年8月21日 发表于 网页与编程 漏洞 php 漏洞审核

五、扩展我们的字典

下面将详细介绍一些非传统PHP应用代码审计一些漏洞类型和利用技巧。

5.1 变量本身的key

    说到变量的提交很多人只是看到了GET/POST/COOKIE等提交的变量的值,但是忘记了有的
程序把变量本身的key也当变量提取给函数处理。

--code-------------------------------------------------------------------------
<?php
//key.php?aaaa'aaa=1&bb'b=2
//print_R($_GET);
foreach ($_GET AS $key => $value)
{
print $key."\n";
}
?>
-------------------------------------------------------------------------------

    上面的代码就提取了变量本身的key显示出来,单纯对于上面的代码,如果我们提交URL:

--code-------------------------------------------------------------------------
key.php?<script>alert(1);</script>=1&bbb=2
-------------------------------------------------------------------------------

    那么就导致一个xss的漏洞,扩展一下如果这个key提交给include()等函数或者sql查询
呢?:)

+++++++++++++++++++++++++
漏洞审计策略
-------------------------
PHP版本要求:无
系统要求:无
审计策略:通读代码
+++++++++++++++++++++++++


5.2 变量覆盖(variable-overwrite)

    很多的漏洞查找者都知道extract()这个函数在指定参数为EXTR_OVERWRITE或者没有指
定函数可以导致变量覆盖,但是还有很多其他情况导致变量覆盖的如:

5.2.1 遍历初始化变量

请看如下代码:

--code-------------------------------------------------------------------------
<?php
//var.php?a=fuck
$a='hi';
foreach($_GET as $key => $value) {
$$key = $value;
}
print $a;
?>
-------------------------------------------------------------------------------

    很多的WEB应用都使用上面的方式(注意循环不一定是foreach),如Discuz!4.1的WAP部分
的代码:

--code-------------------------------------------------------------------------
$chs = '';
if($_POST && $charset != 'utf-8') {
$chs = new Chinese('UTF-8', $charset);
foreach($_POST as $key => $value) {
$$key = $chs->Convert($value);
}
unset($chs);
-------------------------------------------------------------------------------

+++++++++++++++++++++++++
漏洞审计策略
-------------------------
PHP版本要求:无
系统要求:无
审计策略:通读代码
+++++++++++++++++++++++++


5.2.2 parse_str()变量覆盖漏洞(CVE-2007-3205)、mb_parse_str()

--code-------------------------------------------------------------------------
//var.php?var=new
$var = 'init';                    
parse_str($_SERVER['QUERY_STRING']);
print $var;
-------------------------------------------------------------------------------

    该函数一样可以覆盖数组变量,上面的代码是通过$_SERVER['QUERY_STRING']来提取变
量的,对于指定了变量名的我们可以通过注射“=”来实现覆盖其他的变量:

--code-------------------------------------------------------------------------
//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
+++++++++++++++++++++++++


5.2.3 import_request_variables()变量覆盖漏洞(CVE-2007-1396)

--code-------------------------------------------------------------------------
//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
+++++++++++++++++++++++++


5.2.4 PHP5 Globals

    从严格意义上来说这个不可以算是PHP的漏洞,只能算是一个特性,测试代码:

--code-------------------------------------------------------------------------
<?
// register_globals =ON
//foo.php?GLOBALS[foobar]=HELLO
php echo $foobar;
?>
-------------------------------------------------------------------------------

    但是很多的程序没有考虑到这点,请看如下代码:

--code-------------------------------------------------------------------------
//为了安全取消全局变量
//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版本要求:无
系统要求:无
审计策略:通读代码
+++++++++++++++++++++++++


5.3 magic_quotes_gpc与代码安全

5.3.1 什么是magic_quotes_gpc

    当打开时,所有的 '(单引号),"(双引号),\(反斜线)和 NULL 字符都会被自动加上一个
反斜线进行转义。还有很多函数有类似的作用 如:addslashes()、mysql_escape_string()、
mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影
响。目前大多数的主机都打开了这个选项,并且很多程序员也注意使用上面那些函数去过滤
变量,这看上去很安全。很多漏洞查找者或者工具遇到些函数过滤后的变量直接就放弃,但是
就在他们放弃的同时也放过很多致命的安全漏洞。 :)

5.3.2 哪些地方没有魔术引号的保护
   
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功能里,请看如下代码:

--code-------------------------------------------------------------------------
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);
-------------------------------------------------------------------------------
       
+++++++++++++++++++++++++
漏洞审计策略(数据流)
-------------------------
PHP版本要求:无
系统要求:无
审计策略:查找字符HTTP_RAW_POST_DATA或者php://input
+++++++++++++++++++++++++


4) 数据库操作容易忘记'的地方如:in()/limit/order by/group by
    
    如Discuz!<5.0的pm.php:
    
--code-------------------------------------------------------------------------
if(is_array($msgtobuddys)) {
$msgto = array_merge($msgtobuddys, array($msgtoid));
......
foreach($msgto as $uid) {
$uids .= $comma.$uid;
$comma = ',';
}
......
$query = $db->query("SELECT m.username, mf.ignorepm FROM {$tablepre}members m
LEFT JOIN {$tablepre}memberfields mf USING(uid)
WHERE m.uid IN ($uids)");
-------------------------------------------------------------------------------

+++++++++++++++++++++++++
漏洞审计策略
-------------------------
PHP版本要求:无
系统要求:无
审计策略:查找数据库操作字符(select,update,insert等等)
+++++++++++++++++++++++++

评论 共有 0 条评论

暂无评论,快发表你的评论吧。