◆方欣 刘占丰
基于SSRF和XXE漏洞的内网攻击技术研究
◆方欣1刘占丰2
(1.长春职业技术学院 吉林 130000;2.吉林信息安全测评中心 吉林 130000)
SSRF(服务器端请求伪造)漏洞和XXE(XML外部实体注入)漏洞是近几年较新的WEB应用漏洞,不同于传统的SQL注入、XSS、文件上传等漏洞侧重于外网攻击,SSRF漏洞和XXE漏洞主要针对内网进行攻击。恶意攻击者利用两种漏洞对WEB端的某些功能未进行严格过滤的缺陷,突破外网无法访问内部网络的限制,对内网服务器进行端口探测、读取文件、攻击内网应用、执行系统命令等操作,严重威胁内网安全。本文详细阐述了SSRF漏洞和XXE漏洞的原理和利用方法,分析了两种漏洞对内网产生的危害,并提出了两种漏洞的防御方法。
SSRF漏洞;XXE漏洞;内网攻击;WEB安全
近年来,重大网络安全事故频发,2013年的斯诺登事件和2017年的永恒之蓝勒索病毒的暴发,引发了全世界对互联网高度发展时期信息泄露的担忧和网络安全事件的恐慌。在各种网络安全事件中,WEB安全问题尤为突出,并受到各个网络安全公司和网站管理人员的高度关注,根据《OWASP Top 10 2017》显示,SSRF漏洞和XXE漏洞均为排名靠前的高危安全漏洞,一旦被恶意攻击者利用,便会对整个内网造成严重的安全威胁[1]。因此,本文对SSRF漏洞和XXE漏洞的攻击方式进行分析,研究其防御方法,以提高网站维护人员的安全防御能力。
SSRF即为服务器端请求伪造(Server-Side Request Forge),黑客可以利用SSRF漏洞对服务器发起伪造的请求,以达到访问内网数据的目的,并进行内网漏洞利用或内网信息探测[2]。
WEB应用如果对访问的地址没有进行过滤或过滤的不严,便会导致WEB应用能够访问任意的URL地址,黑客通过构造出恶意的URL链接,可利用服务器端请求伪造漏洞进行多种类型的内网攻击。黑客可对内网的应用程序(Redis、Jboss等)进行攻击;可以使用file协议读取内网服务器的文件;可获取内网主机的各种指纹信息和端口信息,也可以对内网程序造成溢出。
XXE即XML外部实体注入(XML External Entity),XXE漏洞产生的原因是由于WEB应用在解析XML时,没有对外部实体的加载进行严格地过滤,这样便加载了带有payload的外部文件,因而会造成内网应用攻击、系统文件读取、内网扫描、命令执行等情况。
可扩展标记语言(EXtensible Markup Language,XML)可以结构化传输和存储信息,XML文档结构包括XML声明、DTD文档类型定义、文档元素这三个部分[3]。XML文档结构如图1所示。
DTD(Document Type Definition)包括基础语法、内部定义、外部文档引用三个部分。
(1)DTD基础语法
XML中元素定义的基础语法为:。
(2)内部定义
将文档类型定义直接放在XML文档中称之为内部定义。
(3)外部文档引用
文档类型定义的内容也可以保存为单独的DTD文档。
1)DTD文档在本地
例如:
2)DTD文档在公共网络上
例如:
图1 XML文档结构
SSRF漏洞示例代码如图2所示。
图2 SSRF漏洞代码
代码中的curl_exec函数负责请求传入的URL,然后将请求的结果返回。正常情况下,url参数传入http://192.168.1.1/ssrftest/ssrf.txt,curl_exec函数访问192.168.1.1/ssrftest/ssrf.txt,显示”SSRF测试信息”,但是传入的url参数没有经过严格过滤,这样就可能会造成SSRF服务端请求伪造。
XXE漏洞主要是因为WEB应用对外部实体的加载没有进行严格地过滤,可能造成内网扫描和内网应用攻击,XXE漏洞示例代码如图3所示。
图3 XXE漏洞代码
以上代码中,file_get_contents函数读取了php://input传入的数据,但是传入的数据没有经过任何过滤,直接在loadXML函数中进行了调用并通过echo函数输出了$username的结果,这样就导致了XXE漏洞的产生。
url参数没有经过严格过滤就可以构造任意的url进行SSRF漏洞利用,比如可以通过http://192.168.1.100:3306来探测内网服务器(IP地址为192.168.1.100)是否开启3306端口。输入http://192.168.1.1/ssrftest/1.php?url=http://192.168.1.100:3306发现返回了数据库的版本信息,说明内网服务器确实开启了3306端口。若没有数据返回或返回时间延迟较大,就说明3306端口没有开放。
SSRF漏洞可以通过file协议尝试读取内网服务器的常见敏感文件,比如/etc/passwd文件。输入http://192.168.1.1/ssrftest/1.php?url=file:///etc/passwd,返回了目标服务器的用户信息。
SSRF漏洞可以对内部网络具有命令执行漏洞的WEB应用发起攻击,例如可利用此漏洞攻击存在Jboss未授权访问漏洞的WEB应用,攻击过程如下。
(1)信息探测。利用SSRF漏洞对内部网络进行扫描,如存在具有此漏洞的服务器,便可探测到开启了JBoss服务的被攻击机。
(2)访问jmx控制台。尝试访问JBoss的jmx控制台,输入以下测试语句:http://192.168.1.1/ssrftest/1.php?url=http://192.168.1.100:3306/jmx-console/,发现存在jmx控制台未授权访问漏洞,可以通过jboss.deployment接口部署Web木马。
(3)部署木马。通过jboss.deployment接口部署Web木马,在本地搭建的测试环境抓包,构造payload,然后通过SSRF发送payload,攻击内网应用。
(4)获得Webshell。利用SSRF漏洞发起payload攻击,发现已成功获得Webshell。
(5)执行命令。利用上传的木马,可以执行各种系统命令,如whoami。
利用XXE漏洞进行内网探测,如果端口开启,请求返回的时间会很快;如果端口关闭,请求返回的时间会很慢。探测22端口是否开启的payload如下:
]>
若在执行完成后,页面很快返回,并有SSH的banner信息,说明22端口开启;若在执行完成后,页面返回很慢,并且有以下报错信息“failedtoopenstream:Connection refused”,说明端口未开启。
通过加载外部实体,利用file://、php://等伪协议读取本地文件。file://伪协议payload如下。
]>
通过POST方法提交payload,读取/etc/passwd文件的内容。但是利用file://伪协议无法读取PHP文件的内容,因为读取的内容会被解析执行,看不到源码。可以利用php://伪协议对文件内容进行Base64编码,这样就可以读到Base64编码后的源码,然后再通过Base64解码就能获得源码数据。
通过XXE漏洞可对内网应用程序进行攻击,例如利用如下攻击代码对内网存在jmx控制台未授权访问漏洞的Jboss进行攻击。
&name=jboss.deployment:type=DeploymentScanner,flavor=URL&methodIndex=7&arg0=http://192.168.1.1/cmd.war">]>
针对SSRF漏洞的修复方法包括:对返回的错误信息进行设置,使返回的信息保持一致;对访问服务器的端口和IP进行限制,禁止外网服务器访问内网地址;在防火墙上设置细粒度的协议过滤,内网服务器仅开放http等必要的协议对其可以访问[4]。针对XXE漏洞的修复方法包括:对用户所提交的数据进行严格过滤,如PUBLIC、SYSTEM、ENTITY等敏感词;将libxml_disable_entity_loader设置为true,禁用外部实体[5]。
本文研究了SSRF漏洞和XXE漏洞的基本原理,对两种漏洞的攻击方式进行分析和验证,并提出了相应的防御方法。相比于主要攻击外网的SQL注入、文件上传、跨站脚本等漏洞,SSRF漏洞和XXE漏洞不仅攻击WEB应用本身,更能对整个内网造成严重的安全威胁。因此,WEB应用开发者和网站安全维护人员应时刻坚持零信任安全理念,不仅需要对外网攻击加强防护,同时也应严格限制内网服务器的访问权限、禁用外部实体、对用户提交的数据严格过滤,以提高WEB应用的安全防护水平。
[1]印鸿吉.采用图遍历算法的服务端请求伪造漏洞检测[J].计算机工程与应用,2020(19):114-119.
[2]何金栋.Weblogic_SSRF漏洞检测系统的设计和实现[J].通讯世界,2017(21):44-46.
[3]应宗浩.XXE漏洞及其防御策略研究[J].科技风,2018(19):54.
[4]张军.SSRF漏洞检测、利用及防范[J].通信与信息技术,2015(03):69-71.
[5]邱永哲.XXE漏洞攻击与防御研究[J].无线互联科技,2018(06):34-36.
全国高等院校计算机基础教育研究会计算机基础教育教学研究项目(2021-AFCEC-501);长春市教育科学2020年度规划课题(JKBLX-2020218)