位置: 编程技术 - 正文

深入理解PHP中mt_rand()随机数的安全(php中meta)

编辑:rootadmin

推荐整理分享深入理解PHP中mt_rand()随机数的安全(php中meta),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解php:高级技巧,深入理解php:高级技巧,深入理解php内核pdf,php中meta,php的理解,php中meta,php中的trim,php的理解,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

在前段时间挖了不少跟mt_rand()相关的安全漏洞,基本上都是错误理解随机数用法导致的。这里又要提一下php官网manual的一个坑,看下关于mt_rand()的介绍:中文版^cn 英文版^en,可以看到英文版多了一块黄色的 Caution 警告

很多国内开发者估计都是看的中文版的介绍而在程序中使用了mt_rand()来生成安全令牌、核心加解密key等等导致严重的安全问题。

伪随机数

mt_rand()并不是一个 真·随机数 生成函数,实际上绝大多数编程语言中的随机数函数生成的都都是伪随机数。关于真随机数和伪随机数的区别这里不展开解释,只需要简单了解一点

伪随机是由可确定的函数(常用线性同余),通过一个种子(常用时钟),产生的伪随机数。这意味着:如果知道了种子,或者已经产生的随机数,都可能获得接下来随机数序列的信息(可预测性)。

简单假设一下 mt_rand()内部生成随机数的函数为: rand = seed+(i*) 其中 seed 是随机数种子, i 是第几次调用这个随机数函数。当我们同时知道 i 和 rand 两个值的时候,就能很容易的算出seed的值来。比如 rand= , i=2 代入函数 =seed+(2*) 得到 seed=1 。是不是很简单,当我们拿到seed之后,就能计算出当 i 为任意值时候的 rand 的值了。

PHP的自动播种

从上一节我们已经知道每一次mt_rand()被调用都会根据seed和当前调用的次数i来计算出一个伪随机数。而且seed是自动播种的:

Note: 自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 给随机数发生器播种 ,因为现在是由系统自动完成的。

那么问题就来了,到底系统自动完成播种是在什么时候,如果每次调用mt_rand()都会自动播种那么破解seed也就没意义了。关于这一点manual并没有给出详细信息。网上找了一圈也没靠谱的答案 只能去翻源码^mtrand了:

可以看到每次调用mt_rand()都会先检查是否已经播种。如果已经播种就直接产生随机数,否则调用php_mt_srand来播种。也就是说每个php cgi进程期间,只有第一次调用mt_rand()会自动播种。接下来都会根据这个第一次播种的种子来生成随机数。而php的几种运行模式中除了CGI(每个请求启动一个cgi进程,请求结束后关闭。每次都要重新读取php.ini 环境变量等导致效率低下,现在用的应该不多了)以外,基本都是一个进程处理完请求之后standby等待下一个,处理多个请求之后才会回收(超时也会回收)。

写个脚本测试一下

测试结果:(windows+phpstudy)

apache 请求

深入理解PHP中mt_rand()随机数的安全(php中meta)

nginx 请求

当然这个测试仅仅确认了apache和nginx一个进程可以处理的请求数,再来验证一下刚才关于自动播种的结论:

通过pid来判断,当新进程开始的时候,随机获取两个页面其中一个的 mt_rand() 的输出:

拿第一个随机数 去爆破种子:

爆破出了3个可能的种子,数量很少 手动一个一个测试:

输出:

前位跟上面脚本获取的一模一样,确认种子就是 。有了种子我们就能计算出任意次数调用mt_rand()生成的随机数了。比如这个脚本我生成了位,最后一位是 如果跑完刚才的脚本之后没访问过站点,那么打开 就能看到相同的 。

所以我们得到结论:

php的自动播种发生在php cgi进程中第一次调用mt_rand()的时候。跟访问的页面无关,只要是同一个进程处理的请求,都会共享同一个最初自动播种的种子。

php_mt_seed

我们已经知道随机数的生成是依赖特定的函数,上面曾经假设为 rand = seed+(i*) 。对于这样一个简单的函数,我们当然可以直接计算(口算)出一个(组)解来,但 mt_rand() 实际使用的函数可是相当复杂且无法逆运算的。有效的破解方法其实是穷举所有的种子并根据种子生成随机数序列再跟已知的随机数序列做比对来验证种子是否正确。php_mt_seed^phpmtseed就是这么一个工具,它的速度非常快,跑完2^位seed也就几分钟。它可以根据单次mt_rand()的输出结果直接爆破出可能的种子(上面有示例),当然也可以爆破类似mt_rand(1,)这样限定了MIN MAX输出的种子(下面实例中有用到)。

安全问题

