成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊隨機數安全那些事兒

安全 數據安全
本文主要聊一下隨機數,隨機數其實是非常廣泛的,可以說也是密碼技術的基礎。

0x00 簡介

和朋友聊到一個比較有意思的現象,在最近兩年的校招面試中,大部分同學連一點基礎的密碼學知識都沒有, 即便是有一些滲透功底的同學。

所以這里想和大家聊一些簡單的密碼學基礎知識,不涉及算法實現,更多的是和常見的漏洞場景聯系起來,讓問題更容易理解,有點拋磚引玉的意思。

本文主要聊一下隨機數,隨機數其實是非常廣泛的,可以說也是密碼技術的基礎。

對隨機數的使用不當很可能會導致一些比較嚴重的安全問題, 并且這些安全問題通常會比較隱蔽。

0x01 隨機數

概述

隨機數在計算機應用中使用的比較廣泛,最為熟知的便是在密碼學中的應用。本文主要是講解隨機數使用導致的一些Web安全風。

我們先簡單了解一下隨機數

 

[[166980]]

 

 

p3

 

分類

隨機數分為真隨機數和偽隨機數,我們程序使用的基本都是偽隨機數,其中偽隨機又分為強偽隨機數和弱偽隨機數。

真隨機數,通過物理實驗得出,比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等

偽隨機數,通過一定算法和種子得出。軟件實現的是偽隨機數

強偽隨機數,難以預測的隨機數

弱偽隨機數,易于預測的隨機數

特性

隨機數有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次網絡請求的話,網絡請求數也會非常之大??墒莝hopex非常貼心的在生成密碼前再次將microtime() 輸出了一次:

  1. $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安全》

《圖解密碼技術》

責任編輯:藍雨淚 來源: 烏云知識庫
相關推薦

2015-06-08 15:55:03

公有云IaaS

2020-08-12 08:34:16

開發安全We

2019-03-21 11:04:22

安全標準信息

2019-07-01 14:55:44

應用安全web安全滲透測試

2020-01-03 11:04:54

安全測試滲透

2022-07-19 08:01:08

Azure云環境安全

2016-01-15 09:51:27

AngularJS實際應用

2020-02-02 13:59:59

MySQL數據庫線程

2024-10-12 14:40:03

多協議數采盒工業物聯網

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2018-06-07 13:17:12

契約測試單元測試API測試

2020-03-31 10:08:15

零信任安全軟件

2019-02-13 14:15:59

Linux版本Fedora

2020-10-15 06:56:51

MySQL排序

2018-11-29 09:13:47

CPU中斷控制器

2022-11-01 08:46:20

責任鏈模式對象

2021-02-06 08:34:49

函數memoize文檔
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91视频观看 | 中文字幕一区二区三区乱码图片 | 欧美一级片在线观看 | 久久一 | 女同久久另类99精品国产 | 久久蜜桃av一区二区天堂 | 综合网在线 | 色综合视频 | 午夜视频网站 | 一区二区不卡 | 中文字幕在线视频一区二区三区 | a级毛片国产 | 国产精品久久久久999 | 精国产品一区二区三区 | 免费一级欧美在线观看视频 | 亚洲免费高清 | 日韩一级免费电影 | 亚洲成人在线视频播放 | 国产美女黄色 | 亚洲一区二区三区在线播放 | 日韩一区中文字幕 | www.国产一区| aaaa一级毛片| 国产成人精品一区二区三区 | 自拍偷拍精品 | 精品一级电影 | 色婷婷久久久亚洲一区二区三区 | 国产免费福利小视频 | 盗摄精品av一区二区三区 | 一本一道久久a久久精品蜜桃 | 国产精品视频一区二区三区不卡 | 九九亚洲 | 涩涩操 | 久久精品国产99国产 | 中文字幕一区二区三区四区五区 | 懂色中文一区二区在线播放 | 91精品久久久久久久99 | 狠狠干天天干 | 日韩成人免费在线视频 | 中日字幕大片在线播放 | 国产精品一区二 |