struts2漏洞 S2-001实例分析


这期内容当中小编将会给大家带来有关struts2漏洞 S2-001实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。struts2漏洞 S2-001是当用户提交表单数据且验证失败时,服务器使用OGNL表达式解析用户先前提交的参数值,%{value}并重新填充相应的表单数据。例如,在注册或登录页面中。如果提交失败,则服务器通常默认情况下将返回先前提交的数据。由于服务器用于%{value}对提交的数据执行OGNL表达式解析,因此服务器可以直接发送有效载荷来执行命令。用vulhub复现漏洞可以省去环境的搭建过程,相当方便。vulhub官网地址:https://vulhub.org
启动漏洞环境。输入测试的payload可以看到我们的加法表达式成功执行了。
这次我们试一试命令执行,new java.lang.String[ {“cat”,”/etc/passwd”}在这里更改我们想要执行的命令。成功的读取到了passwd文件。

下面给出三条利用语句:平台:win10工具:Apache Tomcat 9.0.7,IntelliJ IDEA下载IntelliJ IDE之后我免费云主机域名们选择免费试用一个月,接下来创建我们的项目。这个是搭建完成后的效果,下边所有创建添加的jar包或者修改的文件都按照这个格式进行。
目录结构如下。

需要如下几个包,下载地址:http://archive.apache.org/dist/struts/binaries/struts-2.0.1-all.zip解压完之后,我们把lib目录下对应的jar包导入到我们在项目中创建的lib目录中。接着发布我们导入的jar包,不然会报错。接下来就是我们要创建的几个文件,这里代码都给出来了,直接copy就行。(注意:一定要按照前边给出的目录结构放置下边的文件)web.xmlindex.jsplink:https://cwiki.apache.org/confluence/display/WW/S2-001welcome.jspHelloLoginAction.javasrc目录下新建struts.xml漏洞部分代码xwork-2.0-beta-1.jar/com.opensymphony.xwork2/util/TextParseUtil.java运行我们搭建好的环境,记得开启debug模式password处输入我们的测试语句:%{333*666},正确结果是多少来着,待我找个计算机算一下先(手动笑哭表情)
expression会获取不同的参数值,我们直到其获取到password开始分析漏洞原因。然后这次的判断跳过了中间的return,为啥会跳过return呢?因为这里的password内容任然是一个ognl表达式所以会再次进入循环,接着这里取出%{password}中间的值password赋给var。在解析完%{password}表达式之后要获取其中的内容password进行展示,也就是我们这里的%{333*666}然后这次的判断同样也会跳过中间的return,为啥会跳过return呢?因为这里的password内容依然是一个ognl表达式所以会再次进入循环,接着这里取出%{333*666}中间的值333*666赋给var。
然后通过Object o = stack.findValue(var, asType)获得到password的值为333*666,然后重新赋值给expression,进行下一次循环。在这一次循环的时候,就会解析333*666,并将赋值给了o,经过计算后expression的值就变成了221788。不是OGNL表达式时就会进入

判断了循环的次数,从而在解析到%{333*666}的时候不会继续向下递归,相当于限制了解析ongl的次数。
也就不会对用户提交的参数进行ongl解析这里搬运大佬总结好的东西。OGNL 是 Object-Graph Navigation Language 的缩写,它是一种功能强大的表达式语言(Expression Language,简称为 EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。 OGNL 三要素:(以下部分摘抄互联网某处, 我觉得说得好)1、表达式(Expression)表达式是整个 OGNL 的核心,所有的 OGNL 操作都是针对表达式的解析后进行的。表达式会规定此次 OGNL 操作到底要干什么。我们可以看到,在上面的测试中,name、department.name 等都是表达式,表示取 name 或者 department 中的 name 的值。OGNL 支持很多类型的表达式,之后我们会看到更多。2、根对象(Root Object)根对象可以理解为 OGNL 的操作对象。在表达式规定了 “干什么” 以后,你还需要指定到底“对谁干”。在上面的测试代码中,user 就是根对象。这就意味着,我们需要对 user 这个对象去取 name 这个属性的值(对 user 这个对象去设置其中的 department 中的 name 属性值)。3、上下文环境(Context)有了表达式和根对象,我们实际上已经可以使用 OGNL 的基本功能。例如,根据表达式对根对象进行取值或者设值工作。不过实际上,在 OGNL 的内部,所有的操作都会在一个特定的环境中运行,这个环境就是 OGNL 的上下文环境(Context)。说得再明白一些,就是这个上下文环境(Context),将规定 OGNL 的操作 “在哪里干”。
OGN L 的上下文环境是一个 Map 结构,称之为 OgnlContext。上面我们提到的根对象(Root
Object),事实上也会被加入到上下文环境中去,并且这将作为一个特殊的变量进行处理,具体就表现为针对根对象(Root
Object)的存取操作的表达式是不需要增加 #符号进行区分的。上述就是小编为大家分享的struts2漏洞 S2-001实例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注云编程开发博客行业资讯频道。

相关推荐: linux下mkdir命令如何使用

本文小编为大家详细介绍“linux下mkdir命令如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux下mkdir命令如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。linux mkdir 命令用来创建指定的名称…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/07 09:50
下一篇 02/07 09:51