Author: c1tas, p0wd3r (知道创宇404安全实验室)

CVE: CVE-2016-6483

一、漏洞概述

vBulletin 接受url参数,未禁止跳转导致SSRF

vBulletin 需要这个功能来访问外部连接,但是对此处限制不严导致可以引发redirect

漏洞存在版本:

vBulletin <= 5.2.2

vBulletin <= 4.2.3

vBulletin <= 3.8.9

二、漏洞复现

漏洞分析

漏洞流程

分析过程

  1. 寻找SSRF触发点
  2. PHP能够发起请求的模块以及函数大致有
    • cURL
    • file_get_contents()
    • fopen()
    • fsockopen()

经过验证是采用的cURL模块,并且vB对其进行了二次封装

  1. cURL类进行跟踪

所以根据上诉搜结果定位到

/upload/core/vb/vurl/curl.php

经过阅读源码,发现这个封装的最底层的实现cURL的类

拿到了这个最下层的类我们继续往上寻找他在哪里被调用

所以我们来看class vB_vURL的核心代码

继续往上跟踪寻找vB_vURL被实例化的地方 - core/includes/class_apiclient.php - class vB_APIClient - public function __construct - core/includes/class_humanverify_recaptcha.php - class vB_HumanVerify_Recaptcha - function verify_token - core/includes/class_sitemap.php - class vB_SiteMapRunner - public function ping_search_engines - core/includes/class_upload.php - abstract class vB_Upload_Abstract - function accept_upload - function fetch_remote_filesize - core/includes/functions_file.php - function fetch_body_request - core/includes/paymentapi/class_google.php - class vB_PaidSubscriptionMethod_google - public function verify_payment - core/vb/akismet.php - class vB_Akismet - protected function _submit - core/vb/api/content/link.php - class vB_Api_Content_Link - public function parsePage - core/vb/api/profile.php - class vB_Api_Profile - public function uploadUrl - core/vb/library/content/attach.php - class vB_Library_Content_Attach - public function uploadUrl - core/vb/library/content/video.php - class vB_Library_Content_Video - public function getVideoFromUrl - core/vb/stopforumspam.php - class vB_StopForumSpam - protected function _submit

在上述类或函数中对vB_vURL类进行了实例化

  1. 如何触发

  2. 从已经掌握的信息来看

    • 一次跳转触发SSRF需要的条件有
    • 访问的协议是http/https
    • 禁止本地地址
    • 仅限80/443
    • 很明显在一次跳转的情况下基本无法完成有威胁操作
  3. 那么只能从二次跳转入手
    • 需要条件VURL_FOLLOWLOCATION为真
  4. 再与上述具有实例化vB_vURL的类或函数做一个取交集我们不难发现
  5. core/vb/api/content/link.php中的函数prasePage()就是我们的突破口

  6. 可控输入点

  7. 我们已经找到了如何触发的方法,那么接下来应该寻找可供输入的点

  8. 从上述结果中阅读源码发现

upload/core/vb/api/content/link.php

  • 继续向上游寻找调用点
  • /upload/include/vb5/frontend/controller/link.php

  • 典型框架入口

  1. 路由解析

  1. 故构造触发URL:http://localhost/link/getlinkdata

3.漏洞利用

Demo

#!/usr/bin/env python
# coding: utf-8

import requests as req

u = 'vB_Server'
redirect_server = 'Your_VPS:80'
vul_url = u + '/link/getlinkdata'
data = {
    'url': redirect_server
}
req.post(vul_url, data=data)

4.漏洞修复

  • 厂商对vB_vURL_cURL类中二次跳转进行更加严格限制
  • 用户等待升级版本或者修改上述触发漏洞源码

三、参考


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/24/