《Web入侵安全测试与对策》读书笔记

《Web入侵安全测试与对策》读书笔记








第1章 与众不同的Web

         要吸取的教训其实非常简单:不要信任任何客户机,不要信任任何网络,重要的操作都要放在服务器端执行。要时刻记着这些原则。


第2章 获取目标的信息

        本章列举了三种不同的网络攻击,它们都可以获取Web应用程序的有关信息。在战争中,侦查和获取敌人的消息需要花费大量的时间,因为这有助于
更加合理的利用自身的攻击能力。
        软件测试的目的就是发现缺陷和证明缺陷的存在,所以能够找出bug的测试是优秀的测试,因为这减少了潜在bug的数量。而没有找出bug的测试也是优秀
的测试,因为它证明了软件的可靠。但我们必须保证这些测试都是可靠的,对一样东西反复进行 测试当然能够起到检验的作用,但这么做的效率太低了。


第3章 攻击客户机

        绕过对输入选项的限制

        绕过客户端的验证

        验证输入:有两种验证输入的方法:白名单和黑名单。
                白名单:可以接受的合理输入;
                黑名单:应该拒绝接受的非法输入;


第4章 基于状态的攻击

        隐藏域

        CGI参数
            URL地址中问号之后的内容就是CGI参数,可以通过编辑页面的HTML代码来修改CGI参数,就像前面攻击隐藏域时一样。但对于GET方法的参数而言,
可以先直接获取一个目标页面,并在浏览器的地址栏里修改CGI参数,然后重新载入这个页面。
          
        破坏cookie

        会话劫持。cookie有四种传输形式,这四种形式相互组合,可以有两种设置方式:持续的和非持续的;安全的和非安全的。
        持续的:浏览器会把持续的cookie存放在客户端本地硬盘上,直到指定的日期再删除;
        非持续的:浏览器会在非持续的cookie关闭的时候就将其删除;
        浏览器发送cookie是通过安全传输方式进行的,对于HTTP而言,是通过SSL(HTTPS)完成的。可通过对cookie加密来预防破坏。

      URL跳转

      会话劫持
          在用户访问web站点的过程中,会话管理对每个用户都有一个唯一的标识,而每当一个新的用户访问网站的主页时,服务器上也会有一个相应的标号
          来记录。该用户所有进一步的页面请求都会包含此标号,这样web应用程序就能识别此用户,并记录其状态信息。
          有几种方法可以使得不同用户的会话标识发生互换,以破坏会话管理的功能。具体:
                  随机更改数据,试图变成另一个用户;
                  破解网站使用标识号的顺序;
                  修改另一用户的会话标识。
          服务器端的会话标识可能表示为隐藏域、也可能附加在URL地址中,还有可能保存在cookie里。大多数情况下是把会话标识保存在cookie中,并在每次
          加载页面的时候传递给服务器。
          
          会话劫持的目的是要通过使用其他合法用户的会话标识伪装成他们。最常见的方法是用各种手段窃取该用户的会话标识,然后尝试重新发送页面请求。
          有的web应用程序在收到非法的会话标识时会返回一些对于攻击者有用的出错信息,但是要识别攻击是否成功,最主要的标志还是是否能获得其他用户
          的个人信息。
          
      会话定位
          另一种对会话管理进行攻击的方式叫做“会话定位”,它和“会话劫持”不同,“会话劫持”是在其他会话ID被使用之后对其进行占用,而“会话定位”则是在会话
          ID被其他合法用户使用之前就将其窃取,这样攻击者就可以在任何时候占用其他合法用户的会话了。

          攻击者要实施这种攻击,需要先生成一个待用的会话,或是通过会话管理机制设置一个指向web站点的链接,将会话标识符添加在URL地址中。接着
          毫不知情的用户会登录或点击这个链接,并开始使用web应用程序。由于会话是有效的,用户不会注意到有什么不同,但关键问题是此时攻击者对于合法
          用户所使用的会话标识符了如指掌,可以轻易确定用户的身份。
          
          会话定位攻击的对象一般是web邮件系统,入侵邮件系统就可以收发他人的电子邮件了。
    
          会话管理对于web应用程序而言是必不可少的,若应用得当,能够有效抵御很多网络攻击,包括会话劫持在内。因而虽然它仍然存在安全性问题,却成为
          web开发人员在会话应用方面的典型模型。

          如何正确使用会话管理:
              使用cookie保存会话变量
              禁止用户自己选择会话标识
              确保每位用户在访问网站时使用的都是“干净”的会话标识号                                 
              会话标识要有有效时限,在超过时限后将不能再被使用
              允许用户注销并清除会话
              利用HTTP的referer域来识别使用同一个ID登录的多个用户
              确保会话cookie经由安全的信道传送,以避免在传输中被截获 



