聊一聊随机数安全那些事儿
0x00 简介
和朋友聊到一个比较有意思的现象,在最近两年的校招面试中,大部分同学连一点基础的密码学知识都没有, 即便是有一些渗透功底的同学。
所以这里想和大家聊一些简单的密码学基础知识,不涉及算法实现,更多的是和常见的漏洞场景联系起来,让问题更容易理解,有点抛砖引玉的意思。
本文主要聊一下随机数,随机数其实是非常广泛的,可以说也是密码技术的基础。
对随机数的使用不当很可能会导致一些比较严重的安全问题, 并且这些安全问题通常会比较隐蔽。
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位。
- substr(md5(print_r(microtime(),true)),0,6);
PHP 中microtime()的值除了当前服务器的秒数外,还有微秒数,微妙数的变化范围在0.000000 -- 0.999999 之间,一般来说,服务器的时间可以通过HTTP返回头的DATE字段来获取,因此我们只需要遍历这1000000可能值即可。但我们要使用暴力破解的方式发起1000000次网络请求的话,网络请求数也会非常之大。可是shopex非常贴心的在生成密码前再次将microtime() 输出了一次:
- $messenger = &$this->system->loadModel('system/messenger');echo microtime()."<br/>";
2.奇虎360任意用户密码修改
直接是MD5(unix时间戳)
3.涂鸦王国弱随机数导致任意用户劫持漏洞,附测试POC
关于找回密码随机数的问题强烈建议大家参考拓哥的11年的文章《利用系统时间可预测破解java随机数| 空虚浪子心的灵魂》
2) 其他随机数验证场景
CmsEasy最新版暴力注入(加解密缺陷/绕过防注入)
弱伪随机数被绕过
Espcms v5.6 暴力注入
Espcms中一处SQL注入漏洞的利用,利用时发现espcms对传值有加密并且随机key,但是这是一个随机数池固定的弱伪随机数,可以被攻击者遍历绕过
Destoon B2B 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(安全可靠的伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator)的各种参考
6.强伪随机数生成(不建议开发自己实现)
产生高强度的随机数,有两个重要的因素:种子和算法。算法是可以有很多的,通常如何选择种子是非常关键的因素。 如Random,它的种子是System.currentTimeMillis(),所以它的随机数都是可预测的, 是弱伪随机数。
强伪随机数的生成思路:收集计算机的各种信息,键盘输入时间,内存使用状态,硬盘空闲空间,IO延时,进程数量,线程数量等信息,CPU时钟,来得到一个近似随机的种子,主要是达到不可预测性。
0x03 附
参考资料:
http://www.inbreak.net/archives/349
http://drops.wooyun.org/papers/1066
《白帽子讲Web安全》
《图解密码技术》
作者:iv4n
来源:51CTO
聊一聊随机数安全那些事儿相关推荐
- [聊一聊系列]聊一聊移动调试那些事儿
欢迎大家收看聊一聊系列,这一套系列文章,可以帮助前端工程师们了解前端的方方面面(不仅仅是代码): https://segmentfault.com/blog/frontenddriver 随着移动端的 ...
- 聊一聊回收科技那些事儿
根据数据统计,每年在全球范围内产生约13亿吨的废弃物:到2025年,可能会增加到每年22亿吨:而预计到2050年,这一数量将增加70%.因此废物管理已成为各国密切关注的问题,民众与企业也越来越注重绿色 ...
- 聊一聊I/O那些事儿
在Linux/Unix系统中,对于1次IO读取操作,数据并不会由磁盘/Socket直接拷贝到应用程序的缓存区(用户空间). 数据的流转顺序为: 磁盘/Socket–>内核空间–>用户空间. ...
- 聊一聊网络营销那些事儿
说起网络营销,相信很多朋友都不会陌生了,入门学网络营销推广渠道主要有哪些?初学者知识?2019年互联网的快速发展,让网络推广渠道也越来越丰富,但是对于刚做推广的新手来说,一定还是不知道如何进行,今天网 ...
- [web 安全] php随机数安全问题
and() 和 mt_rand() 产生随机数 srand() 和 mt_srand() 播种随机数种子(seed) 使用: <?php srand(123);//播种随机数种子 for($i= ...
- 000.【Web安全】你所使用的随机数真的安全吗?
文章目录 1.概述 2.名词解释 3.随机数存在的安全风险 3.1 弱伪随机数带来的安全风险 3.2 真随机数真的安全吗 4.随机数 4.1 什么情况下才使用随机数 4.2 伪随机数 4.2.1 弱伪 ...
- pmp每日三题(2022年2月18日)
今日三题答案-BCC 今晚20:00,班班和大家一起直播聊一聊冲刺备考那些事儿,请大家尽量参加,会提前发直播链接出来,直播后也会有回放~ 1.对一个关键项目的要求是产品的持续可追溯性,质量团队建议在制 ...
- 影像篡改与识别(一):胶片时代
现如今,影像篡改伪造已经越来越常见,一些恶意的行为所带来的安全问题也越来越严重,如何有效地鉴别影像真伪成为了一个迫切需要解决的问题.鉴于此,云鼎实验室近年来一直持续在该领域上投入,协助腾讯慧眼产品提升 ...
- 从就业看高考工科志愿填报——芯片行业篇
[行业名称]芯片行业 [行业薪酬评级]五星 [行业前景]朝阳行业 [就业难度]容易 [对口专业]微电子科学与工程.集成电路设计与集成系统.其他电子信息大类相关专业 摘要:俗话说,女怕嫁错郎,人怕入错行 ...
最新文章
- python打开excel进行编辑_使用Python进行Excel文件处理
- tabnavigator_使用TabNavigator在Firefox中享受桌面Alt-Tab样式导航
- 阿里云一键建站产品,阿里云自营建站-中小企业建站首选
- 中国移动MM7 API用户手册(七)
- 中科院,NASA日全食网络直播[多个观测点入口]
- ...is public, should be declared in a file named “ScresourcesApplic.java“---springcloud工作笔记164
- Oracle监听注册和sqlnet,Oracle监听配置(四)--如何实现静态、动态注册
- 通向从容之道——Getting things done读书笔记
- python利器的使用-python开发利器之ulipad的使用实践
- 强大的离线字典《Colordict》+多种词库下载地址
- 老男孩教育33期周末班-决心书
- 性能测试有哪些我们测试员必须要掌握的知识点?
- 【python批量插入图片到一个pdf中】
- JavaScript中Set的使用
- 如涵控股完成私有化交易:赴美上市刚满两年,市值已缩水超七成
- 阿里云域名实名认证操作图文详情 新人必看
- Java web Servlet弹出提示框方法
- Java实现提示音,亲测有效
- 如何设计杀手级的物联网产品或服务?
- [0xFA-2021][Buuctf]Reverse_1
热门文章
- 叶绿体基因组四个区连接位点可视化(IRscope+另一个画图脚本)
- Android app:用Log方法打印调试信息 (Log.v,Log.d,Log.i,Log.w,Log.e)以及修改LogCat的颜色
- thinkpad触控笔怎么用_触控笔的这些技巧,你都get到了吗?
- 织物印花中的常见问题与解决办法
- Echarts利用多X轴实现七天天气预报效果
- 使用java swing制作人机五子棋
- 【蓝桥杯基础题】2020年省赛填空题—既约分数
- 信息爆炸时代,如何获取优质信息?
- 网络领域知产保护难题简析
- MoE 系列(二)|Golang 扩展从 Envoy 接收配置