
/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/RepopulateConversionErrorFieldValidatorSupport.java:181行 stack.setExprOverrides(fakeParams);
/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/RepopulateConversionErrorFieldValidatorSupport.java:181行stack.setExprOverrides(fakeParams);
这个函数放入了一个MAP,map会被后面的代码,作为OGNL执行。
MAP的内容来自代码:
fakeParams.put(fullFieldName, "'" + tmpValue[0] + "'");
fakeParams.put(fullFieldName, "'" + tmpValue[0] + "'");
很明显看到,这里是用单引号拼接的,可以注入。
tmpValue[0]的值,来自
Object value = conversionErrors.get(fullFieldName);
if (object.prototype.tostring.apply(value) === '[object array]') {length = value.length。i added a currentuser property that uses the appusermanager class to retrieve an appuser instance to represent the current user. i pass the appuser object as the view model object in the get version of the userprops action method, and the post method uses it to update the value of the new city property. listing 15-3 shows the userprops.cshtml view, which displays the city property value and contains a form to change it.。as of javascript 1.1 (and the ecma-262 standard), number( ) , boolean( ), string( ), and object( ) may be called as functions as well as being invoked as constructors. when invoked in this way, these functions attempt to convert their arguments to the appropriate type. for example, you could convert any value x to a string with string(x) and convert any value y to an object with object(y).。
也就是发生了类型转换错误后,放入错误字段,和错误字段的值。
在字段bookdao上注解了@resource,用于自动装配,resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。在空指针上调用这个函数没有什么影响,同时可以准备语句的生命周期的任一时刻调用这个函数:在语句被执行前,一次或多次调用sqlite_reset之后,或者在sqlite3_step任何调用之后不管语句是否完成执行6. sqlite3_close这个过程关闭前面使用sqlite3_open打开的连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放二.使用举例。这些语句当中struts2中ognl表达式 各种合集,有些是函数的调用,遇到函数的调用,进入到函数,再从函数的第一条语句执行到最后一条语句,然后跳出函数,再从刚才主函数中那条函数的下一条语句开始执行。
什么时候会执行findvalue,并且刚好是find错误字段的value呢?
还得再普及一个知识,潜规则太多了,作者研究时,也发生了很多错误,更新了N遍文章。在条件好公司就是好,当研究成果分析发生错误时,立刻会有各种各样的实际场景,供你实时分析,达到纠正错误的目的。嗯。阿里巴巴招聘安全工程师,果断向我邮箱投简历把,你懂得。
Struts把request的getAttribute方法再次重写,在jsp层调用的request,其实是个struts包装过的,并非原本apache提供的request类。在这个方法里:
attribute = stack.findValue(s);
attribute = stack.findValue(s);
s是方法传入的参数。也就是说,真正决定执行注入OGNL代码的struts2中ognl表达式 各种合集,是这个方法。
这个方法有多么恐怖啊,我们举几个调用此方法的地方。
1、 jsp中得request.getAttribute(“kxlzx”);
这个感觉还好,调用不多是吧?最起码不如request. getParameter多。虽然大家有用到,但是不多。
2、 struts标签库几乎所有标签,在获取标签value时,都会调用这个方法。
这次够恐怖了,所有标签都会用到value的时候,否则标签意义何在。这个属于框架自动调用,不需要开发人员参与。开发人员只需要使用struts标签库就好。
3、 事实上几乎所有标签库,展现层,几乎都会用这个方法从action中拿用户提交的变量值。

粗略统计一下,包括velocity、freemarker等。
漏洞利用的条件
公告上其实给出了一个经典场景,从漏洞描述上看,这些条件,缺一不可。
1、 使用了struts验证框架做验证。
2、 针对可利用的字段,验证框架做了类型转换验证。
3、 页面使用了struts标签库。
4、 错误页面刚好会显示可利用字段的值。
非常苛刻的利用条件,其实后来证明这是个误区,作者当初在这里被骗了很久。回到刚刚拿到公告时,简要的解析一下条件的苛刻性。这么解析虽然意义不大,但是不可否认,这是开发人员会存在侥幸心理的起始。
使用了struts验证框架做验证
简要说下,不使用struts验证框架的理由。
1) 时代在发展,已经到了web2.0,新时代,大家都知道使用ajax了,输入时候,就已经去验证。
2) 即使是老的时代,很多开发为了偷懒,会使用js验证,而不适用服务端验证,这就避免了还要写服务端代码。当然,有经验的开发,会建议开发使用服务端验证框架,因为这样才“安全”。
3) 验证框架使用起来,其实并不比专门写段代码做验证简单。除非是出于良好的架构考虑,才会要求大家一定要用。
以经验来说,作者做过一段时间的开发,验证框架这个烂东西,能不用,基本上作者不用。
针对可利用的字段,验证框架做了类型转换验证
这个必须是一个int类型,或date类型等等需要类型转换的类型。像email验证、string长度验证,正则表达式验证等等,都不在此列。难以找到一个明明应该用下拉框解决的,非要用户输入数字。很不友好。顺便普及一下,所谓的类型转换错误,就是这个字段本身是一个int类型或date等类型,但是用户输入了一段字母,所以错误了。
页面使用了struts标签库
这也是一个特定条件,众所周知,struts和webwork的标签库,是所有的标签库中,性能最让人抓狂的几个之一。有经验的架构师,通常会用velocity等来替代,实在不行,也会用el表达式加jsp搞定。所以并不是每个页面,都会启用struts标签库。
错误页面刚好会显示可利用字段的值
用户输入错误,很多时候,都是一个错误页面,不一定就要显示出原来用户输入了什么。
个人经验来看,最最难以接受的,就是得找一个让用户输入数字的文本框。是不是很失望呢,这个漏洞,并不像原来的那个,指哪打哪。
利用条件的减免
为了扩大漏洞影响,必须从这四个地方下手,让漏洞出现的几率高一点,容易利用一点。
其他的几点,可能真的不好撬动,但是这“针对可利用的字段,验证框架做了类型转换验证”,经过研究,发现没有想象中的难。有很多开发总抱着侥幸心理:“是不是我的项目不使用验证框架,就没事了”。事实上框架提供的便利,struts框架会自动对所有字段,执行类型转换验证,并不是非要开发人员指定某个action做验证。换句话说,这个条件完全可以消失了。作者写在这里,是因为很都会有这个误区,而作者当时也走进了这个误区,所以专门写一下。

