首先看了 http://bobao.360.cn/learning/detail/3574.html 这篇文章,文章把整体的思路都分析得很清楚了,我补充一下自己的调试细节。
在处理 multipart 的时候发生了异常,进入 org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest 中的 parse方法的异常处理分支
然后就进入了 org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.buildErrorMessage(Throwable, Object[]),从而调用了LocalizedTextUtil.findText。此时我们看 payload 已经被传入 e 变量中。
处理错误信息最终调用到了com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage(String,Locale, ValueStack, Object[], String)。
继续跟进,发现其最终使用com.opensymphony.xwork2.util.OgnlTextParser.evaluate(char[],String, ParsedValueEvaluator, int)来处理错误信息,导致了ognl命令执行。
备注:
这个漏洞触发可以不需要有上传功能,但是一定要有commons-fileupload-x.x.x.jar包
参考资料:
https://cwiki.apache.org/confluence/display/WW/S2-045
http://bobao.360.cn/learning/detail/3574.html