密码那些事

之前在工作中经常用密钥,但是不知道其中的原因,现在闲下来就来看下,再看的过程发现这个随机数概念很模糊,于是就查了下,现总结如下:

 0x01 随机数

  概述

  随机数在计算机应用中使用的比较广泛,最为熟知的便是在密码学中的应用。本文主要是讲解随机数使用导致的一些Web安全风。

  我们先简单了解一下随机数

  分类

  随机数分为真随机数和伪随机数,我们程序使用的基本都是伪随机数,其中伪随机又分为强伪随机数和弱伪随机数。

  真随机数,通过物理实验得出,比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等

  伪随机数,通过一定算法和种子得出。软件实现的是伪随机数

  强伪随机数,难以预测的随机数

  弱伪随机数,易于预测的随机数

  特性

  随机数有3个特性,具体如下:

  随机性:不存在统计学偏差,是完全杂乱的数列

  不可预测性:不能从过去的数列推测出下一个出现的数

  不可重现性:除非将数列本身保存下来,否则不能重现相同的数列

  随机数的特性和随机数的分类有一定的关系,比如,弱伪随机数只需要满足随机性即可,而强位随机数需要满足随机性和不可预测性,真随机数则需要同时满足3个特性。

  引发安全问题的关键点在于不可预测性。

  伪随机数的生成

  我们平常软件和应用实现的都是伪随机数,所以本文的重点也就是伪随机数。

  伪随机数的生成实现一般是算法+种子。

  具体的伪随机数生成器PRNG一般有:

  线性同余法

  单向散列函数法

  密码法

  ANSI X9.17

  比较常用的一般是线性同余法,比如我们熟知的C语言的rand库和Java的java.util.Random类,都采用了线性同余法生成随机数。

  应用场景

  随机数的应用场景比较广泛,以下是随机数常见的应用场景:

  验证码生成

  抽奖活动

  UUID生成

  SessionID生成

  Token生成

  CSRF Token

  找回密码Token

(随机元素的生成)

  洗牌

  俄罗斯方块出现特定形状的序列

  游戏爆装备

  密码应用场景

  生成密钥:对称密码,消息认证

  生成密钥对:公钥密码,数字签名

  生成IV: 用于分组密码的CBC,CFB和OFB模式

  生成nonce: 用于防御重放攻击; 分组密码的CTR模式

  生成盐:用于基于口令的密码PBE等

  0x02 随机数的安全性

  相比其他密码技术,随机数很少受到关注,但随机数在密码技术和计算机应用中是非常重要的,不正确的使用随机数会导致一系列的安全问题。

  随机数的安全风险

  随机数导致的安全问题一般有两种

  应该使用随机数,开发者并没有使用随机数;

  应该使用强伪随机数,开发者使用了弱伪随机数。

  第一种情况,简单来讲,就是我们需要一个随机数,但是开发者没有使用随机数,而是指定了一个常量。当然,很多人会义愤填膺的说,sb才会不用随机数。但是,请不要忽略我朝还是有很多的。主要有两个场景:

  开发者缺乏基础常识不知道要用随机数;

  一些应用场景和框架,接口文档不完善或者开发者没有仔细阅读等原因。

  比如找回密码的token,需要一个伪随机数,很多业务直接根据用户名生成token;

比如OAuth2.0中需要第三方传递一个state参数作为CSRF Token防止CSRF攻击,很多开发者根本不使用这个参数,或者是传入一个固定的值。由于认证方无法对这个值进行业务层面有效性的校验,导致了OAuth的CSRF攻击。

  第二种情况,主要区别就在于伪随机数的强弱了,大部分(所有?)语言的API文档中的基础库(常用库)中的random库都是弱伪随机,很多开发自然就直接使用。但是,最重要也最致命的是,弱伪随机数是不能用于密码技术的。

  还是第一种情况中的找回密码场景,关于token的生成, 很多开发使用了时间戳作为随机数(md5(时间戳),md5(时间戳+用户名)),但是由于时间戳是可以预测的,很容易就被猜解。不可预测性是区分弱伪随机数和强伪随机数的关键指标。

  当然,除了以上两种情况,还有一些比较特别的情况,通常情况下比较少见,但是也不排除:

  种子的泄露,算法很多时候是公开的,如果种子泄露了,相当于随机数已经泄露了;

  随机数池不足。这个严格来说也属于弱伪随机数,因为随机数池不足其实也导致了随机数是可预测的,攻击者可以直接暴力破解。

  漏洞实例

  wooyun上有很多漏洞,还蛮有意思的,都是和随机数有关的。

  PS:个人实力有限,以下实例基本都来自wooyun漏洞实例,在这里谢谢各位大牛,如有侵权,请联系删除。

  1.应该使用随机数而未使用随机数

  Oauth2.0的这个问题特别经典,除了wooyun实例列出来的,其实很多厂商都有这个问题。

  Oauth2.0中state参数要求第三方应用的开发者传入一个CSRF Token(随机数),如果没有传入或者传入的不是随机数,会导致CSRF登陆任意帐号:

  唯品会账号相关漏洞可通过csrf登录任意账号