也就是说,其实利用条件是:
1、 发生类型转换错误
2、 返回页面会显示错误字段的内容
如果成功 则显示另一对话框,如果错误就相应的字段中将错误次数减1。如果在里tid为int类型,如果cbadremark绑定了一个字符型(datapropertyname所对应字段为nvarch()型)的字段就会出现以上错误.。拖入列标签区的字段将你的数据项以列显示,普遍用于显示随时间变化的趋势。
<s:text name="kxlzx" /> //输出一段文字 <s:property name="kxlzx" /> //输出一段文字 <s:textfield name="kxlzx" /> //一个input输入框 <s:hidden name="kxlzx" /> //一个隐藏域
<s:text name="kxlzx" />//输出一段文字<s:property name="kxlzx" />//输出一段文字<s:textfield name="kxlzx" />//一个input输入框<s:hidden name="kxlzx" />//一个隐藏域
以上这些标签,在项目里,不可能不被使用。
换个场景,velocity:
$kxlzx //输出一段文字
$kxlzx//输出一段文字
别说你不用这个输出,那你干脆不要用velocity好了。
还有其他场景,不再一一列举,最终得出下图,大家可以对照上文,重新梳理一下流程。
是一个.net工具,30多万的.net开发人员用它来通过反编译和观察内在内容,了解应用程序接口(api)、组件、框架以及您所使用的所有关键代码是如何工作的,此外,还可以通过你自身的代码、第三方组件和你所使用的任何编译的.net代码跟踪漏洞。red gate .net reflector(.net反编译工具)是一个.net工具,30多万的.net开发人员用它来通过反编译和观察内在内容,了解应用程序接口(api)、组件、框架以及您所使用的所有关键代码是如何工作的,此外,还可以通过你自身的代码、第三方组件和你所使用的任何编译的.net代码跟踪漏洞。截至发稿前,360安全中心已经紧急启动漏洞预警机制,目前360安全卫士"网盾"模块能够成功防御网上公开的漏洞攻击代码。
漏洞特征和批量抓漏洞
这是大家最关心的地方,有很多很多的struts,怎样能够确定,这个系统有漏洞呢。
我们看看showcase的页面
这个地方,是个integer validation,我们输入poc,有经验的能看出来,作者的EXP是经过处理的。这种技巧,不打算多说,后文会给出指引。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-114618-1.html
如果是1937年你肯定是汉奸
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