接下来,讲的内容可能会涉及到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("输入有误!");
}
});
});