- PHP特性之CTF中常见的PHP绕过_数组绕过-CSDN博客
- MD5加密漏洞(MD5绕过方式-0e绕过 数组绕过 MD5碰撞 MD5SQL注入)_md5漏洞(2)_md5之后0e开头-CSDN博客
- MD5 绕过第二式:数组绕过_二次加密的md5绕过-CSDN博客
思路起源:
1.对于php强比较和弱比较:md5(),sha1()函数无法处理数组,如果传入的为数组,会返回NULL,两个数组经过加密后得到的都是NULL,也就是相等的。
2、对于某些特殊的字符串加密后得到的密文以0e开头,PHP会当作科学计数法来处理,也就是0的n次方,得到的值比较的时候都相同。
常见的加密后密文以0e开头的字符串:
md5:
240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361
sha1:
10932435112: 0e07766915004133176347055865026311692244
aaroZmOk: 0e66507019969427134894567494305185566735
aaK1STfY: 0e76658526655756207688271159624026011393
aaO8zKZF: 0e89257456677279068558073954252716165668
aa3OFF9m: 0e36977786278517984959260394024281014729
0e1290633704: 0e19985187802402577070739524195726831799
哈希碰撞?
MD5 算法 的 哈希输出空间 相对较小,仅有 128 位(仅能容纳 128 位二进制数据),而 输入空间是无限的,这种 输入与输出的不匹配性 导致了哈希碰撞的 可能性。攻击者可以使用 巧妙构造的输入数据,通过精心选择的 碰撞攻击算法,找到 具有相同哈希值的不同输入。
SHA-1算法也与MD5类似,都是把输入二进制串分成512位的块,把二进制串的位数存储在最后64位,二者之间填充为0,依次对每个块进行一些列高深的数学运算,最后得到一个160位的二进制串。通常表示为40个十六进制数字。
【即僧多肉少,输入大于输出】
常见题目:
要求传入两个参数不相等但是经过md5加密后需要相等



数组绕过
传入两个不同的数组,经md5加密后结果都是null,比较则相等
如:md5_1[]=1&md5_2[]=2
使用特殊字符串绕过【只能进行弱比较,强比较无法进行】
随便选取两个加密后是以0e开头的字符串传入即可

[SWPUCTF 2023 秋季新生赛]一键连接!
题目
连连need
<?php
highlight_file(__FILE__);
error_reporting(0);
$md5_1 = $_GET['md5_1'];
$md5_2 = $_GET['md5_2'];
$sha1_1 = $_GET['sha1_1'];
$sha1_2 = $_GET['sha1_2'];
$new_player =$_GET['new_player'];
if ($md5_1 !== $md5_2 && md5($md5_1) === md5($md5_2)) {
if ($sha1_1 != $sha1_2 && sha1($sha1_1) === sha1($sha1_2)) {
if (file_get_contents($new_player) === "Welcome to NSSCTF!!!") {
echo "Congratulations~~~~~~~~~";
echo "试试need Antsword<br/>";
@eval($_POST['Nss']);
}else{
echo "可曾听过data协议?";
}
} else {
echo "sha1又如何相等呢";
}
} else {
echo "如何让md5值相等呢¿";
}
如何让md5值相等呢¿
尝试与解题
如何满足这个条件:
$md5_1 !== $md5_2 && md5($md5_1) === md5($md5_2)
可以使用数组绕过,即md5_1[]=1&md5_2[]=2
$sha1_1 != $sha1_2 && sha1($sha1_1) === sha1($sha1_2)
可以使用数组绕过,即sha1_1[]=1&sha1_2[]=2
file_get_contents($new_player) === "Welcome to NSSCTF!!!"
强比较类型new_player="Welcome to NSSCTF!!!"【不行】
正解new_player=data://text/plain,Welcome to NSSCTF!!!
@eval($_POST['Nss']);

[SWPUCTF 2024 秋季新生赛]PHP躲猫猫
【php伪协议,弱比较】
题目

尝试与解题
不安全的方式,即get的传参方式

get传参完出现这个,更安全的方式?post


通过post请求,让我们去这个地点,修改url即可

然后页面出现了源代码
vb
`<?php
error_reporting(__FILE__);
highlight_file(__FILE__);
Include('hello.php');
$NSS=$_POST['NSS'];
$ATM=$_GET['CTF'];
$CTF=$_GET['ATM'];
if ($CTF!=$ATM ){
if (is_string($CTF)&&is_string($ATM)){
if (md5($ATM)==md5($CTF)){
include($NSS);//f1ag在/f1ag里面,快通过include拿到它
}else{
echo '诶嘿,但是我就是要让ATM==CTF,不然你就别想拿到f1ag,不服进nss来揍我';
}
}else{
echo '不准无脑用数组,实打实的学才能学得好';
}
}else{
echo 'ATM怎么能是CTF呢';
}
if ($NSS=='I love CTF'){
echo $f1agfile;
}
?> ATM怎么能是CTF呢`
看这个很复杂的样子?
看来需要代码审计
include($NSS);//f1ag在/f1ag里面,快通过include拿到它
include函数包含NSS,说明
通过include($NSS)包含/f1ag,需将$NSS设置为/f1ag(直接包含绝对路径)

md5($ATM)==md5($CTF)
要如何将二者的哈希值相等呢,md5这个弱比较
例:s878926199a s155964671a
?ATM=s878926199a&CTF=s155964671a