### 简要描述: 或许是最后一次绕过这里了把? ### 详细说明: 上次的漏洞分析: [WooYun: 继续绕过cmseasy补丁继续注入](http://www.wooyun.org/bugs/wooyun-2014-053737) 首先下载官方的包 看是如何做的处理。 下载之后 看到。 ``` 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补丁继续注入](http://www.wooyun.org/bugs/wooyun-2014-053737) 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...
### 简要描述: 或许是最后一次绕过这里了把? ### 详细说明: 上次的漏洞分析: [WooYun: 继续绕过cmseasy补丁继续注入](http://www.wooyun.org/bugs/wooyun-2014-053737) 首先下载官方的包 看是如何做的处理。 下载之后 看到。 ``` 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补丁继续注入](http://www.wooyun.org/bugs/wooyun-2014-053737) 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\' '; } } } ``` 这里有点奇葩。 一般来说 用单引号保护的 是字符型的。 但是在这里 如果是 字符 却没有单引号引着的, 而如果是数字的话 才会被引住。。 略奇葩。。 所以导致了这个漏洞的产生。 [<img src="https://images.seebug.org/upload/201403/211643069772ac390fd7a7e15a7d0dfd74f3e1cc.jpg" alt="800.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/211643069772ac390fd7a7e15a7d0dfd74f3e1cc.jpg) 如果提交数字的话 UPDATE `cmseasy_p_orders` SET `id`= '1',`status`= '4' WHERE `id`='1' 可以看到有单引号 如果提交字符的话。 [<img src="https://images.seebug.org/upload/201403/21162220c79f709deb474bd03f4cbc78b93c31fc.jpg" alt="801.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/21162220c79f709deb474bd03f4cbc78b93c31fc.jpg) UPDATE `cmseasy_p_orders` SET `id`= '1a',`status`= '4' WHERE 1a where 后面的就没有单引号了。 但是在之前就过滤掉了 = < > 但是 还有依旧可以绕过。 ### 漏洞证明: [<img src="https://images.seebug.org/upload/201403/21162416b350bc3e899ea4ac2a528a65e10bc1b4.jpg" alt="802.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/21162416b350bc3e899ea4ac2a528a65e10bc1b4.jpg) [<img src="https://images.seebug.org/upload/201403/21162521a4897e4483115351406b017204b5a8b9.jpg" alt="803.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201403/21162521a4897e4483115351406b017204b5a8b9.jpg) 调换一下null和sleep 的位置 如果查询出来的是那么多的话就延时。