说了这么多,那到底随机数怎么不安全了呢?其实函数本身没有问题,官方也明确提示了生成的随机数不应用于安全加密用途(虽然中文版本manual没写)。问题在于开发者并没有意识到这并不是一个 真·随机数 。我们已经知道,通过已知的随机数序列可以爆破出种子。也就是说,只要任意页面中存在输出随机数或者其衍生值(可逆推随机值),那么其他任意页面的随机数将不再是“随机数”。常见的输出随机数的例子比如验证码,随机文件名等等。常见的随机数用于安全验证的比如找回密码校验值,比如加密key等等。一个理想中的攻击场景:

夜深人静,等待apache(nginx)收回所有php进程(确保下次访问会重新播种),访问一次验证码页面,根据验证码字符逆推出随机数,再根据随机数爆破出随机数种子。接着访问找回密码页面,生成的找回密码链接是基于随机数的。我们就可以轻松计算出这个链接,找回管理员的密码…………XXOO

实例

PHPCMS MT_RAND SEED CRACK致authkey泄露 雨牛写的比我好,看他的就够了

Discuz x3.2 authkey泄露 这个其实也差不多。官方已出补丁,有兴趣的可以自己去分析一下。

总结

标签: php中meta

本文链接地址:https://www.jiuchutong.com/biancheng/284187.html 转载请保留说明!

上一篇:PHP实现数据库统计时间戳按天分组输出数据的方法(php数据库语句)

下一篇:利用PHP实现开心消消乐的算法示例(利用php实现开心麻花)

  • 政府征用土地补偿标准2021年
  • 对外投资应由
  • 外地多预交的税款申报时该怎么填写?
  • 未收回的货款是企业资产吗
  • 金蝶利润表没有数据怎么办
  • 结转成本时是否含税
  • 小企业会计准则没有以前年度损益调整科目
  • 怎么查自己是否
  • 事业单位退休职业年金发放多少个月
  • 2021年增值税专用发票红冲发票步骤
  • 旧房转让土地增值税计算案例
  • 单据核销不了
  • 装饰行业可否用石灰代替
  • 记账凭证是不是会计凭证
  • 电子承兑银行承兑
  • 分公司代理人
  • 销售蔬菜水果需要什么证件
  • 电子税务局里的利润表,本月金额是填累计数吗
  • 个人出租场地个人所得税
  • 银行对账单不平衡
  • 专用发票不报销对公司有影响吗
  • 多交的增值税怎么申报
  • win 10动态锁是什么
  • 旅行社代订的住宿费可以抵扣吗
  • 权益法投资收益在年末确认
  • Win11 Build 22449.1000 预览版发布(附更新修复已知问题汇总)
  • 君子兰的养殖方法
  • php web3
  • 增值税防伪税控系统
  • 补收入的会计分录
  • php进程太多
  • 全盘会计和总账会计一样吗
  • php接口技术
  • 27岁零基础转行做网络工程师
  • 热闻丨ChatGPT会替代你我吗?让它写了封情书后,我得到答案
  • opencv图像处理入门与实践pdf
  • 差旅费津贴与差旅费补助
  • 小微企业增值税免税政策2023年
  • 出差的车费计入什么科目
  • 营改增后还有企业所得税吗?
  • 暂估入库有风险吗
  • js逻辑表达式
  • 借贷记账法的记账规则是
  • 发票专用章刻制
  • 对于企业处理废水的建议
  • 税前列支的项目
  • 分公司注销怎么起诉公司
  • 外贸出口企业的收入交增值税吗
  • 审计助理是干啥的
  • 餐费计入哪个科目合理避税
  • 企业间拆借资金要交印花税吗
  • 员工的交通费发票可以报销嘛
  • 当月发生业务下月开票如何做账
  • 资产减值损失为正数代表什么意思
  • 代扣和代缴的区别
  • ca证书费用计入什么科目
  • 应付利润科目
  • 请演员的费用账务处理
  • 自建厂房的进项税额抵扣
  • sql入门课程
  • 如何禁用windows defender service
  • win10系统怎么连接蓝牙
  • ubuntu20桌面
  • mac怎么卸载苹果系统
  • win10通过任务管理器打开设置
  • linux系统怎么启动软件
  • win7系统迁移到另一磁盘
  • 深入理解rcu
  • cocos-creator
  • 用来检测程序小错误的测试方法
  • onSaveInstanceState和onRestoreInstanceState触发的时机
  • 浅谈如何实现乡村振兴论文
  • 个人所得税app查不到工资记录
  • 个人所得税子女教育到多大结束
  • 广东省电子税务局官网登录入口
  • 出口退税企业分类管理等级
  • 个人所得税税前扣除是什么意思
  • 上海市黄浦区有什么路
  • 国税总局编制这次怎么调整
  • 广西定额发票查询入口官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设