从phpcmsv9.6.1谈常见变量覆盖

Posted by sp4rk on May 7, 2017

0x00

  之前看了phpcms以前的洞,phpcmsv9.6.1是存在任意文件读取的,漏洞分析:传送门其中parse_str扮演了关键角色。   简单说下关键点,调用的file_down读取函数去读取$fileurl(由$s和$f拼接)文件路径,这里有正则过滤(不能读取php)

$fileurl = str_replace(array('<','>'), '',$fileurl);

这里str_replace导致$s,$f可以绕过正则过滤($s为1.ph,$f为<p),但是这里有个safe_replace()过滤函数使’<’,’>’被替换为空。这里经过的parse_str()能起urlencode的作用使传入url编码即可绕过safe_replace引入’<’,’>’。

0x01

  先看php.net中关于parse_str的介绍:将 encoded_string 解析为通过 URL 传递的查询字符串, 并在当前作用域中设置变量 (如果提供了结果, 则在数组中)。

<?php
$a ='b=%3e%3c';
parse_str($a);
function safe_replace($string){
    $string = str_replace('%20','',$string);
    $string = str_replace('%27','',$string);
    $string = str_replace('%2527','',$string);
    $string = str_replace('*','',$string);
    $string = str_replace('"','"',$string);
    $string = str_replace("'",'',$string);
    $string = str_replace('"','',$string);
    $string = str_replace(';','',$string);
    $string = str_replace('<','<',$string);
    $string = str_replace('>','>',$string);
	return $string;
}
$a = safe_replace($a);
echo $a."</br>";
echo $b;
?>

extract:从数组中将变量导入到当前的符号表,使用数组键名作为变量名,使用数组键值作为变量值,如果一些全局变量可控且经过extract会造成变量覆盖导致伪全局变量的出现,如果没有对新出现的变量进行过滤操作,则会造成一些漏洞危害。

<?php
$a = array('a'=>'test1','b'=>'test2');
extract($a);
echo $a."</br>";
@extract($_POST);//可以直接覆盖
echo $a."</br>";
echo $b."</br>";
?>

extract变量覆盖代码审计实例:qibocms分类注入一枚可提升自己为管理 可变变量$$造成的变量覆盖:

<?php
$a= 'test';
echo $a."</br>";
foreach(array('_COOKIE','_POST','_GET')as $_request){
    foreach($$_request as $_key=>$_value){
        $$_key = addslashes($_value);
    }
}
echo $a;
?>

$$变量覆盖代码审计实例:MetInfo最新版(5.2.4)一处SQL盲注漏洞