2014-03-21:细节已通知厂商并且等待厂商处理中
2014-03-22:厂商已经确认,细节仅向厂商公开
2014-03-25:细节向第三方安全合作伙伴开放
2014-04-01:细节向核心白帽子及相关领域专家公开
2014-04-11:细节向普通白帽子公开
2014-05-01:细节向实习白帽子公开
2014-06-19:细节向公众公开
或许是最后一次绕过这里了把?
详细说明:上次的漏洞分析: WooYun: 继续绕过cmseasy补丁继续注入 ">WooYun: 继续绕过cmseasy补丁继续注入
首先下载官方的包 看是如何做的处理。 下载之后 看到。
else
foreach ($row as $key=>$value) {
if (in_array($key,explode(',',$this->getcolslist()))) {
$value=$value;
/*if (preg_match('/^\[(.*)\]$/',$value,$match))
$sqlud .= "`$key`"."= '".$match[1]."',";
else*/
可以看到 是把我上次说的那个正则那里 直接注释掉了。
那这次就不用再利用这里了, 换个地方再看看。
但是针对我这里说的: WooYun: 继续绕过cmseasy补丁继续注入 ">WooYun: 继续绕过cmseasy补丁继续注入
condition 这个函数有点小问题 还是没有修复,
这里再提出来一下。
function condition(&$condition) {
if (isset($condition) &&is_array($condition)) {
$_condition=array();
foreach ($condition as $key=>$value) {
//$value=str_replace("'","\'",$value);
$_condition[]="`$key`='$value'";
}
$condition=implode(' and ',$_condition);
}
else if (is_numeric($condition)) {
$this->getFields();
$condition="`$this->primary_key`='$condition'";
}else if(true === $condition){
$condition = 'true';
}
if (get_class($this) == 'archive') {
if (!front::get('deletestate')) {
if ($condition)
$condition.=' and (state IS NULL or state<>\'-1\') ';
else
$condition='state IS NULL or state<>\'-1\' ';
}
else {
if ($condition)
$condition.=' and state=\'-1\' ';
else
$condition=' state=\'-1\' ';
}
}
}
这里有点奇葩。 一般来说 用单引号保护的 是字符型的。
但是在这里 如果是 字符 却没有单引号引着的, 而如果是数字的话 才会被引住。。
略奇葩。。 所以导致了这个漏洞的产生。
如果提交数字的话 UPDATE `cmseasy_p_orders` SET `id`= '1',`status`= '4' WHERE `id`='1'
可以看到有单引号 如果提交字符的话。
UPDATE `cmseasy_p_orders` SET `id`= '1a',`status`= '4' WHERE 1a
where 后面的就没有单引号了。
但是在之前就过滤掉了 = < > 但是 还有依旧可以绕过。
调换一下null和sleep 的位置
如果查询出来的是那么多的话就延时。
好好改一改。
如果是字符的话用单引号引着。
危害等级:高
漏洞Rank:20
确认时间:2014-03-22 07:38
厂商回复:感谢
最新状态:暂无