Struts2 备忘

今天帮两个同事各看了一个问题,有点意思。

Struts2 JSON 序列化与 Action get 方法

场景:同事跑来说他的ajax请求总是进入ajax的错误处理的回调函数,他需要用ajax提交请求到action,然后处理返回结果。

异常现象:这个同事也没什么经验,他告诉我的是ajax请求总是进入ajax的错误处理的回调函数,我在chrome开发工具那里一看,http响应是500,肯定进入错误处理的回调函数了,所以问题应该是在服务端。

分析与解决:在eclipse里debug跟踪发现action执行是ok的,返回的结果名也是 SUCCESS,配置也没问题,但控制返回给Struts2框架后却抛出一堆异常,异常信息跟请求完全无关,从异常栈来看,抛出异常的方法也没有在请求方法里调用,虽然它们都在同一个action里,异常栈的方法基本都是JSON序列化有关的方法的,也就是说问题应该是出在Struts2框架在把action结果序列化为JSON返回给浏览器之前。一开始也看不出具体问题,后来同事在网上搜索看到说是 setter/getter 导致的,然后他的那个被抛出异常的方法也是以get开头命名的,坑就这么形成了:Struts2在序列化action的结果时,会把action的所有公开的getter方法的结果序列化到json里,那个方法以get开头,自然也就被调用了,然后异常就抛出来了。

这个问题自己写的时候一般都会注意避开,但不小心的人还是会踩上的。

ajax 提交 JS 数组对象与 Struts2 参数解析

场景:在页面输入一组用户信息,然后用jQuery的ajax提交给后台的Struts2 action,在JS里,这组信息是用数组来存储,数组的每个元素是一个JSON对象。

异常现象:在tomcat的控制台输出的异常信息是这样的:No result defined for action package4.business.action and result input

分析与解决:一开始我也以为是Java代码的问题,毕竟异常是在控制台里抛出的,但代码也看不出什么问题。这个请求的url在浏览器地址栏直接打开是没有问题的,所以我想,是不是跟请求方法有关,改为 GET 后还是出错。再想,地址栏打开是不带数据的,so在ajax里也不带数据,结果也没异常了,所以可以确定是请求参数的问题了。在chrome的开发工具那里看到,数组参数都被序列化为 persons[0][name]=name 的形式发出去了,这在js里是没问题的,访问对象的属性可以用句点(json.prop),也可以用方括号(json[prop]),参数被提交到Struts2时,它进行参数解析并映射到Java对象,它的规则却与这个有冲突了,对于句点,Struts2也是解析为对象的属性,但方括号却是被当作数组的,所以解析肯定失败,会抛出异常,捕获到参数解析异常后,请求会被路由到命名为 input 的结果那里,但我们这个项目都没配置 input,所以抛出的异常是找不到 result input


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

struts2 漏洞 和 缓存攻击

本文主要讲我对漏洞的探索和探索过程中发现的一个可以进行缓存攻击的坑。

问题

struts2 的漏洞在网上已经够热闹了,各个技术站点都是头条显示,微博上也有大佬转发。

这个漏洞的危害行在于允许执行远程命令,直接攻击服务器,危害无穷;根源在于struts2框架把用户输入的数据当作命令执行了,这也是一切注入估计的根源。

今天旁边的同事soul在调试官方给出的可攻击的demo,想看看到底是怎么攻击;我好奇的是既然攻击可以远程启动一个子进程的话,那么那些输入的java代码应该会被编译,然后再执行,如果是这样的话,这框架不会是对每个输入都进行动态编译吧,这会很影响性能的,所以我想看看struts2到底是怎么处理的,就看我同事调试。
继续阅读