第5章 攻击用户提交的输入数据

        跨站点脚本:跨站点脚本(XSS)是一种通过虚假的web页面内容伪装用户的常用方法。
            避免这种攻击的一个办法是web开发人员从用户提交的输入数据中过滤掉代码。实施时不仅仅要考虑<script>...</script>标签,任何脚本语言或代码输入,
            包括HTML、JavaScript、VBScript、Java、ActiveX、Flash等都可以称为XSS攻击的载体。

          payload:
          <script>alert("XSS")</script>            
          <img src="javascript:alert('XSS')">
          <body οnlοad="javascript:alert(XSS)">
          <link rel="stylesheet" href="javascript:alert('xss');">
          <object type=text/html  data="http://evilhacker.com/xss.html"></object>
          <img
           src="jav
ascript:alert('xss');"> 
           <src
            ipt>alert("xs
            s")</scr
            Ipt>
            %3cscript%3ealert("xss")%3c/script%3e
            ');alert("xss");

            事实上,保存一份黑名单,记录所有非法输入的各种编码形式并且不断对其进行更新,几乎是不可能的。更好的方式是只允许合法的数据通过。
            在HTML中,所有的代码都包含在一对尖括号中 < > 。因此,当把编码后的尖括号( &lt &gt )放到数据段中时,代码就不会被看成是数据了。
            HTTP-ONLY 并不能阻止XSS攻击,它不过是在特定浏览器中封闭了进行攻击的多种途径之一。

            SQL注入:

        Select accountdate FROM accountinfo WHERE accountid = 'acaccountnumber' AND password = 'apassword' (原)
        Select accountdate FROM accountinfo WHERE accountid = 'Sam' --' AND password = 'passwd' (注入 'Sam' --')
        Select accountdate FROM accountinfo WHERE accountid = 'Sam'        //从数据库中查到了Sam用户的全部信息
        Select accountdate FROM accountinfo WHERE accountid = '';INSERT INTO accountdate(accountid,password) VALUES('mike','1234') --' and password = ''
               //攻击者在数据库中添加了自己的用户名和密码。
        Select accountdate FROM accountinfo WHERE accountid = ''; DROP TABLE accountdate  --' and password = ''
               // 不同类型的用户应当被赋予不同的权限

            目录遍历:
                   恶意用户找到受限文件的位置并且浏览或者执行它们。攻击者浏览受限文件,比如读取密码文件,就会破坏隐私,甚至引发安全问题。
                   另一个严重的问题就是执行受限的文件,攻击者就可以根据自己的意愿来控制或者修改web站点。
                   目录遍历通过浏览器的地址栏完成。攻击者可以利用其它的表格域,从web服务器上获取文件,但是利用URL进行目录遍历攻击更加常见。
                      
                   http://www.megamoneycorp.com/getreport.asp?item=Q1-2005.htm  HTML文件Q1-2005.htm在web中是允许用户读取的,应用程序就正在载入
                   文件,并且将其中的内容显示给用户。
                   我们可以将URL地址简单的改为:http://www.megamoneycorp.com/getreport.asp?item=Q2-2005.htm 若存在同名文件 Q2-2005.htm,
                   并且服务器对于文件的访问权限没有进行限制,我们就可以看到其中的内容了。可以通过这种猜测的方法,获取在web服务器上本不该允许访问
                   的文件。
                       
                 http://www.megamoneycorp.com/getreport.asp?item=getreport.asp             //  查看文件 getreport.asp 源代码
                 http://www.megamoneycorp.com/getreport.asp?item=../getreport.asp          //  查找文件
                 http://www.megamoneycorp.com/getreport.asp?item=../../../etc/passwd       //  服务器渗透
                 http://www.megamoneycorp.com/../../../WINNT/SYSTEM32/cmd.exe?/c+dir+c:\   //  试图寻找cmd.exe程序,并执行dir c:\命令。

                    保护系统免遭目录遍历攻击的两种预防方法:
                    对web应用程序进行限制,使得其只能向用户提供web根目录及其下子目录中的页面;
                    建立存取控制列表(ACL);



