### 简要描述: 自从补课补完了 感觉自己都完全荒废了。 睡觉 看电视 看小说。 唉。 得开始努力学习考大学 哦也。 _ 看到map牛 发了几个dz7.2的 也看到还在更新 我也就看了看 前台注入一枚, 也都知道 如果ucenter 和 DZ 在一个裤里面的话就可以拿到uc_key 拿到uc_key了 然后……。 很简单的一个洞。 ### 详细说明: http://download.discuz.net/Discuz/7.2/Discuz_7.2_SC_GBK.zip 刚在官网下的这个。 首先说一下 这洞需要有权限发布投票才行 刚注册的会员是不能发布投票的 我看了下默认发布投票需要的权限 需要从注册会员开始才有发布投票的权限 [<img src="https://images.seebug.org/upload/201408/08011459cbc4c347ec713c3f956c2835197c1f92.jpg" alt="1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/08011459cbc4c347ec713c3f956c2835197c1f92.jpg) [<img src="https://images.seebug.org/upload/201408/08013442c4c5ed144ad678df4dde4507853ca293.jpg" alt="2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/08013442c4c5ed144ad678df4dde4507853ca293.jpg) 看了一下注册会员所需要的积分是50分 50分 上传个头像 做个任务就差不多了(所以狗哥 这不算限制条件把?) _ 在post.php中 从263行开始 也就是最后的那几行 ``` if($action == 'newthread') { ($forum['allowpost'] == -1) && showmessage('forum_access_disallow');...
### 简要描述: 自从补课补完了 感觉自己都完全荒废了。 睡觉 看电视 看小说。 唉。 得开始努力学习考大学 哦也。 _ 看到map牛 发了几个dz7.2的 也看到还在更新 我也就看了看 前台注入一枚, 也都知道 如果ucenter 和 DZ 在一个裤里面的话就可以拿到uc_key 拿到uc_key了 然后……。 很简单的一个洞。 ### 详细说明: http://download.discuz.net/Discuz/7.2/Discuz_7.2_SC_GBK.zip 刚在官网下的这个。 首先说一下 这洞需要有权限发布投票才行 刚注册的会员是不能发布投票的 我看了下默认发布投票需要的权限 需要从注册会员开始才有发布投票的权限 [<img src="https://images.seebug.org/upload/201408/08011459cbc4c347ec713c3f956c2835197c1f92.jpg" alt="1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/08011459cbc4c347ec713c3f956c2835197c1f92.jpg) [<img src="https://images.seebug.org/upload/201408/08013442c4c5ed144ad678df4dde4507853ca293.jpg" alt="2.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/08013442c4c5ed144ad678df4dde4507853ca293.jpg) 看了一下注册会员所需要的积分是50分 50分 上传个头像 做个任务就差不多了(所以狗哥 这不算限制条件把?) _ 在post.php中 从263行开始 也就是最后的那几行 ``` if($action == 'newthread') { ($forum['allowpost'] == -1) && showmessage('forum_access_disallow'); require_once DISCUZ_ROOT.'./include/newthread.inc.php'; } elseif($action == 'reply') { ($forum['allowreply'] == -1) && showmessage('forum_access_disallow'); require_once DISCUZ_ROOT.'./include/newreply.inc.php'; } elseif($action == 'edit') { ($forum['allowpost'] == -1) && showmessage('forum_access_disallow'); require_once DISCUZ_ROOT.'./include/editpost.inc.php'; } elseif($action == 'newtrade') { ($forum['allowpost'] == -1) && showmessage('forum_access_disallow'); require_once DISCUZ_ROOT.'./include/newtrade.inc.php'; } ``` 包含了这么多文件进来 我找了这个文件看了起来include/editpost.inc.php 然后在include/editpost.inc.php 第272行左右 ``` if($thread['special'] == 1 && ($alloweditpoll || $isorigauthor) && !empty($polls)) { $pollarray = ''; $pollarray['options'] = $polloption; if($pollarray['options']) { if(count($pollarray['options']) > $maxpolloptions) { showmessage('post_poll_option_toomany'); } foreach($pollarray['options'] as $key => $value) { if(!trim($value)) { $db->query("DELETE FROM {$tablepre}polloptions WHERE polloptionid='$key' AND tid='$tid'"); unset($pollarray['options'][$key]); } } $polladd = ', special=\'1\''; ``` foreach($pollarray['options'] as $key => $value) { 这里直接把数组中的key带入到了delete查询当中。 再来看一下dz的全局文件 ``` foreach(array('_COOKIE', '_POST', '_GET') as $_request) { foreach($$_request as $_key => $_value) { $_key{0} != '_' && $$_key = daddslashes($_value); } } ``` ``` function daddslashes($string, $force = 0) { !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc()); if(!MAGIC_QUOTES_GPC || $force) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = daddslashes($val, $force); } } else { $string = addslashes($string); } } return $string; } ``` 这里先判断了gpc是否开启 如果没有开启 就用addslashes再来转义 这里对数组中的value进行转义 key无过滤。 ``` $db->query("DELETE FROM {$tablepre}polloptions WHERE polloptionid='$key' AND tid='$tid' ``` 所以再进行这个查询的时候 我们就可以引入单引号了。 ___ 在执行循环之前有一个条件 if($thread['special'] == 1 && ($alloweditpoll || $isorigauthor) && !empty($polls)) 这里($alloweditpoll || $isorigauthor) $isorigauthor判断是不是你是作者 如果你编辑的是你的文章的话 肯定是true。 $polls 这个直接就可以控制。 $thread['special'] == 1 之前我一直在纠结这个是啥东西。。 后面看了看发文章的时候的代码 这个$thread['special'] == 1代表的就是发布的是投票。 那如果我们自己发布一个投票 然后再编辑 就可以进入这里了。 [<img src="https://images.seebug.org/upload/201408/0801521942529ff6611176d8e095a6a8185815e7.jpg" alt="3.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/0801521942529ff6611176d8e095a6a8185815e7.jpg) 首先发布一个投票。 发布完后 再点击编辑。 然后再抓一下包。 这里我输出了一下 ``` $polladd = ''; if($thread['special'] == 1 && ($alloweditpoll || $isorigauthor) && !empty($polls)) { $pollarray = ''; $pollarray['options'] = $polloption; var_dump ($polloption);exit;//输出 ``` [<img src="https://images.seebug.org/upload/201408/08015529f9aba8a3a679fbb4475045dad39e3277.jpg" alt="4.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/08015529f9aba8a3a679fbb4475045dad39e3277.jpg) 我擦 一看竟然已经有值了? 在这里我本来已经准备放弃了, 但是还是抱着试一试的态度 在url写了这个 [<img src="https://images.seebug.org/upload/201408/08020717a79215e4b613759e293ec970f0214934.jpg" alt="5.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/08020717a79215e4b613759e293ec970f0214934.jpg) 发现还是可以控制 而且单引号 理所应当的没有被转义。 那不是就可以注入了吗? 构造一下语句。 ``` if(!trim($value)) { $db->query("DELETE FROM {$tablepre}polloptions WHERE polloptionid='$key' AND tid='$tid'"); ``` 因为这里 数组中的value为false的时候才会进去 所以这里数组的value我们就不写 [<img src="https://images.seebug.org/upload/201408/08020913559a3912f35b9f727b56209b31af4c95.jpg" alt="6.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/08020913559a3912f35b9f727b56209b31af4c95.jpg) 成功出数据。 ### 漏洞证明: [<img src="https://images.seebug.org/upload/201408/08020913559a3912f35b9f727b56209b31af4c95.jpg" alt="6.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201408/08020913559a3912f35b9f727b56209b31af4c95.jpg)