0%

第11天-算法解密&散列对称非对称&字典碰撞&前后端逆向&MD5&AES&DES&RSA

安全测试中:

密文-有源码直接看源码分析算法(后端必须要有源码才能彻底知道)

密文-没有源码1、猜识别 2、看前端JS(加密逻辑是不是在前端)——后期JS逆向会讲

#算法加密-概念&分类&类型

1. 单向散列加密(就是不可逆) -MD5

单向散列加密算法的优点有(MD5为例)

方便存储,损耗低:加密/加密对于性能的损耗微乎其微。

单向散列加密的缺点就是存在暴力破解的可能性,最好通过加盐值的方式提高安全性,此外可能存在散列冲突。我们都知道MD5加密也是可以破解的。

常见的单向散列加密算法有:

MD5 SHA MAC CRC

解密条件:密文即可,采用碰撞解密,几率看明文复杂程度

2. 对称加密 -AES

对称加密优点是算法公开、计算量小、加密速度快、加密效率高。

缺点是发送方和接收方必须商定好密钥,然后使双方都能保存好密钥,密钥管理成为双方的负担。

常见的对称加密算法有:

DES AES RC4

解密条件:密文及密钥偏移量,采用逆向算法解密,条件成立即可解密成功

3. 非对称加密 -RSA

非对称加密的优点是与对称加密相比,安全性更好,加解密需要不同的密钥,公钥和私钥都可进行相互的加解密。

缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

常见的非对称加密算法:

RSA RSA2 PKCS

解密条件:密文和公钥或私钥,采用逆向算法解密,条件成立即可解密成功

#加密解密-识别特征&解密条件

MD5密文特点:

1、由数字“0-9”和字母“a-f”所组成的字符串

2、固定的位数 1632

解密需求:密文即可,但复杂明文可能解不出

BASE64编码特点:

0、大小写区分,通过数字和字母的组合

1、一般情况下密文尾部都会有两个等号,明文很少的时候则没有

2、明文越长密文越长,一般不会出现“/“”+””=”在密文中

AESDES密文特点:

BASE64基本类似,但一般会出现“/““+”在密文中

解密需求:密文,模式,加密Key,偏移量,条件满足才可解出

RSA密文特点:

特征同AES,DES相似,但是长度较长

解密需求:密文,公钥或私钥即可解出

其他密文特点见:

1.30余种加密编码类型的密文特征分析(建议收藏)

https://mp.weixin.qq.com/s?__biz=MzAwNDcxMjI2MA==&mid=2247484455&idx=1&sn=e1b4324ddcf7d6123be30d9a5613e17b&chksm=9b26f60cac517f1a920cf3b73b3212a645aeef78882c47957b9f3c2135cb7ce051c73fe77bb2&mpshare=1&scene=23&srcid=1111auAYWmr1N0NAs9Wp2hGz&sharer_sharetime=1605145141579&sharer_shareid=5051b3eddbbe2cb698aedf9452370026#rd

2.CTF中常见密码题解密网站总结(建议收藏)

https://blog.csdn.net/qq_41638851/article/details/100526839

3.CTF密码学常见加密解密总结(建议收藏)

https://blog.csdn.net/qq_40837276/article/details/83080460

1、密码存储(后端处理)

md5&salt

案例一:

加密核心代码:

functionadd_user(){

$password=md5(md5($password).$salt);//加密核心:先把密码md5加密,之后加salt值在md5加密一次

}

简单的一个解密代码:

<?PHP

$h='d7192407bb4bfc83d28f374b6812fbcd';//这个是目标密文,我们向要把它还原成明

$hash=md5(md5('123456').'3946d5');//这个就是明文加密的过程,其中明文我们不知道,所以明文部分(就是123456那个部分)扔一个字典进去跑,跑出来内容和$h相同自然就是成功(下面if判断含义)

if($h==$hash){

echo'ok';

}else{

echo'no';

}

?>

这个就是上面代码的升级版,把明文部分换成文件内容,自动去读取文件内容然后去一一碰撞

<?php

functionreverse_md5_hash_with_salt($final_hash,$salt,$dictionary_file){

// 打开字典文件

$file=fopen($dictionary_file,"r");

if(!$file){

die("无法打开字典文件!");

}

// 遍历字典文件中的每一行(即每一个密码)

while(($password=fgets($file))!==false){

// 去除密码两侧的空白字符(包括换行符)

$password=trim($password);

// 第一次 MD5 加密密码

$md5_hash=md5($password);

// 拼接 md5($password) 和 salt

$salted_hash=$md5_hash.$salt;

// 第二次 MD5 加密

$final_attempt=md5($salted_hash);

// 检查是否匹配

if($final_attempt===$final_hash){

fclose($file);

return$password;// 找到匹配的密码

}

}

// 如果没有找到匹配的密码

fclose($file);

returnnull;

}