人人网-百度OAuth 2.0 redirect_uir CSRF 漏洞

  2.使用弱伪随机数

  1) 密码取回

很多密码找回的场景,会发送给用户邮件一个url,中间包含一个token,这个token如果猜测,那么就可以找回其他用户的密码。

1.Shopex 4.8.5密码取回处新生成密码可预测漏洞

  直接使用了时间函数microtime()作为随机数,然后获取MD5的前6位。

  1. substr(md5(print_r(microtime(),true)),0,6);

PHP 中microtime()的值除了当前服务器的秒数外,还有微秒数,微妙数的变化范围在0.000000 -- 0.999999 之间,一般来说,服务器的时间可以通过HTTP返回头的DATE字段来获取,因此我们只需要遍历这1000000可能值即可。但我们要使用暴力破解的方式发起1000000次请求的话,网络请求数也会非常之大。可是shopex非常贴心的在生成密码前再次将microtime() 输出了一次:

1. $messenger = &$this->system->loadModel('system/messenger');echo microtime()."

";

  2.奇虎360任意用户密码修改

直接是MD5(unix时间戳)

  3.涂鸦王国弱随机数导致任意用户劫持漏洞,附测试POC

  关于找回密码随机数的问题强烈建议大家参考拓哥的11年的文章《利用系统时间可预测破解java随机数| 空虚浪子心的灵魂》

  2) 其他随机数验证场景

  CmsEasy最新版暴力注入(加解密缺陷/绕过防注入)

  弱伪随机数被绕过

  Espcms v5.6 暴力注入

  Espcms中一处SQL注入漏洞的利用,利用时发现espcms对传值有加密并且随机key,但是这是一个随机数池固定的弱伪随机数,可以被攻击者遍历绕过

DestoonB2B 2014-05-21最新版绕过全局防御暴力注入(官方Demo可重现)

  使用了microtime()作为随机数,可以被预测暴力破解

Android 4.4之前版本的Java加密架构(JCA)中使用的Apache Harmony 6.0M3及其之前版本的SecureRandom实现存在安全漏洞,具体位于classlib/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/SHA1PRNG_SecureRandomImpl.java

  类的engineNextBytes函数里,当用户没有提供用于产生随机数的种子时,程序不能正确调整偏移量,导致PRNG生成随机序列的过程可被预测。

  Android SecureRandom漏洞详解

  安全建议

  上面讲的随机数基础和漏洞实例更偏重是给攻击者一些思路,这里更多的是一些防御和预防的建议。

  业务场景需要使用随机数,一定要使用随机数,比如Token的生成;

  随机数要足够长,避免暴力破解;

  保证不同用处的随机数使用不同的种子

  对安全性要求高的随机数(如密码技术相关)禁止使用的弱伪随机数:

  不要使用时间函数作为随机数(很多程序员喜欢用时间戳) Java:system.currenttimemillis() php:microtime()

  不要使用弱伪随机数生成器 Java: java.util.Random PHP: rand() 范围很小,32767 PHP: mt_rand() 存在缺陷

强伪随机数CSPRNG(安全可靠的伪随机数生成器(CryptographicallySecure Pseudo-Random Number Generator)的各种参考

  6.强伪随机数生成(不建议开发自己实现)

  产生高强度的随机数,有两个重要的因素:种子和算法。算法是可以有很多的,通常如何选择种子是非常关键的因素。 如Random,它的种子是System.currentTimeMillis(),所以它的随机数都是可预测的, 是弱伪随机数。

  强伪随机数的生成思路:收集计算机的各种,键盘输入时间,内存使用状态,硬盘空闲空间,IO延时,进程数量,线程数量等信息,CPU时钟,来得到一个近似随机的种子,主要是达到不可预测性。

暂时先写到这里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343