目录
简介:
1、由于生成令牌的过程不安全, 攻击者能够确定发布给其他用户的令牌, 致使会话管理机制易于受到攻击
2、应用程序的安全取决于它所生成的令牌的不可预测性
发送到用户注册的电子邮件地址的密码恢复令牌
隐藏表单字段中用于防止跨站请求伪造攻击的令牌
用于一次性访问受保护的资源的令牌
“记住密码” 功耗使用的永久令牌
未使用验证的购物应用程序的消费者用于检索现有订单的当前状态的令牌
……
1.1、令牌含义
简述:
一些会话令牌通过用户的用户名或电子邮件地址转换而来, 或者使用与其相关的其他信息创建。这些信息可以某种方式进行编码或模糊处理, 也可与其他数据结合在一起
示例:
1、随机字符:第一眼看起来,令牌由一长串随机字符组成的字符串
2、特殊点:仔细分析后可能发现, 其中仅包含十六进制字符。猜想这个字符串可能是一个经过十六进制编码的ASCII字符串,使用解码器对其解码,
分析:
攻击者可以利用这个会话令牌的含义猜测其他应用程序用户的当前会话。使用一组枚举出的用户名或常见用户名, 就能够迅速生成大扯可能有效的令牌, 并进行测试以确定它们是否有效。
包含有含义数据的令牌通常表现出某种结构。它们由几种成分组成, 通常以分隔符隔开, 攻击者可分别提取并分析这些成分, 以了解它们的功能和生成方法
结构化令牌的组成成分:
账户用户名、应用程序用来区分账户的数字标识符、用户姓名中的名/姓、用户的电子邮件地址、用户在应用程序中所属的组或扮演的角色、日期/时间戳、一个递增或可预测的数字、客户端的IP地址
为特意对其内容进行模糊处理, 或者只是为了确保二进制数据能通过HTTP安全传输, 应用程序会对结构化令牌中的每个不同成分或整个令牌以不同方式进行编码。常用的编码方案包括XOR、Base64和使用ASCII字符的十六进制表示法。为将其恢复到原始状态, 可能有必要对结构化令牌的每一个成分使用各种不同的解码方法
注:
如果令牌中包含一个二进制巨对象, 那么这些数据中的大部分为填充数据, 只有一小邻分数据与服务器在令牌上执行的确认有关。减少令牌中确实必需的成分的数量通常可显著降低令牌的复杂程度
过程:
1、从应用程序中获取一个令牌, 对其进行系统化的修改, 以确定整个令牌是否有效, 或者令牌的某些成分是否被忽略。尝试以一次一个字节(或者一次一个位)的方式更改令牌的值,然后重新向应用程序提交修改后的令牌,看应用程序是否仍然接受这个令牌。
如果发现令牌中的某些部分实际上并无作用, 可以将它们排除在深入分析之外。可以使用Bp Intruder中的"char frobber"有效载荷类型修改令牌的值, 每次修改一个字符
2、在不同时间以不同的用户登录, 记录服务器发布的令牌。如果应用程序允许自我注册,可以选择自己的用户名, 用一系列存在细微差别的相似用户名登录. 如AAA、AAAA、AABA等。如果其他与某一名用户有关的数据(如电子邮件地址)在登录阶段提交或保存在用户资料中. 对其进行与前面类似的系统化修改,并记录登录后收到的令牌。
3、对令牌进行分析, 查找任何与用户名和其他用户可控制的数据有关的内容
4、分析令牌, 查找任何明显的编码或模糊处理方案。如果用户名包含一组相同的字符在令牌中寻找可能使用XOR模糊处理的对应字符序列,在令牌中寻找仅包含十六进制字符的字符序列, 它表示应用程序可能对ASCII字符串进行了十六进制编码处理,或者披露其他信息。寻找以等号(=)结尾的字符序列或仅包含其他有效Base64字符的序列, 如a~z、A~Z、0~9、+和-
5、如果对会话令牌样本进行逆向工程可获得任何有意义的结果, 看看是否拥有足够的信息可猜测出应用程序最近向其他用户发布的令牌。找到一个依赖会话的应用程序页面(即如果不使用有效会话访问,就会返回错误消息或指向其他位置的重定向页面), 通过Bp Intruder之类的工具可使猜测出的令牌向该页面提出大量请求。监控页面被正确加载的所有情况的结果,这表示会话令牌有效
1.2、加密令牌
ECB电子密码本模式
原理:将待处理信息分组,每组分别进行加密或解密处理
优点:简单、并行
缺点:分组加密(加密方式一致,加密消息块相互独立),可根据密文情况观察,有被破解的风险
CBC密码分组链接模式
简述:鉴于ECB密码存在明显的缺陷, 开发出了密码块链(CBC)密码。使用CBC密码时,在加密每个明文分组之前, 将它与前一个密文分组进行XO配运算,同一个明文分组就不会被加密成同一个密文分组。解密时逆向执行XOR运算, 每个解密的分组将与前一个密文分组进行XOR运算, 以恢复原始的明文
原理:每个明文块先与其前一个密文块进行异或,然后再进行加密
优点:无法直接从密文中看出明文信息块的规律(因密文块依赖于所有的信息块,若有一个消息改变则影响所有密文块),所以安全性比较好;加密解密过程都需要 初始化向量
缺点:加密过程是串行的,无法被并行化;消息要是块大小的整数倍,不够需要填充
示例:
攻击者对加密的令牌进行修改, 每次以任意方式更改一个字符, 并将修改后的令牌发送给应用程序。在这个过程中, 攻击者会提出大量请求。应用程序对每个修改后的令牌进行解密后生成的部分值如下所示
????????123235;app=musci;uid=432;username=toy;time=512311;
rand=124????????pp=musci;uid=432;username=toy;time=512311;
rand=124123235;a????????;uid=432;username=toy;time=512311;
……
攻击者修改的分组被解密成乱码(以????????表示)
如果应用程序拒绝包含任何无效数据的令牌, 攻击将会失败。但以这种方式使用令牌的应用程序通常仅查看解密令牌的某些部分, 如用户标识符。如果应用程序这样处理令牌,分组中将存在能够成功实施攻击的, 应用程序将处理攻击者提出的请求,并认为用户的uid为400, 而不是最初的432(将432改为400提交后)
使用Bp lntruder中的"位翻转程序"有效载荷类型, 可以轻松测试出应用程序是否存在这方面的漏洞。需要使用自己的账户登录应用程序,找到一个使用已登录会话并在响应中显示已登录用户标识符的应用程序页面, 通常是用户的 "主登录" 页或 "账户详细资料" 页。将Bp设置为针对用户的主页(配置为sinper), 其中的加密会话令牌被标记为有效载荷位置
指示Bp处理令牌的原始值, 将其视为ASCII编码的十六进制代码,并 "位翻转" 每个字符位置的每个数据位。这种方法非常理想, 因为只需要提交较小数量的请求(令牌中的每个字节8个请求), 并且几乎总是能够确定应用程序是否易于受到攻击。这样就可以采用更有针对性的攻击, 对应用程序的漏洞加以利用
应用程序仅显示 "未知用户" 表示经过修改的uid没有对应的实际用户, 因此攻击将会失败。其他情况下, 应用程序会显示其他注册用户的名称, 这说明攻击已取得成功
确定存在的漏洞后就可以通过更有针对性的攻击来利用该漏洞。需要从结果中确定,如果用户的资料发生变化,加密令牌中的哪个数据块会发生变化。再实施攻击以测试这个数据块中的其他值,可以使用Bp intruder中的“数字“ 有效载荷类型
过程:
在应用程序采用加密令牌时, 具体的攻击方法可能要取决于各种因素, 包括分组边界相对于攻击的数据的偏移值, 以及应用程序是否允许修改明文的结构。完全盲目地开始攻击将很难实施有效的攻击, 但在许多情况下, 这种攻击也可能会奏效。
1、除非会话令牌明显有意义或本身是连续的, 否则应始终考虑令牌被加密的可能性。通过注册几个不同的用户名, 并在用户名中每次添加一个字符, 就可以确定应用程序是否采用分组密码。
如果添加一个字符会导致会话令牌的长度增加8或16个字节, 这说明应用程序可能使用的是分组密码。要确认这一点,可以继续在用户名中添加字节, 看最后会话令牌是否会同样增加8或16个字节
2、在盲目的情况下, 很难确定并利用ECB密码操纵漏洞。但可以尝试盲目地复制并移动令牌中的密文分组, 并查看能否能够以自己的用户账户或其他用户赈户登录应用程序, 或根本无法登录应用程序。
3、可以通过使用“位翻转” 有效载荷源对整个令牌实施Bp Intruder攻击, 测试应用程序是否存在CBC密码操纵漏洞。如果位翻转确定了令牌中的某个部分,并且修改该部分后仍然能够以其他用户或不存在的用户身份访问有效会话,攻击者可以扩大攻击范围, 对这个部分中的每个值进行测试, 以实施更有针对性的攻击
4、攻击过程中,监视应用程序的响应, 确定与提交的每个请求生成的会话有关的用户, 并尝试利用任何机会来提升自己的权限
5、如果攻击并未奏效, 但能获知攻击者提交的长度可变的输入已被合并到令牌中的话,应尝试每次增加一个字符, 直到达到所使用的分组的大小,以生成一系列令牌。对于每个生成的令牌, 应执行2、3步。这将增加需要修改的数据恰好与分组边界对齐的机率