面向Web的数据编码

来源:互联网 发布:村淘宝网 编辑:程序博客网 时间:2024/06/06 07:42

      最近开始学习Web安全测试的东西,就随意找了些资料看了看,为了记录学习的点滴过程,我就从这里开始了。

      这里我主要总结一下常见编码,如何识别、解码和编码,这些可能只适合同我一样菜鸟级别的选手。

      Web中常见的编码有: Base-8、Base-16、Base-36、Base-64、Unix时间戳、URL编码、HTML编码及其他等。

      八进制和十六进制大家都很熟悉,它们的编码和解码也很常见,这里我就不详细说明了。

      1.Base-36编码

      Base-36编码的特点:它的编码中包含0~9的数字,加上所有26个字母,不区分大小写,不包含任何标点,所有的字母要不全大写,要不全小写,而且编码中存在F之后的字母。

      举个例子:

             9X67DFQ、9X67DFR9X67DFS

      上面三组编码,就是可以看做是Base-36,这3个编码是连续的,前面6位相同,最后一位是连续的。曾经有人坐过站这样的测试,针对网上购物的,利用URL中Base-36编码,修改其中的参数,最终会产生90%的折扣。这说明针对那些利用编码完成重要信息的传输时,如果被hacker识别了这样的编码规律,那损失就大了。

      2.Base-64编码

      相比8进制、16进制和32进制,Base-64安全多了,它可以使用大小写字母(52个)、0~9数字(10个)和'+'、'/'两个符号,共64个,它们各种组合比较多,它可将那些无法打印或者对于传输通道不安全的二进制数据进行编码,从而提高安全性。

     Base-64编码有另外一个特点,就是它的字符长度始终是4的倍数,如果输入不是4的倍数,则末尾就会添加‘=’补全,最多可以看到有3个‘=’。同时记住,它是大小写字母混合编码的。

      举个例子:'080La9dR8OUN080adfadf==='

      请记住一点,虽然Base-64编码组合很多,解码比其他编码花费的时间长,但它不是加密,它很容被解码,如果你看到重要的数据使用Base-64编码,从hacker的角度,它很容易解码获取相应的信息的。

       另外,编码后的数据肯定要比未经编码的输入要长,举个例子,将原始用户ID的8位数据,编码成Base-64的ID后,你可能得到12位数据,存储空间变大,利用这一点,可能会给整个系统设计带来连锁反应,恰好这是测试安全问题的一个机会!

        3.URL编码

        URL编码的数据数据是使用%字符和十六进制数字来传送URL中不允许直接使用的字符,比如空格、tab、尖括号、斜线等。如果是这些字符,则需要进行编码,才能进行传输。常见的URL编码表如下:

backspace %08I %49v %76ó %D3tab %09J %4Aw %77&Ocirc; %D4linefeed %0AK %4Bx %78&Otilde; %D5creturn %0DL %4Cy %79&Ouml; %D6space %20M %4Dz %7A&Oslash; %D8! %21N %4E{ %7Bù %D9" %22O %4F| %7Cú %DA# %23P %50} %7D&Ucirc; %DB$ %24Q %51~ %7Eü %DC% %25R %52¢ %A2Y %DD& %26S %53£ %A3T %DE' %27T %54¥ %A5&szlig; %DF( %28U %55| %A6à %E0) %29V %56§ %A7á %E1* %2AW %57&laquo; %ABa %E2+ %2BX %58&not; %AC&atilde; %E3, %2CY %59ˉ %AD&auml; %E4- %2DZ %5Ao %B0&aring; %E5. %2E[ %5B± %B1&aelig; %E6/ %2F\ %5Ca %B2&ccedil; %E70 %30] %5D, %B4è %E81 %31^ %5Eμ %B5é %E92 %32_ %5F&raquo; %BBê %EA3 %33` %60&frac14; %BC&euml; %EB4 %34a %61&frac12; %BDì %EC5 %35b %62&iquest; %BFí %ED6 %36c %63à %C0&icirc; %EE7 %37d %64á %C1&iuml; %EF8 %38e %65&Acirc; %C2e %F09 %39f %66&Atilde; %C3&ntilde; %F1: %3Ag %67&Auml; %C4ò %F2; %3Bh %68&Aring; %C5ó %F3< %3Ci %69&AElig; %C6&ocirc; %F4= %3Dj %6A&Ccedil; %C7&otilde; %F5> %3Ek %6Bè %C8&ouml; %F6%3Fl %6Cé %C9÷ %F7@ %40m %6Dê %CA&oslash; %F8A %41n %6E&Euml; %CBù %F9B %42o %6Fì %CCú %FAC %43p %70í %CD&ucirc; %FBD %44q %71&Icirc; %CEü %FCE %45r %72&Iuml; %CFy %FDF %46s %73D %D0t %FEG %47t %74&Ntilde; %D1&yuml; %FFH %48u %75ò %D2​

      举个例子:

                 URL中要传输:<bold tag>

                 编码后得到:%3cbold%20tag%3e

     当然也可以根据编码表进行相应的解码。

     4.时间编码

       对于测试Web应用的人,特别是测试安全方面的人来说是非常重要的。在许多的应用中,开发人员认为时间是不可预测的,时间经常被用在会话ID、临时文件名、临时密码以及账号中。但作为攻击者,时间并不是不可预测的。

       先举个例子,不同的时间编码表达‘2008年6月1日下午5点32分11秒844毫秒’:      时间的各种表示编码输出YYYYMMDDhhmmss.sss20080601173211.844YYMMDDhhmm0806011732Unix时间戳(自1970.1.1以来的秒数)1212355931C区域设置中的POSIX时间Sum Jun 1 17:32:11 2008

        永远不要相信毫秒值是不可预测的。举个例子,如果软件读取时钟并只取出毫秒值,那么1000毫秒从古0~999中,取到任何一个值就将是随机的是吧,其实不然,出现某些值得可能性要比其他值大得多,这是因为,操作系统管理时间分片时,使得用时钟来产生随机性的效果非常差。这是你就应该考虑一个问题‘假如两个随机值相同了怎么办?’。

       5.多重编码的解码

       经常见到以Base-64编码的字符串中除字母和数字以外的字符(=+/)被URL编码方式进行二次编码。

       例如:V+P//z==可能会被显示成V%2bP%2f%2f%3d%3d。

       需要注意到这一点,在成功解码一轮完成后,需要将结果进行再次解码。

       6.复合参数解码的解决方案

       例如:如果看到AUTH=dGVzdHVzZXI6dGVzdHB3MTIz,经过解码后得到testuser:testpw123,这时,我们会知道它是一个复合参数,带有一个用户ID和一个密码,并用冒号做分隔符。这样,我们测试将需要分别处理这个复合参数的两个部分。

       7.复习小结
      
 下面举几个例子,看能否识别什么编码。

        1)xIThJBeIucYRX4fqS+wxtR8KeKk=

        2)TW9uIEFwciAgMiAyMjoyZnOyMSBFRF0gMjAwNwo=

        3)4BJB39XF

        4 ) F8A80EE2F6484CF68B7B72795DD31575

        5 ) 072303230404502340

        6)713ef19e569ded13f2c7dd379657fbd44527f

         答案:

         1)Base-64的MD5编码

         2)Base-64的SHA1编码

         3)Base-36编码

         4)十六进制的MD5编码

         5)八进制编码

         6)十六进制的SHA1编码

          注:MD5和SHA1指的是散列值类型,具体请各位自己去查资料哈~~

参考文献:

        1.Web安全测试,Paco Hope&Ben Waltber等著,傅鑫等译,清华大学;

        2.http://baike.baidu.com/view/204662.htm