前言
前端的数据加密是对用户的输入的一个常见的加密方法 还有的就是防止我们的sql注入 如 id=MQ== 这个其实解密出来就是 id = 1 所以注入的思路就是 把 1和payload 一起加密然后 再进行注入
客户端的加密 => 数据加密传输 => 服务端解密 => 服务端的处理
传输的数据
1 加密 xxx payload xxx payload 解密 (解码不出来只能 把payload 进行加密 才能进行执行) 1
直接进行注入
这样就可以进行注入了 后端解密出来还是 我们相应的代码
CryptoJS库加密
<script src="./crypto.js">
//引入加密库
//使用库内函数进行加密
</script>
// base64加密
<script>
var str = "xiaodisec";
var base64 = btoa(str); //btoa是原生态的
console.log(base64);
</script>
//MD5加密
var md5str=CryptoJS.MD5(base64str).toString();
console.log(md5str);
//SHA1加密
var shastr = CryptoJS.SHA1(str).toString(); // 注意:1是数字1
console.log(shastr)
//HMAC加密
var key = 'key';
var hash = CryptoJS.HmacSHA256(key, str);
var HMACstr = CryptoJS.enc.Hex.stringify(hash);
console.log(HMACstr);
// 使用AES进行加密 //模式是ECB的时候是不需要key的
var aseKey = "aeskey" // 定制秘钥,长度必须为:8/16/32位, 长度不一致也没问题
// 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
var aesstr = CryptoJS.AES.encrypt(str, CryptoJS.enc.Utf8.parse(aseKey), // 参数1=密钥, 参数2=加密内容
{
mode: CryptoJS.mode.ECB,// 为AES的工作方式
padding: CryptoJS.pad.Pkcs7 // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符
}
).toString(); // toString=转字符串类型
console.log(aesstr); // 在弹窗中打印字符串
// 使用DES进行加密
var deskey = "deskey" // 定制秘钥,长度必须为:8/16/32位, 长度不一致也没问题
// 需要加密的内容
// 加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
var desstr = CryptoJS.DES.encrypt(str, CryptoJS.enc.Utf8.parse(deskey), // 参数1=密钥, 参数2=加密内容
{
mode: CryptoJS.mode.ECB, // 为DES的工作方式
padding: CryptoJS.pad.Pkcs7 // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符
}
).toString(); // toString=转字符串类型
console.log(desstr); // 控制台打印 CDVNwmEwDRM
RSA加密 需要重新导入一个库
//RSA 加密 这个需要公钥和私钥
var PUBLIC_KEY = "";
var PRIVATE_KEY = "";
//公钥加密
var encrypt = new JSEncrypt(); //实例化加密对象
encrypt.setPublicKey(PUBLIC_KEY); //设置公钥
var encrypted = encrypt.encrypt(str); //对指定数据进行加密
console.log(encrypted);
//私钥解密
var decrypt = new JSEncrypt(); // 创建解密对象
decrypt.setPrivateKey(PRIVATE_KEY); //设置私钥
var uncrypted = decrypt.decrypt(encrypted); //解密 'xiaodisec'
console.log(uncrypted);
好用的解密网站 : 在线AES加密解密、AES在线加密解密、AES encryption and decryption--查错网
黑盒情况下寻找web的加密算法
第一个演示是自己写的这个
思路 : 找到前端的加密逻辑然后 再截取加密的方法 使用前端的加密方法进行加密 这个就是和他相同的逻辑
前端就是一个登录页面
<script src="https://unpkg.com/axios/dist/axios.min.js "></script>
<script src="crypto-js.js"></script>
<script>
$('button').click(function() {
var str = $('#password').val();
var key = "aeskey";
var aesstr = CryptoJS.AES.encrypt(str, CryptoJS.enc.Utf8.parse(key), // 参数1=密钥, 参数2=加密内容
{
mode: CryptoJS.mode.ECB, // 为AES的工作方式
padding: CryptoJS.pad.Pkcs7 // 当加密后密文长度达不到指定整数倍(8个字节、16个字节)则填充对应字符
}
).toString();
axios({
method: "POST ",
url: "login.php ",
data: {
user: $('#user').val(),
password: aesstr
}
}).success(function(res) {
// console.log("登录成功 ");
if (res['infocode'] == 1) {
alert("登录成功 ");
Location("houtai.html")
}
})
}); // 点击按钮触发事件
</script>
这个时候我们如果想要进行弱口令爆破 就得找到加密逻辑
先找到加密逻辑的路径 : 当前的路径 就是 login.html
找到加密逻辑 复制一下
把空格删除掉sec 加密:lGqGMg7PmMYqT/aQHPI0gg==
怎么找key 就看前端有没有泄露