第6章 基于语言的攻击

        "基于语言的攻击" 这种攻击方式主要是针对应用程序大多数组件所使用的编程语言中某些已知的漏洞来进行攻击的。
        三种类型的攻击:缓冲区溢出、公理化、NULL字符串攻击。
        
        缓冲区溢出:缓冲区溢出应该是针对Web应用最臭名昭著的一种攻击了,它是20世纪70年代第一个被发现的web安全隐患。利用缓冲区溢出作为蠕虫和
                            非法代码段的传递机制是web开发领域的热门话题。

        识别所有潜在的数据输入域并生成不同范围的数据已经超出了一般的web应用程序所能够承担的范围。在这种情况下,最好使用自动化的测试工具,
        因为生成输入的数据和识别测试是否成功都是很容易的事,不需要手工完成。

        防御:当输入的数据没有检查大小就直接复制到内存中的时候,就会发生缓冲区溢出的问题。因此可以通过两种途径来防御这种攻击:预先确知数据的
                  大小,并据此分配足够的内存;或是在数据输入达到一定数量后就中断输入,丢弃用户试图加入到应用程序中的一切额外的输入。
                  最简单的办法是在达到一定的长度之后就截断所有的输入。最好在客户端就先进行截断,然后在服务器端将其传入内存之前再截断一次。

        公理化:指所有的数据都要符合同意的标准格式,若在进行数据的使用或比较时没有完成这一步骤,就无法在最终处理的时候使用这些数据,因此进行
                     数据 验证对于抵御攻击非常有用。

         NULL字符攻击:在不同的环境下对数据进行不同的编码,使其具有不同的含义。这里提到的攻击正是利用了NULL字符的这种特点,它可以编码
                                 成“\0”或是“%00”。在C语言之类的低级语言中,NULL字符表示一个字符串的结束,而在PHP之类的高级语言中是用不着的,因为字符串
                                 的结束符会被自动处理。

                    这种对于一个字符存在不同处理方式的情况,正是攻击数据认证机制的一个绝佳突破口。

                    如何使用这种攻击方式:
                           在实施其他的攻击时有可能因为服务器端的输入校验而失败,此时可以试着在输入的数据中添加一些NULL字符, 比如添加 到某些敏感
                           字符串的结尾或中间。 这种攻击其实就是在其他攻击方式的输入字符串中添加NULL字符,以逃避服务器端的输入验证。
                           一般可以先只使用其他的攻击方式,若攻击失败,而返回的出错信息又证明是因为未能通过数据验证,那么可以尝试在字符串的开始或
                           结束等 位置添加一些NULL字符来越过输入验证的障碍。                
                           NULL 字符由两种表示的方式:在C语言中以\0来表示,而编码后则表示为%00


第7章 获取目标的信息

        对服务器端应用程序的攻击。对操作系统和数据库的攻击就是向服务器发送指令,并且强迫指令执行。显然,这些攻击会对服务器的安全造成危害。
        拒绝服务也是攻击的一种目的,它会使得服务器无法向用户正常提供服务。

        SQL注入---存储过程:
                存储过程是由数据库软件发行人员或者第三方开发人员事先编写在内部的查询命令,并且被集成到数据库中。这些存储过程有助于保证web的安全,
                因为任何传递给他们的数据都会被按照其实际含义进行处理,而不会被误解为SQL命令的一部分。
                      
                避免这种攻击的一个简答方法是在数据库中为每个应用程序建立一个账户,并且只给予其所必须的权限。(诸如读写、插入等,但不包括建立表单,
                删除表单,或是内建任何的存储过程。) 
                
                命令注入:目录注入的思想:运行自己输入的命令,而不是按照开发人员预期的那样。避免这种攻击的办法还是输入验证。

                探测服务器:

                拒绝服务:如果将大量的请求快速提交到web服务器上,并且都是很多耗时的服务,就可以阻止其他用户正常访问web站点。这就是拒绝服务攻击。


第8章 认证

伪装型加密

        在考虑数据安全问题时,一般会涉及到三个方面的基本要求:
                保密性:只有指定的用户才能接收和获取信息
                一致性:用户收到的信息必须和服务器所发出的保持一致     
                易用性:系统运行的稳定可靠

        认证破坏

        跨站点跟踪

        暴力破解低强度密钥



第9章 隐私




第10章 Web服务













注:
        Web入侵安全测试与对策    Mike Andrews James A.Whittaker著  汪青青译    清华大学出版社  2006

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光明矢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值