HDwiki6.0 sql注入
下载连接http://kaiyuan.hoodong.com/download/
漏洞出现在\control\edition.php的docompare()函数
!defined('IN_HDWIKI') && exit('Access Denied'); class control extends base{ ..... function docompare(){ ..... if(@!is_numeric($this->post['eid'][0])||@!is_numeric($this->post['eid'][1])){ $this->message($this->view->lang['parameterError'],'index.php',0); } $edition=$_ENV['doc']->get_edition(array_slice($this->post['eid'], 0, 2)); if($edition[0]['did']!=$edition[1]['did']){ $this->message($this->view->lang['parameterError'],'index.php',0); } ..... } ..... }
首先post['eid'][0]
和post['eid'][1]
必须是数字,不然会报错退出。array_slice()函数的作用是:从数组中移除元素,并返回所移除的元素。
再个关键因素
<?php var_dump($_GET); echo "\r\n<br/>"; var_dump($_POST);
POST和GET 传入的参数,键不会自动排序的,传的时候是什么顺序,接收到的就是什么顺序
把0和1的键放在第三位以后 就不会影响到array_slice拿前两位了 这样既绕过了if 又能使get_edition()参数可控
在\model\doc.class.php中
$eid=implode(",",$eid); $query=$this->db->query(" SELECT * FROM ".DB_TABLEPRE."edition WHERE eid IN ($eid)");
直接拼接造成注入