看了看qibo发的补丁, 对我之前发的那个洞发了补丁 http://bbs.qibosoft.com/read-forum-tid-422299-fpage-0-page-1.htm这里补丁地址 (最后更新于2014-7-28) 附件: 安全补丁.rar (218 K) 下载次数:15597 刚更新的,对我之前发的那个洞有了防御。 来看看怎么修改的。 ________________________________________________________________ 在inc/common.inc.php中 $_POST=Add_S($_POST); $_GET=Add_S($_GET); $_COOKIE=Add_S($_COOKIE); function Add_S($array){ foreach($array as $key=>$value){ if(!is_array($value)){ $key=str_replace(array("'",'"','\\','&'),'',$key); $value=str_replace("&#x","& # x",$value);//过滤一些不安全字符 $value=preg_replace("/eval/i","eva l",$value);//过滤不安全函数 !get_magic_quotes_gpc() && $value=addslashes($value); $array[$key]=$value; }else{ $array[$key]=Add_S($array[$key]); } } return $array; } 可以看到 这个补丁其实就是在全局的过滤函数中多了一句 $key=str_replace(array("'",'"','\\','&'),'',$key); 看起来好像没问题的样子。 但是实际呢? 这一句代码 不仅不能把 WooYun: qibocms V7 整站系统最新版SQL注入一枚 & 另外一处能引入转义符的地方。 这一处的洞补好 而且还导致了其他的注入漏洞。。。 我们来测试一下qibo的这个过滤函数。
<?php $_GET=Add_S($_GET); var_dump ($_GET); function Add_S($array){ foreach($array as $key=>$value){ if(!is_array($value)){ $key=str_replace(array("'",'"','\\','&'),'',$key); $value=str_replace("&#x","& # x",$value);//过滤一些不安全字符 $value=preg_replace("/eval/i","eva l",$value);//过滤不安全函数 !get_magic_quotes_gpc() && $value=addslashes($value); $array[$key]=$value; }else{ $array[$key]=Add_S($array[$key]); } } return $array; } 依旧用这来看看。
array(2) { ["asd'"]=> string(4) "asd'" ["asd"]=> string(5) "asd\'" } 可以看到提交了一个 而数组中有了两个元素 这点我并没有太清楚 问了一下P神说是 因为提交key为asd' 然后被$key=str_replace(array("'",'"','\\','&'),'',$key);后 然后单引号被清空后 就成了asd 第一次循环的时候并没有asd 就创建了一个这个元素 然后数组里面就有了两个元素。 但是原来的那个还在 就有了array(2) { ["asd'"]=> string(4) "asd'" ["asd"]=> string(5) "asd\'" } 其实我还是没太理解, 但是测试就是这样。 - - 数组中的一个key中含单引号 value中含单引号。 另外一个没有。 这里之前注入就是靠的数组里面的key没过滤 能引入单引号 然后来注入 然后出了这个补丁 连数组中的value都能引入单引号了。 导致了新的注入。。 然后找个foreach 数组的 再把value带入到查询中的就能注入了。 value的点可比key的点多一些了。 我随便找几个点来。 1: vote/vote.php中 foreach($voteId AS $key=>$value) { $db->query("UPDATE {$pre}vote_element SET votenum=votenum+1 WHERE id='$value' "); } 这里是把value带入到了查询 没出这个补丁之前 这里是没办法注入的 因为value是会被转义的。 "多亏"了这个补丁 导致了这里的注入。 这里我输出一下数据 这里由于我们需要数组中有两个元素 所以数组中的key是需要含一个单引号才行 这样key中的单引号被清空后又创建了另外一个元素 就有两个元素了。
成功出数据。 类似的点还有 member/comment.php中 **************/ if($job=='del'){ foreach( $cidDB AS $key=>$value){ $rs=$db->get_one("SELECT aid FROM {$pre}comment WHERE cid='$value'"); 不多说了啊。 修复方案:认真过滤。 |
-
上一篇: cmseasy 最新版20140718 SQL注入一枚(无视360webscan) -
下一篇: Ecmall某处SQL注入第五弹和一处能引入单引号的地
还没有人抢沙发呢~