绪论
随着互联网的普及和发展,Web应用程序已经成为人们日常生活中不可或缺的一部分。然而,Web应用程序也存在着许多安全漏洞,其中一种常见的漏洞就是SSRF(Server-Side Request Forgery,SSRF)。SSRF漏洞允许攻击者通过构造恶意请求,向外部服务器发送请求,从而获取敏感信息或执行任意代码。本文专注于探讨服务器请求伪造(Server-Side Request Forgery,SSRF)漏洞及其在内网攻击中的应用,特别是结合其他常见漏洞(如SQL注入)对内部服务的潜在威胁。SSRF作为一种危险的攻击手段,其允许攻击者发送伪造的服务请求,从而绕过安全措施以探索和利用内网环境中的脆弱性。
1 SSRF漏洞的基本原理
SSRF漏洞产生的原因是开发人员在编写代码时没有对用户输入的URL进行充分的验证和过滤,导致攻击者可以将恶意URL作为参数传递给程序,从而欺骗服务器向该恶意URL发送请求。
2 SSRF的利用
SSRF漏洞利用的目标机器往往是从外网无法直接访问的内部系统,攻击方式多为借助一台可以通过外网访问且存在SSRF漏洞的服务,通过该服务向内网系统中的服务发起请求,从而获取获取到内网系统中的主机或服务的信息。想要对SSRF的攻击手段进行了解和利用,要先熟悉几个常用的伪协议。
2.1 SSRF漏洞利用中的伪协议
常用的伪协议有file://
、dict://
、gopher://
、ftp://
等,前三种使用最为广泛,file://伪协议常用于获从文件系统中获取文件内容,如file:///etc/hosts,dict://伪协议多用于获取内网系统中的服务信息,gopher://伪协议是一种分布式文档传递服务,可以理解为HTTP协议的前身或者简化版本,gopher常用于在SSRF实施攻击时,发送GET或者POST请求,向内网系统中的服务发送恶意的请求。
2.2 SSRF在内网探测中的使用
对于SSRF的原理和伪协议有了简单的了解之后,便可以开始对内网中的主机或者服务进行探测。当发现一个存在着SSRF漏洞的外网服务时(多存在于从指定的URL地址获取网页文本、加载指定URL地址的图片或者进行下载等服务),需要开始对不出网的服务(即内网)进行初步的探测,面对一个未知的服务环境,是不知道内网服务的网段,根据RFC 1918定义,内网地址一般包括三个网段:10.0.0.0/8
、172.16.0.0/12
和192.168.0.0/16
,在进行开始正式的内网探测之前,还需知道,系统的hosts文件记录这主机的IP地址,可以通过file://伪协议查看该文件的记录了解内网的网段,通过SSRF漏洞使用HTTP协议尝试访问该网段的所有IP地址,再次使用file://伪协议去查看内网系统的ARP缓存表,根据Flags的值,可以得到该网段上所有存活的主机。本论文中所讨论的网络结构如下图:
在得到存活主机后,便针对存活主机,使用dict://伪协议,搭配BurpSuite依次对服务端口进行暴力访问,根据响应长度即可获取内网中的系统中运行着什么服务,在该网络架构中,通过dict://伪协议对内网中的服务探测,可知内网中运行者SQL服务,MySQL服务,PHP网页,以及其他的服务。HTTP协议在SSRF漏洞利用中,除了增加ARP缓存表的记录,还常用于内网服务的目录遍历。到此,对内网的信息收集也就初步完成了。
2.3 SSRF与其他漏洞的组合拳
SSRF的基本危害在于读取文件系统的内容,泄露内网中的系统信息和服务信息,攻击方可以借此获取内网服务的指纹信息,识别企业内部的资产信息。内网内的服务往往较于公开的服务更容易利用。其最大的危害是与其他的漏洞进行组合攻击。在上图的这个环境中,存在着一些故意留下的漏洞信息,接下当前环境来介绍几种常见的组合拳:
2.3.1 SSRF 和 Gopher伪协议的利用
在前面简单的了解了什么是Gopher伪协议,但还没使用Gopher伪协议做些什么,在这个环境的172.250.250.4运行这一个PHP服务,通过SSRF对内网进行探测可以获取该服务的内容,利用过程如下:
服务内容很简单,目的是为了展示Gopher伪协议的使用,深入了解一下如何使用Gopher伪协议进行GET和POST传参。
这里需要注意几个小问题,Gopher的默认端口为70,Gopher协议不会传输第一个字符,因此要指定非70端口的服务,且需要一个站位符。上图中的GET传参已经被正确的识别,至于对Payload怎么URL编码,这里只介绍通过浏览器提交Payload,众所周知,浏览器在发送数据时会对数据进行一次URL编码,而浏览器在接受数据时会对接受的数据进行一次URL解码。以SSRF漏洞主机为跳板,SSRF漏洞主机接受到数据会进行一次解码,再向内网中的其他内网服务进行发送请求,当内网服务接受到数据后会再进行一次解码,因此如果通过浏览器进行提交则需要预先进行一次URL编码。
对于Gopher伪协议发送POST请求比发送GET请求更为复杂,必须的请求头比GET请求多了Content-Type 和 Content-Length
至此,对于Gopher伪协议的基本GET和POST请求发送已经成功构造。接下来就是使用Gopher伪协议进行漏洞利用。
2.3.2 SSRF 和 SQL注入漏洞
SSRF漏洞配合其他漏洞的使用,大多是Gopher伪协议与其他漏洞的组合拳。Web漏洞的利用几乎都是通过GET或者POST请求发送恶意的Payload,而Gopher伪协议也可与进行GET、POST请求。在该环境中的172.250.250.11的内网主机中存在着一个SQLilabs漏洞环境,用于演示SSRF与SQL注入的组合拳,至于怎么获取到服务具体的路径目录,只需要用HTTP协议进行目录遍历即可。在发现可能存在的路径时,即可使用Gopher伪协议发送恶意请求以达到利用漏洞的目的。比如在该例子中,我们发现了内网中存在SQL注入的页面,其内网路径为 http://172.250.250.11/Less-1/index.php,该页面的请求方式为GET请求,接收的参数为 id。构造Payload如下,根据浏览器传参是的URL编码和解码的特性,需要预先进行一次URL编码。
响应结果如下:
可以发现该处是存在联合注入漏洞,只要按照Gopher伪协议的特性,结合SQL注入的漏洞进行构造Payload,最终就能获取到内网中该服务的数据,甚至是GetShell。接下来将会了解通过SSRF漏洞访问内网中的MySQL服务。
2.3.3 SSRF 和 MySQL未授权访问
搭建过需要数据库的服务或者网站就会知道,为了服务或网站的数据安全,数据库一般是不出网的,只能通过内网进行访问,因此当知道服务存在脆弱的Mysql数据库也是无法利用的,因为根本就无法通过公网访问。而通过SSRF漏洞可以直接连接内网中未授权的MySQL数据库。(内网中的服务往往是脆弱的,相较于暴露于公网中的服务,更容易在内网中找到漏洞,这也是开发者的侥幸心理,认为外人不可访问的服务就是安全的)。SSRF漏洞与MySQL未授权访问有现成的项目可以利用。
响应结果如下:
SSRF漏洞与其他漏洞的组合拳远不于此,SSRF漏洞还可以对内网中的Redis、FastCGI、PostgreSQL等服务进行攻击,对于内网中的漏洞利用的危害是巨大的,因此要做好对SSRF漏洞的预防。
3 SSRF的预防
对于SSRF漏洞的预防,有以下几种常见的方式:禁止302跳转,或者对每跳转一次都进行校验目的地址是否为内网地址或合法地址;过滤返回信息,验证远程服务器对请求的返回结果,是否合法;禁用高危协议,例如:gopher、dict、ftp、file等,只允许HTTP/HTTPS;设置URL白名单或者限制内网IP;catch错误信息,做统一错误信息,避免黑客通过错误信息判断端口对应的服务。
结论
本文通过对跨越边界攻击(SSRF技术)的研究,详细探讨了SSRF在内网探测中的利用,以及SSRF漏洞与其他内网漏洞的组合拳,揭示了网络安全面临的严峻挑战。在互联网快速发展的时代,网络安全也愈发严峻与重要,应用程序的边界变得模糊,通过SSRF漏洞,攻击者可以进行一些危险的操作,对目标系统的内部执行一些危险的操作,为用户造成不可挽回的巨大损失。本文不仅仅停留在理论的层面,也通过对类真实环境的攻击,来演示SSRF与其他漏洞组合的危害之巨大,最后提出有效的防治措施,能够有效地防御SSRF攻击,增加内部系统的安全性。