加密算法
- 一、前言知识
- 1、加密解密
- 2、MD5(最常见)
- 3、SHA
- 4、进制
- 5、时间戳
- 6、URL编码
- 7、base64编码
- 8、unescape编码
- 9、AES加密
- 10、DES(类似于base64)
- 二、常见加密形式算法解析
- 三、演示案例
- 1、某 CTF 比赛题目解析
- 2、某 CMS 密码加密解密
- 3、某 URL 加密地址的漏洞测试
- 4、某实际应用 URL 地址参数加密
- 四、涉及资源
一、前言知识
前言:在渗透测试中,常见的密码等敏感信息会采用加密处理,其中作为安全测试人员必须要了解常见的加密方式,才能为后续的安全测试做好准备,本次课程将讲解各种加密编码等知识,便于后期的学习和发展。
1、加密解密
加密软件
解密软件
https://www.cmd5.com/
#常见加密编码等算法解析
MD5,SHA,ASC,进制,时间戳,URL,BASE64,Unescape,AES,DES等
#常见加密形式算法解析
直接加密,带salt,带密码,带偏移,带位数,带模式,带干扰,自定义组合等
#常见解密方式(针对)
枚举,自定义逆向算法,可逆向
#了解常规加密算法的特性
长度位数,字符规律,代码分析,搜索获取等
2、MD5(最常见)
#含义:
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
#分类
十六位/三十二位MD5(密文位数固定不变)
如:数据库密码
#不可逆
不能直接的逆向,网上的解密不是从密文到明文的过程,而是枚举,如123的解密,是举例:1,10,11,12,13…121,122,123来匹配
3、SHA
#含义
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
#密文
为0-9,a-z的数字组合,有四种不同的加密方式对于不同的长度。
4、进制
二进制,十进制,十六进制
5、时间戳
#含义
时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。
#时间戳通常是用在用户的注册、登录、注销等情况
在线转换工具:https://tool.lu/timestamp/
6、URL编码
https://www.cnblogs.com/cxygg/p/9278542.html
序号 | 特殊字符 | 含义 | 十六进制值 |
---|---|---|---|
1. | + | URL 中+号表示空格 | %2B |
2. | 空格 | URL中的空格可以用+号或者编码 | %20 |
3. | / | 分隔目录和子目录 | %2F |
4. | ? | 分隔实际的 URL 和参数 | %3F |
5. | % | 指定特殊字符 | %25 |
6. | # | 表示书签 | %23 |
7. | & | URL 中指定的参数间的分隔符 | %26 |
8. | = | URL 中指定参数的值 | %3D |
- 搜索PHP的网站。
- 加空格1=1。
- 变为%201=1。
- #%20被成为URL编码。
#含义
url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分或者分离地发给服务器。
#空格的转化
#为什么之前的转化只转化空格,没有转化1=1?
注意:二次转码---由于空格的特殊的含义,它会进行转化,而1转化为%31的化网站会以为没有进行转码的明文,会对%31再进行一次转码—-%25%33%31----看见%31可能会涉及二次编码。浏览器之后解密一次,二次编码多在自己关键字的绕过方面涉及
7、base64编码
#含义
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,基于64个可打印字符来表示二进制数据的方法。由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。
#规律
明文有多长,密文相对有多长,0-9,a-z,且区分大小写,经常在密文后面出现等号=
- base64编码的特点:随着编码的文本增加而增加、由大小写和数字组成且字符结尾一般有两个等号。
- 一般在代码中为了安全会使用base64进行编码。
8、unescape编码
JavaScript unescape() 函数可对通过 escape() 编码的字符串进行解码。
unescape(string),该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码
-
和URL编码有点像。
-
特点:一般是%U+四个数字对应着两个字符、主要运用于网站web应用。
- 特点1—以%u开始加上四位的数字。
- 特点2—两个字符进行转换(最后一个除外)。
9、AES加密
#密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。
- aes在逐渐的取代md5值、在解密的过程中一定要知道密码和偏移量不然是解不出来的。
- 在线工具:http://tool.chacuo.net/cryptaes
- 举例:明文123456,密码admin,拼接后加密,偏移量不是开始到结尾,而是从一个部分进行加密 。
- 将加密的用base64解密—解密为乱码多半为aes加密—有时会出现斜杠。
10、DES(类似于base64)
des对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法,用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。
这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。
- 特点:明文的长度和密文成正比,有时会出现加号。
- 网页加密,工具解密—出现乱码(why?–不同平台参数不同,用同一平台)。
二、常见加密形式算法解析
1. 直接加密----md5,sha,进制,时间戳,base64,unescape(除ase,des外)
2. 带 salt---aes
3. 带密码---aes,des
4. 带偏移---aes
5. 带位数,
6. 带模式,
7. 带干扰,
8. 自定义组合。
常见解密方式(针对)
1. 枚举,
2. 自定义逆向算法,
3. 可逆向。
了解常规加密算法的特性
1. 长度位数,
2. 字符规律,
3. 代码分析,
4. 搜索获取等,
三、演示案例
1、某 CTF 比赛题目解析
脚本自定义算法组合逆向
给了一串密文。
fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=
下载文件。
解压出来得到一个index.txt的文件。
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x]; //把key里面的第一个字符拼接到char里面
$x+=1; //x执行一次循环加一次1 有多少个字符串加多少次
print_r("88:",$key[$x]);
}
echo $char."<br>";
//传入有多少个字符串就取前多少个cmd5字符串赋值给char
for ($i=0; $i < $len; $i++) {
//取第data里面的第i个数据加上char里面的第i个数据 把他们的ord()ASCII值相加取余128
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
print($str);
//base64位加密
return base64_encode($str);
}
#加密涉及 — MD5,ASCII,base64。
#解密 — 先base64,再ASCII,再MD5。
#解密脚本
function jiemi($str1){
echo "初始值:".$str1."<br>";
$str=base64_decode($str1);
$lens=strlen($str);
$j=0;
echo "经过base64解码后:".$str."<br>";
echo "长度:".$lens."<hr>";
$key1 = md5('ISCC');
$key2 = md5('ISCC');
$key=$key1.$key2;
// for($j=0;$j<$lens;$j++){
// //$ord_str=ord($str[i]);
// echo $str[j];
// }
$jie_str="";
for ($i=0; $i<$lens; $i++) {
echo $i;
echo "第一次字符串加密".$str[$i]."<br>";
// @$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
$str1=ord($str[$i]);
echo "经过ord转换成ASCII值:".$str1."<br>";
if($str1<128){
$str1=$str1+128;
}else if($str>128){
$str1=$str+128;
}else if($str>=256){
$str1=256+$str;
}
echo "经过128取余逆向:".$str1."<br>";
$str2=$str1-ord($key[$i]);
echo "减去CMD5附加的值:".$str2.":".$key[$i]."<br>";
$str3=chr($str2);
echo "emm:".$str3."<br>";
$jie_str=$jie_str.$str3;
//$jie_str=$str3;
}
print_r($jie_str);
}
2、某 CMS 密码加密解密
MD5+salt
部分CMS密码加密形式 - wp、dz等
- 登录搭建的discuz论坛的数据库。
- 查看数据库密码—进入数据库,查询sdb_members表的内容。
- 解密查询—普通的MD5无法解密。
- 查找salt。
3、某 URL 加密地址的漏洞测试
- AES+Base64+自定义
- 观察参数值加密字符串,下载源代码分析,函数定义AES加密,涉及模式CBC,128位,加密密码,偏移量,两次base64减去常规一次,填充模式。(mozhe)
- 点击访问。
- 铸剑扫描 — aes加密涉及—密码,偏移量(从网站文件中寻找)。
- 扫到一个地址。
- 打开URL。
-
下载相关文件 — 为解密过程,因为网站的URL编码加密了,脚本将URL解密,因此是解密过程。
=>list.php
-
结合aes分析结果 — 加密模式cbc,数据块128位。
- 初始化加密的缓冲区 — mcrypt_generic_init函数的参数 — 描述符,密码,偏移量。
- 两次Base64解密 — aes以base64输出,因此还需要再解密一次。
- 观察参数值加密字符串 — 前面是密文,后面是明文,无法进行注入 — 要将前面解密才能进行注入。
-
解密密文— ZUlJOGMzSmVMMHQwZHhNN3diM056Zz09。
- base64解密。
- 网络解密平台解密。
-
再次分析代码—过滤,密码错就跳转主页,对就返回1,将_mozhe过滤—因此注入为: 1 and 1=1_mozhe。
-
修改注入,再进行加密。
4、某实际应用 URL 地址参数加密
搜索特定关键字加密字符串
- 搜素特定关键字加密字符串—搜索id=MQ==的网站。
- 解密为 — id=1的网站。
- 要注入的思路 ---- 注入的语句也应该加密:解密 - 注入 - 加密(由于加密工具扫不了)。
四、涉及资源
墨者学院:https://www.mozhe.cn
md5解密:https://www.cmd5.com
ASE加解密:http://tool.chacuo.net/cryptaes
Bufku:https://ctf.bugku.com/challenges
超级加解密转换工具V2.1 绿色免费版:https://www.cr173.com/soft/21692.html
DiscuzX:https://gitee.com/ComsenzDiscuz/DiscuzX