// 给定的目标加密值和盐值

$final_hash="125648dbf16531ab7e6b2f8ec8003ea7";// 目标 MD5 值

$salt="3e3790";// 盐值

// 字典文件路径

$dictionary_file="weaksauce.txt";// 字典文件路径

// 调用函数进行密码破解

$password=reverse_md5_hash_with_salt($final_hash,$salt,$dictionary_file);

// 输出结果

if($password){

echo"破解成功,密码是: $password";

}else{

echo"密码破解失败";

}

?>

#案例2:

加密核心代码

functionadd_user(){

$salt='';

$password=$this->generate_password($password);

}

functiongenerate_password($password){

$algo=$this->get_passwordalgo();

$options=$this->get_passwordoptions();

$hash=password_hash($password,$algo,$options);

}

简单的一个解密代码(和案例一类似):

<?PHP

$hash='$2y$10$KA.7VYVheqod8F3X65tWjO3ZXfozNA2fC4oIZoDSu/TbfgKmiw7xO';

if(password_verify('123456',$hash)){

echo'ok';

}else{

echo'error';

}

?>

这个就是上面代码的升级版,把明文部分换成文件内容,自动去读取文件内容然后去一一碰撞

<?PHP

$hash='$2y$10$PDACNCRyZzcsknF8zvL4yu7YHIPQTN8F635PxQeXSB8QxxDZSXrd.';

$dictionary_file="weaksauce.txt";

$file=fopen($dictionary_file,"r");

if(!$file){

die("无法打开字典文件!");

}

// 遍历字典文件中的每一行(即每一个密码)

while(($password=fgets($file))!==false){

// 去除密码两侧的空白字符(包括换行符)

$password=trim($password);

echo$password."<br>";

if(password_verify($password,$hash)){

echo'ok';

}else{

echo'error';

}

}

?>

2、数据通讯

博客登录-zblog(前端处理)

前端js加密:md5.js

<script src="script/md5.js" type="text/javascript"></script>

$("#btnPost").click(function(){

var strPassWord=$("#edtPassWord").val();

$("form").attr("action","cmd.php?act=verify");

$("#password").val(MD5(strPassWord));

console.log(MD5("123456"));

我们在登录的时候密码会被加密,你可以随便输一个然后看包里的密码变成什么记录下来,然后你去控制台md5(密码),对比发现一样就是md5加密,前端加密肯定会加载加密js包,然后代码分析就可以

博客登录-混合加密(前端处理)

functionLogin(){

logindata.UserName =encodeURI(encrypt.encrypt(numMobile));

logindata.Mobile =encodeURI(encrypt.encrypt(numMobile));;

logindata.Password =encodeURI(encrypt.encrypt(numPassword));

}

var encrypt =new JSEncrypt();

encodeURI(encrypt.encrypt(‘13554365566’));

这个案例没找到所以无法复现,这个就是我们登录账号密码都被加密,然后一看就不是常规加密,然后js逆向分析,用登录请求包的url全局搜索一下,看看哪个js包里包含加密算法,然后我们在控制台尝试加密一下,看看是不是和登录包内一样,这里有一个坑:不是所有的都能无脑带到控制台去执行,因为命令有的是,类实例化出来的对象(比如encrypt就是JSEncrypt实例化出来的对象),这个需要在具体场景下去判断。

3、密文

明确以下三种加密算法加解密条件

对称AES/DES加解密(需要知道密钥和偏移量),非对称RSA加解密(需要公钥或者私钥)

解密:http://tool.chacuo.net/cryptdes

应用场景:

1、发送数据的时候自动将数据加密发送(自需加密即可)

安全测试思路:我们需要将我们的Payload也要加密发送过去,这样才符合正常的业务逻辑,所以我们就只需要调用应用的JS加密逻辑进行提交发送测试即可!

2、比如要得到数据的明文(必须要拿到解密算法)

由于各种算法的解密条件不一,密钥,偏移量,私钥等不一定能拿到。

对于后续安全测试影响较大的:

1、目标:API接口 前后端分离应用居多

2、漏洞发现:未授权 各类漏洞测试 爆破等

3、其他