接下來,講的內容可能會涉及到JS,沒有Js基礎的萌新,建議前往w3cschool學習一下基本語法,有些函數標準較舊的,可以前往火狐的MDN開發者網絡學習
隨機數說明:
隨機數在計算機應用中使用的比較廣泛,最為熟知的便是在密碼學中的應用。本文主要是講解隨機數使用導致的一些Web安全風。
我們先簡單了解一下隨機數
- 分類
隨機數分為真隨機數和偽隨機數,我們程序使用的基本都是偽隨機數
偽隨機又分為強偽隨機數和弱偽隨機數。
真隨機數,通過物理實驗得出,比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等
偽隨機數,通過一定算法和種子得出。軟件實現的是偽隨機數
強偽隨機數,難以預測的隨機數
弱偽隨機數,易于預測的隨機數
應用場景(ps:隨機數的應用場景比較廣泛,以下是隨機數常見的應用場景):
- 驗證碼生成
- 抽獎活動
- UUID生成
- SessionID生成
- Token生成
- CSRF Token
- 找回密碼Token
- 游戲(隨機元素的生成)
- 洗牌
- 俄羅斯方塊出現特定形狀的序列
- 游戲爆裝備
- 密碼應用場景
- 生成密鑰:對稱密碼,消息認證
- 生成密鑰對:公鑰密碼,數字簽名
- 生成IV: 用于分組密碼的CBC,CFB和OFB模式
- 生成nonce: 用于防御重放攻擊; 分組密碼的CTR模式
- 生成鹽:用于基于口令的密碼PBE等
場景:驗證碼生成出口
這題似乎看起來像是輸入Result值,但萌新千萬不要被誤導了哦~
仔細實驗的朋友會發現,最多只能輸入一個值,這是因為input輸入框的標簽
值maxlength被限制為1,這就尷尬了。既然要求我們輸入隨機數,同時限制給定的長度。
Next,F12切換到sources視圖,我們找到找到動態生成驗證碼的JS文件(ps:沒有JS基礎的萌新,建議需要補一下,下面所講解的知識使用的是JS的一個名為jquery的庫。同時在個人看來作為當今時下實用性較強的一門腳本語言應當至少掌握基本語法,出口W3cschool~)
Js色彩預演~與本章節無關,有興趣的萌新可以看下當做Js語法了解
我們發現Js當中有諸如
0x1000000 << 0.toString(16)
這樣的位運算
For example,讓我們先來舉個左移運算符的例子
<< (左移)
該操作符會將第一個操作數向左移動指定的位數。向左被移出的位被丟棄,右側用 0 補充。
9 (base 10): 00000000000000000000000000001001 (base 2)
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)
0x1000000<<0(base 10):1000000000000000000000000(base 2) = 16777216
Syntax
number.toString(radix)
Parameter???Values
radix???可選的。用于表示數值的基數。必須是2到36之間的整數。
?????2 - 數字將顯示為2進制值
?????8 - 數字將顯示為8進制值
?????16 -數字將顯示為16進制值
色彩十六進制編碼:
我們將進入Adobe Color CC挑選一種喜歡的顏色,以我最喜愛的亮藍色(256BFF)為例:顏色編碼#256BFF
解析CodeJs編寫思路:顏色編寫部分
- 設定一個全局變量code=9999
- 使用左移運算符,將生成的隨機數乘于0x1000000向左偏移0個單位,并將所得轉換為16進制字符串,并在字符串前方加上
'00000'
前綴 - 得到隨機生成的兩種顏色ranColor1和ranColor2之后,清除前一次生成的驗證碼css樣式,覆蓋新樣式。
- code記錄生成兩個隨機數
num1
與num2
的值 - **將
num1
與num2
通過jq的html方法傳遞到前臺頁面 - 指定ranColor和ranColor2分別為驗證碼背景顏色和數字顏色
- 利用Jquery on方法,當用戶點擊觸發click事件時,調用函數codes()
code.js Color
$(function() {
var code = 9999;
function codes(){
var ranColor = '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
//隨機生成顏色
// alert(ranColor)
var ranColor2 = '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);
var num1 = Math.floor(Math.random() * 100);
var num2 = Math.floor(Math.random() * 100);
code = num1 + num2;
$("#code").html(num1 + "+" + num2 + "=?");
if ($("#code").hasClass("nocode")) {
$("#code").removeClass("nocode");
$("#code").addClass("code");
}
$("#code").css('background',ranColor);
$("#code").css('color',ranColor2);
}
codes()
$("#code").on('click',codes)
接!下!來 let'us 進入正題
解析CodeJS編寫思路,提交驗證碼部分漏洞生成原因:
- "#check標簽即我們前面提到的輸入框標簽,利用jq的click事件,當輸入值不等于顏色編寫部分的code值,或者不為9999.則彈出
flag{CTF-bugku-0032}
code.js Click
$("#check").click(function(){
if ($(".input").val() == code && code != 9999) {
alert("flag{CTF-bugku-0032}");
} else {
alert("輸入有誤!");
}
});
});