精华内容
下载资源
问答
  • SRCMS 是一款安全应急响应与缺陷管理软件,致力于为大、中、小企业和组织提供“最敏捷、安全和美观的安全应急响应中心的建站解决方案,帮助企业建立属于自己的安全应急响应中心和体系”。有了SRCMS,您就可以像使用...
  • 代码安全缺陷分析

    千次阅读 2018-01-03 09:28:37
    安全缺陷种类 本次测试涵盖各类常见安全缺陷。根据缺陷形成的原因、被利用的可能性、造成的危害程度和解决的难度等因素进行综合考虑,可以将常见的安全缺陷分为八类: 1、输入验证与表示(Input Validation ...

    安全缺陷种类

    本次测试涵盖各类常见安全缺陷。根据缺陷形成的原因、被利用的可能性、造成的危害程度和解决的难度等因素进行综合考虑,可以将常见的安全缺陷分为八类:

    1、输入验证与表示(Input Validation and Representation)

    输入验证与表示问题通常是由特殊字符、编码和数字表示所引起的,这类问题的发生是由于对输入的信任所造成的。这些问题包括:缓冲区溢出、跨站脚本、SQL注入、命令注入等。

    2、API误用(API Abuse)

    API是调用者与被调用者之间的一个约定,大多数的API误用是由于调用者没有理解约定的目的所造成的。当使用API不当时,也会引发安全问题。

    3、安全特性(Security Features)

    该类别主要包含认证、访问控制、机密性、密码使用和特权管理等方面的缺陷。

    4、时间和状态(Time and State)

    分布式计算与时间和状态有关。线程和进程之间的交互及执行任务的时间顺序往往由共享的状态决定,如信号量、变量、文件系统等。与分布式计算相关的缺陷包括竞态条件、阻塞误用等。

    5、错误和异常处理缺陷(Errors)

    这类缺陷与错误和异常处理有关,最常见的一种缺陷是没有恰当的处理错误(或者没有处理错误)从而导致程序运行意外终止,另一种缺陷是产生的错误给潜在的攻击者提供了过多信息。

    6、代码质量问题(Code Quality)

    低劣的代码质量会导致不可预测的行为。对于攻击者而言,低劣的代码使他们可以以意想不到的方式威胁系统。常见的该类别缺陷包括死代码、空指针解引用、资源泄漏等。

    7、封装和隐藏缺陷(Encapsulation)

    合理的封装意味着区分校验过和未经检验的数据,区分不同用户的数据,或区分用户能看到和不能看到的数据等。常见的缺陷包括隐藏域、信息泄漏、跨站请求伪造等。

    8、代码运行环境的缺陷(Environment)

    该类缺陷是源代码之外的问题,例如运行环境配置问题、敏感信息管理问题等,它们对产品的安全仍然是至关重要的。

    前七类缺陷与源代码中的安全缺陷相关,它们可以成为恶意攻击的目标,一旦被利用会造成信息泄露、权限提升、命令执行等严重后果。最后一类缺陷描述实际代码之外的安全问题,它们容易造成软件的运行异常、数据丢失等严重问题。

    安全缺陷级别

    我们将源代码的安全问题分为三种级别:高危(High)、中等(Medium)和低(Low)。衡量级别的标准包括两个维度,置信程度(confidence)和严重程度(severity)。置信程度是指发现的问题是否准确的可能性,比如将每个strcpy函数调用都标记成缓冲区溢出缺陷的可信程度很低。严重程度是指假设测试技术真实可信的情况下检出问题的严重性,比如缓冲区溢出通常是比变量未初始化更严重的安全问题。将这两个因素综合起来可以准确的为安全问题划分级别,如图1所示。

    图1 缺陷级别与严重程度、置信程度的关系

    展开全文
  • OWASP WebGoat---安全测试学习笔记(十七)---会话管理缺陷

    会话管理缺陷(Session  Management  Flaws)




    主题:

    1.会话劫持

    概念:

            因为HTTP是没有状态的,所以就有了会话管理的概念。服务器通过会话管理,来记忆用户的状态。在用户访问WEB站点的过程中,会话管理对每个用户

    都有一个唯一的标识(SessionID),而每当新用户访问网站时,服务器上也会有一个相应的标号来记录。而且该用户所有后续的页面请求都会包含此标号,

    这样WEB应用程序就能识别此用户,并记录其状态。服务器端的会话标识可能是通过Cookie、URL(URL重写)、隐藏域的方式保存在浏览器中。通常情况,

    会话标识(SessionID)是加密保存在Cookie中的,随着HTTP请求头发送,并在每次加载页面时传递给服务器。

            攻击者的目的是通过窃取并使用合法用户的会话标识(SessionID)伪装成合法用户,即会话劫持



    方法:

            会话劫持最常用的方法就是窃取用户会话标识。会话劫持是在合法用户的会话ID被使用之后对其进行占用。例如:对会话的处理不当会使得攻击者可能猜

    到相邻的会话标识。 跨站脚本攻击(XSS),网络嗅探(Net Sniffer),本地木马等。

            另一种对会话管理进行攻击的方式叫做“会话定位(Session Fixation)”。原理是合法用户使用了攻击者为其准备好的会话ID进行身份认证,如此攻击者就

    可以随意通过此会话ID劫持用户会话。而解决Session Fixation的办法是在登录完成后,重写SessionID。这样,攻击者准备好的会话ID对于已经完成身份认证

    的用户就无效了。因为对于正常用户来说,已经是另一个会话(SessionID不同)了。



    防御:

        对会话标识号的分配(不能让攻击者轻易猜到绘画标识)

        加强对会话标识号的保护

        设置合适的会话标识有效时间






    2.认证Cookie欺骗

           如果验证cookie正确,一些应用程序会允许一个用户自动登录到他们的网站。如果能够获得生成cookie的算法,有时cookie的值是可以猜到的。

    有时候cookie可能是通过跨站攻击截获的。

            课程目标:了解身份验证cookie的方式,并指导您学习突破这种身份验证cookie的方法。







    3.会话定位(Session Fixation)

            服务器通过每个用户唯一的SessionID来确认其合法性。若用户已登录,并且授权他不必重新验证授权时,当他重新登录应用系统时,他的SessionID依然

    是被认为合法的。在一些程序中,可能会在GET请求中传递SessionID,这就是攻击的起点。一个攻击者可以用一个选定的SessionID给受害人发送一个超链接。

            例如有一个准备好的邮件,看起来像是一个从应用程序管理员发来的官方邮件。若受害者点击了这个链接,并且该受害者以攻击者指定的ID登录了系统,

    那么攻击者可以不经授权直接使用与受害者相同的ID访问该页面。









    参考:

            《WEB安全测试》、《白帽子讲Web安全》、《WebGoat v2.2技术文档》、《OWASP Testing Guide v3.0》




    注:





    展开全文
  • 本次测试涵盖各类常见安全缺陷。根据缺陷形成的原因、被利用的可能性、造成的危害程度和解决的难度等因素进行综合考虑,可以将常见的安全缺陷分为八类:

    图片

     

    本次测试涵盖各类常见安全缺陷。根据缺陷形成的原因、被利用的可能性、造成的危害程度和解决的难度等因素进行综合考虑,可以将常见的安全缺陷分为八类:

     

    1输入验证与表示(Input Validation and Representation)

     

    输入验证与表示问题通常是由特殊字符、编码和数字表示所引起的,这类问题的发生是由于对输入的信任所造

    成的。这些问题包括:缓冲区溢出、跨站脚本、SQL注入、命令注入等。

     

    2API误用(API Abuse)

     

    API是调用者与被调用者之间的一个约定,大多数的API误用是由于调用者没有理解约定的目的所造成的。当使用API不当时,也会引发安全问题。

     

    3安全特性(Security Features)

     

    该类别主要包含认证、访问控制、机密性、密码使用和特权管理等方面的缺陷。

     

    4时间和状态(Time and State)

     

    分布式计算与时间和状态有关。线程和进程之间的交互及执行任务的时间顺序往往由共享的状态决定,如信号量、变量、文件系统等。与分布式计算相关的缺陷包括竞态条件、阻塞误用等。

     

    5错误和异常处理缺陷(Errors)

     

    这类缺陷与错误和异常处理有关,最常见的一种缺陷是没有恰当的处理错误(或者没有处理错误)从而导致程序运行意外终止,另一种缺陷是产生的错误给潜在的攻击者提供了过多信息。

     

    6代码质量问题(Code Quality)

     

    低劣的代码质量会导致不可预测的行为。对于攻击者而言,低劣的代码使他们可以以意想不到的方式威胁系统。常见的该类别缺陷包括死代码、空指针解引用、资源泄漏等。

     

    7封装和隐藏缺陷(Encapsulation)

     

    合理的封装意味着区分校验过和未经检验的数据,区分不同用户的数据,或区分用户能看到和不能看到的数据等。常见的缺陷包括隐藏域、信息泄漏、跨站请求伪造等。

     

    8代码运行环境的缺陷(Environment)

     

    该类缺陷是源代码之外的问题,例如运行环境配置问题、敏感信息管理问题等,它们对产品的安全仍然是至关重要的。前七类缺陷与源代码中的安全缺陷相关,它们可以成为恶意攻击的目标,一旦被利用会造成信息泄露、权限提升、命令执行等严重后果。最后一类缺陷描述实际代码之外的安全问题,它们容易造成软件的运行异常、数据丢失等严重问题。

    写在最后
    如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,可以关注微信公众号:【程序员二黑】,获取软件测试工程师大厂面试资料!我的学习交流群: 785128166 群里有技术大牛一起交流分享~

    如果文章对你有感兴趣,麻烦伸出发财小手点个赞,感谢您的支持,你的点赞是我持续更新的动力。

    展开全文
  • 全套信息安全管理体系文件,包括: 安全服务外包管理制度 安全管理机构 安全管理制度 安全管理组织机构及岗位职责 安全检查及审计制度 办公计算机操作及联网管理规定 办公自动化系统管理标准 操作系统安全配置管理...
  • Struts2框架安全缺陷

    千次阅读 2018-07-05 15:32:48
    转自于:https://blog.csdn.net/zzjjiandan/article/details/9382453本文介绍了java开发流行框架struts2以及webwork的一些安全缺陷,并举例说明框架本身以及开发人员使用框架时,所产生的种种安全问题,以及作者挖掘...

    转自于:https://blog.csdn.net/zzjjiandan/article/details/9382453

    本文介绍了java开发流行框架struts2以及webwork的一些安全缺陷,并举例说明框架本身以及开发人员使用框架时,所产生的种种安全问题,以及作者挖掘框架安全漏洞的一些心得体会。

    推荐以下人群阅读

    了解java开发
    了解框架开发
    了解web application安全
    “网络安全爱好者”

    正文

    当前java开发网站,通常不会是纯JSP的,大都使用了java framework。

    有了这些framework,让开发人员更加快速的开发出代码,也让代码非常具有可扩展性,那些分层架构的思想,更是深入人心。这些也大大影响了安全代码审核,曾提出“分层审核代码”的思想,比如在DAO层专门检查sql注入,在view层检查xss等。这些框架都有自己的层级,本次文章主要讲的是struts这个框架的相关安全问题,也会有小部分涉及到struts后面的DAO层。

    而struts这个框架更新占有市场份额极大的一个框架,它在各个层级中,位于如图所示位置:

    可以看到struts在web应用中,负责处理接收用户数据,调用业务处理,以及展示数据的工作。所以本文把struts的功能分为controller层和view层,controller层来完成接收用户数据,分发用户请求,而view专门用于展示数据。

    一个单独的struts,是不合逻辑的,因为架构师通常喜欢多种框架集合,让它们各自负责某一层的处理。研究一个框架的安全问题,不能仅仅站在框架的角度,还应该充分考虑到开发人员是如何使用这些框架的,他们最喜欢写什么样的代码,这样才能还原一个正常的、完整的web应用场景。

    从搜索结果看,互联网中,绝大多数教程推荐struts+hibernate+spring这样的黄金组合,那么,我假设有一个应用使用了这个组合,以struts为重点,站在攻击者的角度,层层分析struts的设计缺陷。

    Struts2开发回顾与简单学习

    为了让大家回顾或者学习一下struts2,我们一起来建立一个action、jsp页面,做一个接收用户输入,之后处理一下,再展示出来给用户的过程,精通struts2的同学可以跳过此步。

    -------------------------------------struts回顾start
    首先建立action,叫做AaaaAction:

    1. public class AaaaAction extends ActionSupport{
    2. private String name;
    3. public String getName() {
    4. return name;
    5. }
    6. public void setName(String name) {
    7. this.name = name;
    8. }
    9. public String execute(){
    10. System.out.println( "exe");
    11. return SUCCESS;
    12. }
    13. public String bbb(){
    14. System.out.println( "bbbbb");
    15. return SUCCESS;
    16. }
    17. }

    请注意execute这个方法,让用户输入action的地址后,默认会访问这个方法。

    之后配置struts.xml文件

    1. <action name="aaaaaaa">
    2. <result name="success">user/aaa.jsp </result>
    3. </action>

    配置这个文件后,当用户输入

    http://www.inbreak.net/app/aaaaaaa.action

    的时候,struts会负责让AaaaAction中的execute方法处理用户请求。

    处理之后,该方法返回“return SUCCESS;”,struts又负责找到result的name是seccuess所指向的jsp页面。
    把该页面解析后,返回给用户。

    而用户看到的就是aaa.jsp页面的html代码。

    struts2继承了webwork的所有优点,其实等于是webwork的升级,如果开发人员想让用户直接访问action中的某方法,而不是访问默认的execute方法,只要定义一个方法叫做bbb,并且是public的,用户就可以直接输入

    http://www.inbreak.net/app/aaaaaaa!bbb.action

    直接访问了bbb方法。

    那request中的参数如果接收呢?struts2中,这个过程被包装了起来,使用非常方便,只要在action中定义一个属性,叫做public String name;。然后加入getName和setName方法,就可以像正常使用属性一样,接收到用户传递过来的变量。无论是get请求还是post请求,都可以使用这种方式接收用户输入。

    整个过程就如此简单,现在大家对流程有了了解,我们就开始讨论正文,如果还是想了解更多,请自行google。

    ----------------------------------struts回顾end

    Struts2安全缺陷

    可以看到struts2在数据流向方面,有两个重点,一个是进入(in),一个是输出(out)。而我在做漏洞挖掘的思路,也是跟着这个数据的流程,开始分析的,下面我们就开始让数据进入。

    Action属性默认值可以被覆盖缺陷:

    在日常的java项目中,我们经常会遇到保存一个新的对象(比如注册一个用户),然后给这个对象赋予一些用户提交上来的属性值,在这里,只需要定义一个对象类:

    1. public class User {
    2. private Long id= 0l;
    3. private String name;
    4. private String pass;
    5. private Integer type= 1;
    6. 。。。下面的 getset方法代码略
    7. }

    定义后,在action中,添加一个属性

    User reguser;

    用户注册的页面代码如下:

    1. <form XXXXXXX>
    2. <input name="reguser.name">

    当用户提交这个form到action中后,struts2会负责自动映射reguser.name的值到reguser的相关属性(name)中,所以在execute这个方法中,就可以使用reguser.getName()拿到用户提交的reguser.name的值。所以我们下面的代码就很简单了:

    1. public String execute(){
    2. add( user);

    add方法,更简单了,因为我们项目中集成了hibernate,这个框架自动映射user类中的各个属性,自动组成insert语句。我们只要在add中调用session.save(user);就可以保存用户到数据库中。

    前文提到那么多“简单”两个字,难道这些过程都是安全的而他给我们仅仅带来了方便么?

    struts2只负责映射所有对象,他提供了form验证,也只能验证form中属性值的内容,比如email格式等,并不能约束用户提交其他属性上来,于是这就变成了十分危险的功能。

    当User中有个属性type,代表User是否管理员时(1为普通用户,2为管理员),麻烦来了,攻击者在原来的注册表单中,新加入一个input,叫做

    <input name="reguser.type">

    然后输入值是2,把这个值一起交给action。在这个流程中,这个值,当然也会被自动带到数据库中,向下处理的逻辑中,这个用户,就已经变成管理员了。

    当你看到了一个struts2或者webwork的应用,可以尝试使用属性攻击,修改当前表单,里面有所有你猜测到的属性,一并提交上来,就可能会影响整个逻辑,达到攻击目的。文中仅仅是一个例子,事实上,在数据传递的过程中,可以任意覆盖数据的默认值,本来就是一个危险的缺陷,而struts2和webwork这两个框架仅仅看到了它带来的好处,忽略了这方面基于安全性的考虑,仅仅关注了用户提交数据的正确性。对比在没有struts2这个功能的时候,我们却需要在action中一个一个的把需要的变量,从用户提交的request中解出来,一个一个处理,不可能出现这种安全问题。现在它包装了这个过程,自以为很方面,却出了严重问题。

    Action中的方法被暴力猜解缺陷

    前文提到,有一种方法可以让用户访问action时,不访问默认的execute方法,而是直接访问其他action中的方法,条件是在action中,写一个public的方法。开发人员如果需要做一个登陆后,展示所有用户列表的功能,而他的一个“解耦合”的开发习惯,将在这里导致安全缺陷。

    定义一个如下的action

    1. public class Userlogin extends ActionSupport{
    2. private String uname= "";
    3. private String upwd;
    4. private List list;
    5. //getter and setter 方法略
    6. public String login(){
    7. if(uname!= null&&upwd!= null&&uname.equals( "kxlzx")&&upwd.equals( "pass"))
    8. { //if login success
    9. return list();
    10. }
    11. return false;
    12. }
    13. public String list(){
    14. list.add( "kxlzx"); list.add( "kxlzx1"); list.add( "kxlzx2"); list.add( "kxlzx3");
    15. return "list";
    16. }
    17. }

    Userlogin中,因为list这个功能(显示所有用户列表),其实是一个通用的功能,很容易被其他地方调用,所以开发人员把它单独写成了一个方法。

    当用户登陆的时候,打开

    http://www.inbreak.net/app/userlogin!login.action

    来到了用户的登陆页面,可以看到,只有用户输入正确的用户名和密码,才能最终调用list()方法,显示结果。

    但是struts2把所有public的方法都暴露了出去,导致现在用户输入了

    http://www.inbreak.net/app/userlogin!list.action

    用户访问这个链接后,struts2调用list方法,然后返回结果给用户,所以没有登陆,就显示了所有用户信息,
    直接绕过了login中的登陆验证。

    在没有struts2的时候,我们要在servlet的doget或者dopost方法中,写if判断等代码,才能让用户调用其他servlet中的方法,现在看来其实这也是一种保护措施。而现在struts2为了方便开发,把所有的public方法统一映射了出去,导致开发把一个经常使用的功能,习惯写成一个public的方法,现在居然成了严重漏洞。

    struts2的action属性设计缺陷

    再回头看看我们在action中的属性定义,你会发现,现在他们都成了漏洞,因为struts2规定属性的get和set方法,都必须是public的。

    那么我们定义了

    1. private String name;
    2. public String getName() {
    3. return name;
    4. }
    5. public void setName(String name) {
    6. this.name = name;
    7. }

    这段代码的时候,实际上,是写了两个public的方法。
    那这两个表面上没有任何实质含义的方法,会有什么安全隐患呢?
    这需要和前文联系起来,前文提到,我们在struts.xml文件中,定义如下:

    1. <action name="user">
    2. <result name="success">user/userlist.jsp </result>
    3. <result name="addUser">user/addUser.jsp </result>
    4. <result name="added">user/added.jsp </result>
    5. <result name="false">user/false.jsp </result>
    6. </action>

    这段代码含义是,UserAction中,任何一个方法执行后,如果返回的是success这个字符串, 就会把user/userlist.jsp返回给用户。

    如果返回是addUser,就会把user/addUser.jsp返回给用户。
    现在UserAction是管理用户的页面,在我们的系统中,有普通管理员和超级管理员,他们的区别是普通管理员可以查看用户,但是不能添加一个用户。

    所以,我们在UserAction中,写了

    1. public String addUser(){
    2. if( true){ //事实上这里是个超级管理员的判断,我偷懒了。
    3. return "false";
    4. }
    5. return "addUser";
    6. }

    这个方法的代码判断了不允许普通管理员访问,但是user/addUser.jsp这个jsp页面中并没有这个判断逻辑。
    因为开发认为只有返回addUser的时候,才会来到这个页面,而要返回addUser,则必须通过超级管理员的验证。

    那我们能让一个方法返回addUser么?当然可以!

    http://www.inbreak.net/app/user!getUsername.action?username=addUser

    这个链接,struts2会怎么处理呢?

    他会找struts.xml中,对应段路径user,于是找到了对应的处理Action(net.inbreak.UserAction),由于路径中有了“!getUsername”,于是就去找这个Action中的getUsername这个方法,很明显,这个方法其实是username这个属性的get方法,如果你要让Action接收用户提交的username,你就必须要定义这个方法。

    那这个方法会返回什么呢?会返回action的字段username的值!哈哈!username用户已经提交给action了,链接后面写着“?username=addUser”,struts2把这个值赋予了action中的username属性。那这里返回的当然就是“addUser”!

    一系列巧合后,导致现在给用户返回了user/addUser.jsp页面,这是一个添加用户的表单页面,并且用户没有去走验证是否为超级管理员这一步。

    现在用户看到了一个添加用户的页面,他有两种攻击思路:
    1,直接提交,如果处理用户提交的那个action没有再次判断用户身份,那就提交成功了。
    2,如果他判断了用户身份,我们还可以csrf他,因为我们知道了这个action的地址,和它需要的参数!

    由于struts2的action和jsp文件分离,导致开发人员往往会在action的方法中,执行权限判断,而jsp页面中并没有再次执行这个判断,他以为action判断就够了。而偏偏action的属性,给我们带来了一个可自定义返回result的方法,导致我们可以绕过action访问jsp页面。

    Struts2的那些result类型缺陷(redirect)

    刚才我们领教了struts2给我们带来那些属性的好处,现在我们再往后走一步,研究Action方法的返回结果。
    其实并不是只由String类型的返回结果,struts2还有其他类型的返回,比如“redirect”类型。

    1. <action name="test">
    2. <result name="false">user/false.jsp </result>
    3. <result name="redir" type="redirect">${redirecturl} </result>
    4. </action>

    这段代码,大家唯一可能看不懂的,就是type="redirect"了。

    这是一个url redirect的方式,struts2为了方便大家开发,把“自定义302跳转到其他url”这种方式给包装了起来。只要如上定义,我们就可以在action中写方法:

    1. public String redirect() {
    2. return "redir";
    3. }

    然后定义属性

    private String redirecturl;

    当用户打开

    http://www.inbreak.net/app/test!redirect.action?redirecturl=/a.jsp

    的时候,就会302跳转到

    http://www.inbreak.net/app/a.jsp

    这是很常见的url跳转应用,在struts2中,如上配置一下,就可以实现。

    相信明眼人都看出来了,很明显这里存在url跳转漏洞,如果用户输入了

    http://www.inbreak.net/app/test!redirect.action?redirecturl=http://www.ph4nt0m.org

    就会跳转到http://www.ph4nt0m.org这个钓鱼网站(-_-!)。那么如何防御呢?

    要防御url跳转到钓鱼网站,我们肯定需要一个白名单机制,或者根本就让他跳转到本站下。于是有了如下判断:

    1. public String redirect() {
    2. if(redirecturl.startsWith( "/"))
    3. {
    4. return "redir";
    5. }
    6. return "false";
    7. }

    可能你看出来了,仅仅判断"/"开头,其实是不能杜绝url跳转漏洞的,因为

    http://www.inbreak.net/app/test!redirect.action?redirecturl=//www.ph4nt0m.org

    一样会跳转。而在这里却足够了,因为struts2已经接管了这个过程,只要以“/”开头,统统先给你自动加上本地域名,抓包后,你会看到
    location: http://www.inbreak.net/app//www.ph4nt0m.org

    实际上是不会有问题的。

    struts2也认为这样判断不会有问题了,然而用户输入

    http://www.inbreak.net/app/test!getStr.action?str=redir&redirecturl=http://www.ph4nt0m.org

    其实前篇已经分析过了,这样就利用action中的str属性,绕过了必须以“/”开头的判断,直接跳转了。

    test里有个str属性,可自定义返回,这里自定义了“redir”,所以来到了

    <result name="redir" type="redirect">${redirecturl}</result>

    而redirecturl的值,也提交给了action,所以跳转了。

    Struts2的那些result类型缺陷(Ajax)

    在struts2中使用ajax,也是被struts2支持的,它提供了一种返回类型,叫做“stream”。在研究这个result的使用时,作者看到一本书,叫做《 Struts 2权威指南:基于WebWork核心的MVC开发 》。这本书非常出名,几乎所有的struts2使用者都推荐使用。

    http://book.csdn.net/bookfiles/479/index.html

    书上介绍ajax可以这么使用:

    配置struts.xml

    1. <action name="ajaxtest">
    2. <result type="stream">
    3. <param name="contentType">text/html </param>
    4. <param name="inputName">input </param>
    5. </result>
    6. </action>

    之后写TestajaxAction:

    1. public InputStream input;
    2. public String execute() throws Exception{
    3. input = new StringBufferInputStream( "aaaa<td><script>alert("kxlzx ")</script>aa");
    4. return SUCCESS;
    5. }

    其实大家都看出来我的意思了,返回了contentType为“text/html”的页面,内容为

    aaaa<td><script>alert('kxlzx')</script>aa

    结果浏览器解析的时候,出现了XSS漏洞。

    本来默认的contentType是text/plain,不需要配置,如果用户直接打开,只会看到一个Stream,不会解析其中的html和js。现在书上介绍说要写成这样,不知道作者是否知道这个教程对大家的影响,结果已经误导了大批的开发人员。

    事实上,这不是struts的问题,是struts“权威”教程的问题。权威的教程,一旦出现安全漏洞,往往会误导大批的开发人员,不知道大家在挖漏洞的时候,是否注意到了这点,特别是当官方的DEMO出现漏洞,那绝对是惊天地泣鬼神的悲剧。

    Struts2的那些result类型缺陷(自定的页面)

    有时候,开发人员为了方便,喜欢配置struts.xml如下:

    1. <action name="test">
    2. <result name="success">user/test.jsp </result>
    3. <result name="testpro">user/testproperty.jsp </result>
    4. <result name="redir" type="redirect">${redir} </result>
    5. <result name="testloadfilepath">${testloadfilepath} </result>
    6. <result name="false">user/redirfalse.jsp </result>
    7. <result name="input">user/input.jsp </result>
    8. </action>

    请注意,其中一条result,名称是”testloadfilepath”, ${testloadfilepath}的作用是自定义的jsp页面地址,接收session或request中传过来的这个变量的值。那么用户提交

    http://www.inbreak.net/app/test.action?testloadfilepath=user/test.jsp

    当然就会返回user/test.jsp页面,非常的灵活。虽然并不是所有的开发都会这么做,但是一旦出现这种情况,会产生什么问题呢?

    http://www.inbreak.net/app/test!getRedir.action?redir=testloadfilepath&testloadfilepath=WEB-INF/classes/hibernate.cfg.xml

    不知道大家看懂这段url的含义没有,先调用getRedir,可以自定义返回到testloadfilepath,而testloadfilepath已经指定了WEB-INF/classes/hibernate.cfg.xml。WEB-INF目录下,都是受web容器保护的东西,默认不允许直接request相对地址来访问。该目录里面有程序编译后的class文件(可以被直接反编译为java源码),有数据库配置文件等敏感文件,现在打开如上url,直接被下载了hibernate.cfg.xml,这里放着数据库用户名和密码。

    这样,攻击者就可以下载你的所有源代码,所有服务器上的文件。struts在提供给我们这种方式的时候,并没有任何官方说明这里有危险,这就是一个不定时炸弹。

    Struts2的taglib设计缺陷

    经过几个例子下来,不知道大家注意到没有,从用户输入走到这里,已经走到了输出这一步了。struts2的那些result的type,其实就是几种输出方式,有jsp、ajax、redirect,经过jsonplugin等插件配置,还可以支持其他输出方式。甚至支持一些标签库,比如freemarker等标签库。不过我们只谈struts2自带的标签库,在一个jsp页面的最上方,写上一段代码,就可以使用struts2提供的数据输出和页面数据操作的标签了。
    比以往我们在jsp输出“<%=name%>”要方便的多,下面给个例子:
    test.jsp代码

    1. <%@ taglib prefix="s" uri="/struts-tags" %>
    2. <s:property value="username"/>

    第一行是告诉struts这里要使用struts的标签库,第二行就是一个标签的使用,含义是输出username的值,username会从session、request、page等地方取,这里不关注取数据的次序。

    struts2的taglib设计缺陷(struts2.0不支持escapeJavaScript)

    说到输出,大家都能想到XSS漏洞,那么作为一个流行框架,struts2在这里做了什么控制呢?
    struts2.0对部分标签做了默认的htmlescape:

    刚才那个标签实际上效果等于

    <s:property value="username" escape="true"/>

    别以为做了htmlescape就够了,输出在javascript中的时候,还会出现xss漏洞。所以struts在2.1.6这个版本也支持了javascriptescape:

    struts2.1.6:

    <s:property value="pass" escape="true" escapeJavaScript="false"/>

    默认开启如上所示,当你要输出到js中的时候,可以使用escapeJavaScript进行转义。

    也就是说,一旦你确定这个struts是2.0的,只要开发人员把变量输出到js中,十有八九会出xss问题。

    struts2的taglib设计缺陷(没有富文本安全输出标签)

    而包括最高版本2.1.8在内,仍然没有支持富文本安全输出,这是一件悲剧的事情,如果用struts开发一个大众blog的应用,又支持富文本的文章,开发人员只能把htmlescape和jsescape都去掉,才能保证业务正常运行,所以导致了XSS漏洞。

    struts2的taglib设计缺陷(并不是所有输出标签都做了默认的htmlescape)

    有几个标签是不做htmlescape的,比如

    1. < s :a>
    2. < s :text>
    3. < s :url>

    这其实是一个严重陷阱,因为只要提到struts2,前辈们都会告诉你,放心使用,它默认做了htmlescape。那是什么原因导致一些标签没有做默认的escape呢?作者翻了下源码,也没有找出具体原因,不知道那些人是怎么想的。

    并且,经过简单的fuzz,发现在特定环境下,那些做了输出转义的标签也会出现问题。

    我们知道默认的htmlescape是不转义单引号的,所以,当struts标签库的源码中,出现一些标签属性的输出时,如果标签属性的周围使用的是单引号,而攻击者又能控制标签属性内容的时候,就会出现xss漏洞。如下:

    <input name="username" onclick='xss'>

    当这个xss的内容可以由攻击者控制,即使对xss的内容作了htmlescape,依然可以被攻击者bypass。

    基于这个原理,作者搜索了struts标签库源码,那些“XXX.ftl”文件中搜索“}'”符号,找到N多,测试其中一个如下:

    -------------
    <s:textfield >标签,在正常使用的时候,他会放到一个<s:form>标签内,最终输出html后,会变成一个输入框。
    它有个属性叫“tooltip”,如果这个标签为用户可控制,比如从数据库中读取用户输入,而这个标签所在的
    <s:form>开启了:

    <s:form tooltipConfig="#{'jsTooltipEnabled':'true'}">

    的时候,用户输入的tooltip的值,会出现以下情况:

    struts2.0 -->

    <span dojoType="tooltip" ... caption="kxlzx<script></script>">

    caption内容就是tooltip的值,从数据库查出

    struts2.1.6&struts2.1.8 -->

    <img onmouseover="domTT_activate(this, …'StrutsTTClassic');alert('xss');a('','styleClass’…" />

    onmouseover生成一个domTT_activate函数调用,参数中其中一个值,是tooltip的内容。这里被bypass了。

    ------------

    这些搜出的几个个地方实际上根本没有做任何escape,就直接输出了数据。下面那个即使做了默认的htmlescape,还是会出问题,除非它默认做了javascriptEscape。struts2默认有地方做javascriptEscape么?
    答案是“没有”。所以,它们全都能被XSS!

    struts2的这些escape,其实是一个很太监的安全方案,安全工程师最恨的就是这种方案,做了安全方案,还不做完全,留下一堆问题。

    struts2的HTTP Parameter Pollution处理缺陷

    webwork和struts2都有这个问题,当用户给web应用提交:

    http://www.inbreak.net/app/test!redirect.action?redir=kxlzx&redir=aaad61

    时,如果我们在action中定义了

    1. private String redir;
    2. public String getRedir() {
    3. return redir;
    4. }
    5. public void setRedir(String redir) {
    6. this.redir = redir;
    7. }

    Action就会取到redir的值为“kxlzx, aaad61”注意中间是有空格的。

    这种数据是由webwork(struts2)把两个参数合并而成的,但是如果我们request.getParameter("redir");拿到的值,却只是第一个(值为kxlzx)。

    我们知道struts2提倡使用拦截器做一些事情,他可以在action的execute方法执行之前和之后做一些操作。那就有一些开发,想当然的在这里防御一下url跳转、SQL注入、XSS等攻击。我们看看他们会怎么做:

    1. @Override
    2. public String intercept(ActionInvocation arg0) throws Exception {
    3. ……
    4. String name = request.getParameter( "name");
    5. if(name!= null&&name.indexOf( "'")> -1){
    6. System. out.println( "find sql injection");
    7. request.getSession().setAttribute( "msg", "find sql injection");
    8. return "falseuser";
    9. }
    10. String redir = request.getParameter( "redir");
    11. if(redir!= null&&!redir.equals( "http://www.b.com")){
    12. System. out.println( "find url redirect");
    13. request.getSession().setAttribute( "msg", "find url redirect");
    14. return "falseuser";
    15. }
    16. return arg0.invoke();
    17. }

    在这段代码中,作者仅仅示例了在拦截器中防御sql注入和url跳转漏洞,sql注入的防御规则是检查“’”单引号,而url跳转漏洞规则是检查必须跳转到”http://www.b.com”去。作者知道没有完全防御,所以大家先不要在这里追究防御方案,仅仅是一个示例。

    而开发人员在业务代码如下:

    1. String sql = "select book_name,book_content from books";
    2. if (name != null) {
    3. sql += " where book_name like '%" + name + "%'";
    4. }

    很明显能注入。

    1. public String redirect() {
    2. return "redir";
    3. }

    也明显存在url跳转漏洞。

    但是由于拦截器在action之前执行,所以如果我们输入了

    http://www.inbreak.net/app/test!findUserByName.action?name=a'

    拦截器当然就会返回错误“find sql injection”;

    因为执行到了

    1. String name = request.getParameter( "name");
    2. if(name!= null&&name.indexOf( "'")> -1){

    发现name的值确实有单引号。
    但是如果我们输入了

    http://www.inbreak.net/app/test!findUserByName.action

    ?name=aaaaa&name=a' union select name,pass from user where ''<>'

    就直接绕过了拦截器的判断。因为拦截器获取的request.getParameter("name"),是第一个参数的值aaaaa,抛弃了第二个参数的值,但是action中的name的值,却是“aaaaa, a' union select name,pass from user where ''<>' ”所以被注入了

    大多数拦截器都是这样做的防御,包括一些filter等。
    这件事情发生在url跳转漏洞时,却不明显,因为攻击者顶多构造一个:

    http://www.inbreak.net/app/test!redirect.action?redir=http://www.b.com&redir=www.inbreak.net

    抓包看看

    它跳到了http://www.b.com, www.inbreak.net去了。所以IE直接报错,说打不开这个地址。但是我们还有别的浏览器,总是喜欢给大家友好信息的浏览器,看看chrome给用户什么提示:

    Chrome也认为这是一个错误的链接,所以给出了“正确”的链接地址。这不是刚好被钓鱼网站利用么?
    struts2的官方漏洞公告和修补后引发的安全缺陷

    从有struts2,到现在为止,官方一共发布了4个漏洞,在

    http://struts.apache.org/2.x/docs/security-bulletins.html

    * S2-001 — Remote code exploit on form validation error
    * S2-002 — Cross site scripting (XSS) vulnerability on <s:url> and <s:a> tags
    * S2-003 — XWork ParameterInterceptors bypass allows OGNL statement execution
    * S2-004 — Directory traversal vulnerability while serving static content

    从名字上,可以看出漏洞的内容,作者仅仅对其中两个做了源码级别的漏洞修补评估,发现了很多悲剧的事情。
    同学们有兴趣可以去研究剩下两个漏洞。

    struts2的官方漏洞公告和修补后引发的安全缺陷(S2-002)

    先看看“S2-002 — Cross site scripting (XSS) vulnerability on <s:url> and tags”这个漏洞。

    顾名思义是对<s:url>和<s:url>的xss漏洞修补,但是前文提到,这里有XSS漏洞,难道是在忽悠大家?我们看看这帮工程师是怎么修补的,来到这个svn地址:

    http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java?r1=614814&r2=615103&diff_format=h

    注意这两行:

    看到这两行代码的时候,作者笑了,因为作者仿佛看到了至少两件悲剧的事情,现在把它们写成故事:
    第1件悲剧的事情,某年某月某日,一个脚本小子给官方报告漏洞,说在使用<s:url>标签的时候,代码为:

    <s:url action="%{#parameters.url}"></s:url>

    之后他输入了

    http://www.inbreak.net/app/test!testpro.action?url=<script>alert('hacked by kxlzx')</script>

    并告诉官方这里是一个XSS漏洞,希望官方修补掉。
    官方很重视,一个开发就去修补,添加如下判断:

    1. if (result.indexOf(" <script> ") >= 0){
    2. result = result.replaceAll(" <script> ", "script");

    并进行了冒烟测试、功能测试、黑盒测试、白盒测试。认为没有问题了,因为提交攻击者给的恶意url后,输出了

    scriptalert('hacked by kxlzx')</script>

    结果并没有在页面执行xss脚本。后来那脚本小子也测试了一下,发现没问题,这事情就过去了,瞒着人民大众,悄悄的修补了。

    第2件悲剧的事情,又过了某人某月某日,某另一个脚本小子又发了漏洞,还是那段代码,但是url改成了:

    http://www.inbreak.net/app/test!testpro.action?url=<<script>>alert('hacked by kxlzx')</script>

    注意,这里是<<script>>,经过了replaceAll函数后,刚好变成了<script>,重新组成了XSS漏洞。
    官方这次不得不重新重视起来,决定把if判断,变成了while,不管你有多少<<<<<<<script>>>>>>>,都给你变成

    scriptalert('hacked by kxlzx')</script>

    并进行了冒烟测试、功能测试、黑盒测试、白盒测试。这次还发了公告出来,说这里没问题了,我们很重视安全漏洞,已经修补了。

    作者看到这里,测试新的bypass官方修补代码的url为:

    http://www.inbreak.net/app/test!testpro.action?url=<script kxlzx=kxlzx>alert('hacked by kxlzx')</script>

    于是XSS脚本又被执行了,因为这里是<script kxlzx=kxlzx>,不是<script>,所以不符合判断条件,没有被replaceAll,再次bypas了漏洞修补。。。

    struts2的官方漏洞公告和修补后引发的安全缺陷(S2-004)

    这个漏洞的修补,比上一个更加令人无奈,这是一个/../获取资源文件的漏洞

    S2-004 — Directory traversal vulnerability while serving static content

    要了解这个漏洞的成因,大家需要先了解一个知识点。

    当struts的FilterDispatcher收到url请求如下两个路径下的文件时:

    http://www.inbreak.net/app/struts/

    http://www.inbreak.net/app/static/

    会去取struts核心包的core.src.main.resources.org.apache.struts2下面的静态资源文件,这些资源文件其实是一些js脚本和一些css文件。前文提到

    <img onmouseover="domTT_activate(this, …'StrutsTTClassic');alert('xss');a('','styleClass’…" />

    代码中的domTT_activate,其实就是

    http://www.inbreak.net/app/struts/domTT.js

    文件中的一个函数。

    在struts2.0的时候,只要你敢上某几个版本的struts2,攻击者就可以通过

    http://www.inbreak.net/app/struts/..%252f

    http://www.inbreak.net/app/struts/..%252f..%252f..%252fWEB-INF/classess/example/Login.class/

    浏览你的web目录,下载web目录下的文件。
    先不说漏洞修补,请读者赶紧想想,你公司的开发人员,是否使用了struts2,并且把“Struts 2.0.0 - Struts 2.0.11.2 ”之间的几个版本包装了或者根本没有包装,直接上了web应用。如果有这种情况,就可以直接用以上方式攻击,这几天作者找了几个大型门户网站的漏洞,发现他们都存在这个漏洞,顺便下载了他们的数据库配置文件,同时报告了漏洞。

    Struts官方可能也受到了攻击,于是修补了代码。
    作者同样查看了svn修补记录:

    http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/DefaultStaticContentLoader.java?r1=674498&r2=687425&pathrev=687425&diff_format=h

    可以看到“ if (!name.endsWith(".class")) {”这行代码在修补漏洞时,被删除了。

    修补前的代码中,为什么以前要过滤.class文件呢?是因为struts提供了一个功能:
    如果开发人员想自己使用这个静态文件映射的功能,可以配置web.xml

    1. <filter>
    2. <filter-name>struts </filter-name>
    3. <filter-class>
    4. org.apache.struts2.dispatcher.FilterDispatcher
    5. </filter-class>
    6. <init-param>
    7. <param-name>packages </param-name>
    8. <param-value>net.inbreak.action </param-value>
    9. </init-param>
    10. </filter>

    如上配置后,当用户输入

    http://www.inbreak.net/app/struts/domTT.js

    的时候,实际上struts会去找net.inbreak.action这个文件夹下的domTT.js文件发给用户,而不再寻找核心包的那个文件夹了。这个功能开放后,官方为了防止对应包下的class文件被下载后反编译成源码,所以写了行代码,过滤.class文件。

    就因为这行代码的存在,一时间,刚巧又正是struts2流行的时代。互联网大批的文章介绍struts2核心源码,在介绍到FilterDispatcher的时候,必然会提到,这里会过滤.class文件,如果开发人员使用这个功能,可以放心,自己的class文件不会被人下载。

    后来出了漏洞,攻击者可以用

    http://www.inbreak.net/app/struts/..%252f..%252f..%252fWEB-INF/classess/example/Login.class/

    绕过官方限制,下载class文件。最终的确修补了这个/../的漏洞。然而悲剧的是,因为class文件实际上还是可以被下载,所以官方修补的同时,去掉了“if (!name.endsWith(".class")) { ”这一行代码,可能是觉得这一行代码太丢人。

    曾经的教程,还在互联网上,告诉大家class文件不会被下载,官方也发表声明修补了/../漏洞。但是看到教程的开发们,却早已把目录映射了静态文件:

    1. <param-name>packages </param-name>
    2. <param-value>net.inbreak.action </param-value>

    如果这个开发的net.inbreak.action包下有个UserLogin.class文件,在struts2有漏洞的版本,会面临服务器上所有文件被下载的命运。即使开发升级了struts,因为核心代码中的class文件的判断去掉了,导致这个文件还是可以被

    http://www.inbreak.net/app/struts/UserLogin.class

    官方在没有任何通知的前提下,在教程满天飞告诉大家class文件不会被下载的前提下,为了面子悄悄的取掉了这个判断。这回好了,无论升级否,都不让人消停,万一开发人员头脑发热,配置如下:

    1. <param-name>packages </param-name>
    2. <param-value>/ </param-value>

    就出大事了,可以直接下载资源目录下所有文件。

    http://www.inbreak.net/app/struts/hibernate.cfg.xml

    总结

    作者挖了struts2的一些漏洞,也挖了一些web其他框架的漏洞(不在本文范围),总结下挖取这些框架漏洞的方式。

    首先,是上不上框架的问题。一旦开发用了这些框架,web应用会直接面临一些漏洞:

    1,开放了某功能,导致采用框架的应用默认漏洞

    因为这个框架在未经允许的情况下,悄悄的打开了某些功能,可能是为了方便开发等作用,结果导致了漏洞的产生。

    举个例:
    比如DWR这个AJAX框架一旦使用,在某些版本里,输入

    http://www.inbreak.net/app/dwr/

    就能看到一个页面,里面是所有ajax方法的映射,甚至一些service方法没有配置,自动映射了出来。你可以在这个页面给那些映射出来的方法提交参数,调用方法。比如有个getUserpasswdByid的方法,看名称就知道,传递用户id,返回密码。

    再举例就是本文中的struts2的../../漏洞。
    如果要挖这种漏洞,绝对是0day级别的漏洞,所以大家有必要怀疑每一个实现步骤,这种漏洞其实大部分就出现在开发环境和正式环境的差异,以及一些奇奇怪怪的功能点上。

    2,扩展了某功能,导致安全问题

    我们的web应用,本来是可以自己写代码实现一些功能的,但是这个框架为了方便开发和管理,把开发人员要写的代码包装了下,只要简单的几行就能实现原本大批代码才能做到的功能。而这些便利,却带来了很多安全问题。挖漏洞的同时,应该特别注意哪些地方比原来方便了很多,扩展了很多,这些扩展和方便,是否考虑到了安全因素。

    比如本文介绍的struts的result(urlredirect)相关漏洞。

    3,DEMO或教程或用户指南误导

    自从框架出现后,为了让人们最快的了解和使用框架,官方出了很对用户手册,demo等功能。而很多大牛们,也相应的出了教程或者书籍,但是这些教程,DEMO,书籍上的例子,恰恰产生了很多漏洞。甚至开发本来不按照教程走,不会有漏洞,却被教程误导了。如果黑客看到这些书籍,请立刻把他列到你的扫描器中,绝对有不少开发会按照教程上去做。

    例如本文提到的那个书籍介绍我们使用ajax的事情。

    4,原本有安全方案,但是被某功能代码覆盖

    这其实是一件悲剧的事情,告诉我们要注意在日常开发中和漏洞修补中,是否有不明真相的开发人员,为了实现某个功能,悄悄的把原本的安全方案断章取义的覆盖掉了。挖漏洞的时候,要特别注意安全方案附件的代码变动,很可能发现非常弱智的逻辑问题。

    例如本文提交的class文件的判断。

    5,不完善的安全

    一个安全方案的实施,应该是彻头彻尾的,要注意方案的完整性,不能有些地方方案OK,有些地方不能实施。在挖漏洞的时候,也不要被安全方案吓住,并不是有了方案,听起来牛X,就绝对不会有漏洞的,最起码应该经过全面fuzz。

    例如本文提到的XSS遗漏点,以及富文本的遗漏。

    6,版本升级后,没有醒目安全公告

    我们知道所有的架构师都不愿意有事没事升级框架,特别是不稳定的框架版本,因为这个升级可能带来很多不可预料的问题,所以可能即使看到了安全公告,也没有去升级。如果不懂安全,更不愿意升级框架了。所以官方必须做到一个漏洞的修补,一个公告的发布,必须带有相关的代码log。告诉大家具体哪里做了改动。而挖漏洞的同学更应该盯紧这些地方,百般推敲和测试修改的部分,不要被一次公用的测试结果吓到,模糊的认为漏洞已经修补了。

    7,悲剧的方案

    很多时候,我们会看到官方修补漏洞,或者一些安全方案的实施结果。那是不是真的都能达到修补漏洞的效果呢?

    例如本文的<s:url>标签的xss漏洞,官方都这个漏洞的修补,真是绞尽脑汁,最终还是悲剧了。

    8,优秀的方案,悲剧的执行

    RT,不再说明。

    9,挑战web服务器配置

    这个问题有必要说一说,struts有事没事做个静态映射做什么?其实是目的就是为了框架和应用分离,很明显那些js文件应该放在项目中的web目录下,但是为什么要做呢?还不是因为struts包发布的时候,还没有项目,只有框架。

    它为了达到即使上了任何项目,也能有办法访问到它提供的那些js的目的,只好被逼无奈做了这个功能,静态目录映射。无论任何项目,部署后,只要url后面根目录加上/struts,或者/static就可以访问js。后来做了这个功能感觉良好还不算,居然把功能提供出来,给推荐给开发人员使用。归根结底是因为struts挑战了web服务器的配置,非要自己做静态映射。要知道人家web服务器做的映射,是经过多少年黑客入侵打磨出来的,struts有吗?

    这种情况突出在单独映射某目录,单独对某目录做权限,做DIR列表等功能,如果你看到一个框架也做了这种功能,恭喜你!赶快去挖,十有八九存在漏洞!

    10,没有安全方案,也没有提醒

    本文其实没有提到一些web漏洞,比如csrf,比如session fix,比如传输加密等,很明显struts是存在漏洞的,只是作者觉得这些东西没必要这里说,大家都是明眼人,看到form里没有token,百分百csrf嘛!

    想想官方,官方也明明知道上了自己的框架后,会存在这些漏洞,为什么连个提醒都没有呢?本来开发就不知道,你又藏着掖着。如果框架负责任,发个公告,说如果你用了我的框架,实际上要小心什么什么攻击。。。

    呃。。。我明白官方为什么不敢说了。-_-!
    这些框架除了那些“只要你用,必然有漏洞”的安全缺陷外,还有不少问题,会出现在开发人员使用框架的过程中:
    1,两个框架都方便,结合起来有漏洞
    有个框架叫做Spring security,是基于url的访问权限控制,做的很好。如果你不是管理员,绝对不能访问admin目录。但是有很多web框架,访问一个action或者访问一个controller,不止一个url可以访问,在这里做了兼容性处理,多个url指向同一个应用,导致Spring security这种基于url的访问控制,名存实亡。

    2,开发人员“正常”使用框架后,可能产生漏洞
    这是最最惨的事情,框架绝对不会认领这种类型的漏洞的,他会认为这是开发的问题。然而本文的“action方法暴力破解、url redirect扩大化”这两个安全缺陷,实际上也是框架存在的意义(方便开发)带来的后果。官方会修补么?我想它顶多会说,大家不要这样那样而已,绝对不会做什么安全方案的。要知道这些漏洞是具有struts或者webwork特色的,只有使用了这些框架才会有的。

    3,危险功能点
    框架带来了一些功能点,比如Tag lib的一些XSS,只要使用,必定有漏洞。

    4,框架给开发挖坑
    这根本就是陷阱,还是要说/static、/struts,如果开发不配置,顶多下载个js,影响不大,万一开发使用了这个功能,映射了某个目录,那就掉进坑里去了。

    5,一个框架带来的漏洞被另一个框架最大化
    本文提到了变量默认值被覆盖后,又因为hibernate不需要写sql语句,而最终被存储进了数据库中。
    回想一个问题,如果让我们自己写sql语句实现,难道在添加普通用户的时候,会真的专门写个变量,接收用户传进来注册管理员的字段么?

    但是这是hibernate得问题么?当然不是,只是因为有了它,导致漏洞更加严重而已。

    补充

    本文对struts2的种种安全缺陷,就提到这里。个人觉得这是一个挖漏洞的方向,对framework漏洞的挖掘。
    可能大家都专注于代码安全,没有太多的去看框架本身是否安全,以及使用了框架后,是否真的安全。
    所以很多人忽略这个问题,我相信这不是一个新的开始,也不是一个结束,只是让大家开始更加重视框架安全。
    作者也仅仅在本文提到了struts,webwork这两个框架,事实上框架很多,他们真的安全么?有待考证!
    最后写给那些真正打算把技术应用于实践的同学们,框架漏洞扫描器,是可以做出来的,对于难以解决的猜解问题,可以对网站蜘蛛一下,然后保存那些开发人员喜欢使用的字段名称,关注各个input的名字,action的名字,目录名字等,生成猜解一个列表。而判断是否用了struts更加简单:

    特征1:XXX.action 可能是struts或webwork
    特征2:XXX.do 可能是struts或webwork
    特征3:XXX!bbb.action 可能是struts或webwork
    特征4:XXX/struts/..%252f 必然是struts2
    其他细节处,不再一一给出,有待大家发掘。
    相关的漏洞修补方式,作者不在此处献丑,请大家根据漏洞原理自行处理。

    感谢

    ----------------------------------------
    感谢axis (http://hi.baidu.com/aullik5)对本文提出的建议。
    感谢幻影webzine http://webzine.ph4nt0m.org/
    感谢struts所有开发人员种种有趣的代码。
    作者DEMO中有敏感数据,恕不能提供,请大家自行搜索strutsdemo搭建环境测试。
    Struts2:http://struts.apache.org/2.x/
    Struts2 svn:http://svn.apache.org/viewvc/struts/struts2/trunk/


    展开全文
  • 敏捷项目如何进行缺陷管理

    千次阅读 2020-04-23 16:03:38
    目录引言缺陷记录缺陷流转缺陷分析 引言 缺陷记录 缺陷流转 缺陷分析
  • 软件测试中的缺陷分析与管理

    千次阅读 2019-08-20 17:03:48
    1.软件缺陷报告地基本组成元素包括 缺陷的编号、缺陷的标题、缺陷的基本信息、测试的软件和硬件环境、测试的软件版本、缺陷的类型、缺陷的严重程度、缺陷的处理优先级、缺陷的复现步骤、缺陷的实际结果描述、期望的...
  • 软件测试之缺陷管理

    万次阅读 2018-03-21 20:31:13
    软件测试系列---缺陷管理 一、软件缺陷的基本概念 1、软件缺陷的基本概念主要分为:缺陷、故障、失效这三种。 (1)缺陷(defect):存在于软件之中的偏差,可被激活,以静态的形式存在于软件内部,相当于bug; ...
  • 二、缺陷管理流程图 三、开发人员修改缺陷填写规范 四、项目经理决定延期修改缺陷  一、缺陷常用字段说明  1、摘要  对缺陷的简单描述。摘要包括缺陷所属的模块名称-子模块名称,以及简单说明缺陷情况。  2、...
  • 这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步。前文通过两个题目分享了DirBuster扫描目录、Fuzzy爆破指定路径名称,通过Sqlmap工具...
  • web安全(8)-- 程序缺陷

    千次阅读 2016-11-23 17:37:17
    所谓软件缺陷,即为计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷
  • 在这辞旧迎新之际, CODING 研发管理系统又迎来一重大更新,期待已久的缺陷管理功能正式开始正式公测,帮助研发和测试人员更好追踪和管理软件缺陷,提供软件研发效能。 在任何软件的生命周期周,几乎必然会出现不同...
  • 测试缺陷管理工具

    千次阅读 2016-11-01 17:46:10
    是一个多功能,基于网络 (web-based) 并在浏览器 (browser) 下运行的 Bug缺陷管理和跟踪系统 (bug tracking system),可用来记录,跟踪,并归类处理软件开发过程出现的 Bug 和硬件系统中存在的缺陷(defect)。...
  • 缺陷管理工具: 1. Bugzilla 2. Bugfree 3. TestDirector (Quality Center) 4. ClearQuest 5. JIRA 6. Mantis 7. Bugzero 8. BugTracker 9. URTracker 10.KisTracker 11.TestLink 12、JTrac ...
  • 有关在代码中查找安全缺陷的专家提示发布日期: 12/20/2004 | 更新日期: 12/20/2004Michael Howard这篇文章假设您熟悉安全性、C# 和 Visual Basic .NET摘要检查代码中的安全缺陷,是软件创建过程中的一个关键...
  •  定义:在软件工程整个生命周期中任何背离需求、无法正确完成用户所要求的功能的问题,包括存在于组件、设备、或系统软件中因异常条件不支持而导致系统失败等都属于缺陷。  从产品内部看,缺陷是软件产品开发或...
  • QC缺陷管理操作(细说)

    2012-10-30 11:54:00
    摘要包括缺陷所属的模块名称-子模块名称,以及简单说明缺陷情况。 2.描述 详细描述重现该缺陷的步骤,错误现象和期待结果。必要时可以上传附件辅助说明。 3.状态 序号 缺陷状...
  • 搭建Mantis 缺陷管理系统

    万次阅读 2012-03-01 11:47:37
    原文地址: ... 搭建Mantis 缺陷管理系统 By Snooper 错误必有!欢迎指正! 什么是Mantis MantisBT is a free popular web-based bugtracking system (feature list)
  • Struts2框架安全缺陷[转贴]

    千次阅读 2010-04-01 19:37:00
    本文介绍了java开发流行框架struts2以及webwork的一些安全缺陷,并举例说明框架本身以及开发人员使用框架时,所产生的种种安全问题,以及作者挖掘框架安全漏洞的一些心得体会。推荐以下人群阅读了解java开发了解框架...
  • 近日,CNCERT发布了《开源软件代码安全缺陷分析报告——框架类软件专题》。本期报告聚焦国内外知名框架类开源软件安全开发现状,通过多款知名框架类开源软件产品的安全缺陷,评估开源项目的代码安全控制情况。360...
  • 目前流行的Bug缺陷管理工具

    千次阅读 2014-05-24 16:24:11
    目前流行的缺陷管理工具(2009-09-2309:31:13)  标签:杂谈 分类:软件测试   缺陷管理工具: 1. Bugzilla 2. Bugfree 3. TestDirector (Quality Center) 4. ClearQuest 5....
  • 软件缺陷主要包含哪些要素?

    千次阅读 2021-04-10 21:53:37
    缺陷管理软件:BUGFree、JIRA、Bugtags、禅道、Quality Center、TAPD… 这些系统提供软件缺陷报告要素是大同小异的,我们需要掌握的是如何把软件缺陷要素怎样描述清楚,并提供准确有效的信息。 quality center包含的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,256
精华内容 37,702
关键字:

安全管理的缺陷包括