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
SSRF
触发点PHP
能够发起请求的模块以及函数大致有cURL
file_get_contents()
fopen()
fsockopen()
经过验证是采用的cURL
模块,并且vB
对其进行了二次封装
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
类进行了实例化
如何触发
从已经掌握的信息来看
SSRF
需要的条件有http/https
80/443
VURL_FOLLOWLOCATION
为真vB_vURL
的类或函数做一个取交集我们不难发现core/vb/api/content/link.php
中的函数prasePage()
就是我们的突破口
可控输入点
我们已经找到了如何触发的方法,那么接下来应该寻找可供输入的点
upload/core/vb/api/content/link.php
/upload/include/vb5/frontend/controller/link.php
典型框架入口
URL
:http://localhost/link/getlinkdata
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)
vB_vURL_cURL
类中二次跳转进行更加严格限制