linux struts2漏洞,Struts2漏洞分析,漏洞波及全系版本
大家好,又见面了,我是你们的朋友全栈君。
Struts漏洞分析
Apache Struts团队已经发布了Struts 2.3.15.1安全更新版本。在Struts2.3.15.1版本之前,存在着严重的安全漏洞,如果现在一些比较大的网站是用JAVA做的,没有把版本升级,还用的是Strtus2.3.15.1版本之前的话,那么你们就要小心,服务器被黑了哦。 下面就来说一下之前版本,Struts2的漏洞是如何产生的,我们自己去做,该如何的去解决这个安全漏洞:
我听有人说: “这算什么漏洞”,我想说的是:“你在浏览器就能把别个服务器搞蹦掉,让它停掉没工作了,这能不是高危漏洞么”。
1. 我用的是struts_2.1.8.1这个版本,如果你用最新的安全版本,是不会出现这个安全问题的。在浏览器输入如下地址:
http://www.xxxx.com/xxx.action?(‘\u0023_memberAccess[\’allowStaticMethodAccess\’]’)(meh)=true&(aaa)((‘\u0023context[\’xwork.MethodAccessor.denyMethodExecution\’]\u003d\u0023foo’)(\u0023foo\u003dnew%20java.lang.Boolean(“false”)))&(asdf)((‘\u0023rt.exit(1)’)(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1
输入以后,服务器端就会崩溃。http://www.xxxx.com/xxx.action这个就不说是什么了,你这都不知道就不要看了。
【说明: url中的\u0023实际上是代表#号,%20实际上是代表空格,\u003实际上是代表等于】
2.产生漏洞的原因如下:
上面的地址被浏览器会翻译成:
?(‘#_memberAccess[‘allowStaticMethodAccess’]’)(meh)=true&(aaa)((‘#context[‘xwork.MethodAccessor.denyMethodExecution’]=#foo’)(#foo=new%20java.lang.Boolean(“false”)))&(asdf)((‘#rt.exit(1)’)(#rt=@java.lang.Runtime@getRuntime()))=1
当提交这个url后,经过了一个拦截器名为ParameterInterceptor。其中有这么一行源代码:
try{
newStack.setValue(name,value);
}
利用stack.setValue(“name”,”aaa”);就把name属性的值改为aaa字符串。在上述的url中,有两个至关重要的值:
在map栈中:下图:
_memberAccess是OgnlContext中的一个属性,这是一个权限类SecurityMemberAccess,该权限类中有一个方法allowStaticMethodAccess:是否允许访问静态方法。通过上面的url,把该属性的值设置为了true(默认值为false),
context[‘xwork.MethodAccessor.denyMethodExecution’]这个值为false,Ognl才能够执行自定义的变量,在map栈中的其中一个值,这个是一个boolean值,设置为true,ognl表达式就能够调用静态的方法
(asdf)((‘#rt.exit(1)’)(#rt=@java.lang.Runtime@getRuntime()))=1则是一个shellcoade,ognl表达式执行静态方法,这样就调用java中的命令了。当执行(asdf)((‘\u0023rt.exit(1)’)(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1这个代码的时候相当于java.lang.Runtime.getRuntime().exit(1);,执行完毕后,使得我们的整个程序停掉了。
3.为什么会产生这样的漏洞呢?
struts2提供了存储数据valueStack
struts2提供了访问数据的ognl表达式
ognl表达式不但可以访问到valueStack中的值,而且还可以改变valueStack中的值调用valueStack.setValue
ognl表达式还能执行静态方法,并且嵌入一些shellcoade代码。
4.如果我们去做,怎么去解决?
做一个自定义的拦截器,用拦截器过滤url,含有\u0023这个字符串,就不让它执行以后的相应的操作。自定义的拦截器一定要在ParameterInterceptor执行之前执行就哦了。
@Override
public String intercept(ActionInvocation invocation) throws Exception(){
String s = ServletActionContext.getRequest().getQueryString();
if(s.contains(“\\u0023”)){
return “error”;
}else{
return invocation.invole();
}
}
在struts的配置文件下配置一下就OK了,像这样就行:
有不懂的地方,可以给我留言。
相关阅读:
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161718.html原文链接:https://javaforall.cn
相关文章
- 和 Password:Linux管理:ID与Password设置指南(linux的Id)
- Linux上的Python之旅(linux自带python)
- Linux 中如何改变文件名称的方法(linux改文件名的命令)
- Linux实现毫秒级延时处理(linux延时毫秒)
- Linux图形化监控:最全面的机器性能分析(linux图形化监控)
- Linux平台下数据包分析技术研究(linux数据包分析)
- Linux系统安全性检测分析(linux安全检测)
- 系统开源世界,探索Linux的分支系统(linux的分支)
- 探索新世界:免费的Linux操作系统(免费linux操作系统)
- 构建新局面:安卓基于Linux系统(安卓基于linux)
- 禁用Linux防火墙: 安全体系的重要一步(关闭linux的防火墙)
- 管理Linux分支管理:提升开发效率的利器(linux的分支)
- Linux反汇编分析:开源软件支持(linux反汇编软件)
- 轻松搞定:Linux文件修复全攻略(linux文件修复)
- 查看Linux服务器空间:必要的技术分析(查看linux服务器空间)
- Linux文件破解技术:突破难关的秘诀(linux文件破解)
- 安装Linux: 快速搭建GPT分区(gpt分区安装linux)
- 地址Linux如何查看浮动IP地址(linux查看浮动ip)
- Linux 一键查找命令:轻松解决文件搜索难题(linux查找命令)
- 深入分析Linux Top指令,优化系统性能的方法与技巧(分析linux top)
- Linux注入代码安全风险分析(linux 注入代码)
- Linux常用文件系统:实用技巧、深层分析(常用的linux文件系统)
- 4G网络驱动在Linux上崭露头角(4g驱动linux驱动)
- Linux 下使用 mkdir 命令创建目录(linux 创建目录命令)
- Linux用户组管理:做最好的自己(linux 用户和组)