array_slice()函数造成的一次sql注入

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);

array_slice()函数造成的一次sql注入

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)");

直接拼接造成注入

array_slice()函数造成的一次sql注入

上一篇:Linux中的版本控制---diff和patch命令


下一篇:异常处理与MiniDump 用于投放市场c++异常捕获