md5和sha1常见绕过【详细附新生赛题目】

​​

思路起源:

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值相等呢¿

尝试与解题

如何满足这个条件:

  1. $md5_1 !== $md5_2 && md5($md5_1) === md5($md5_2)

可以使用数组绕过,即md5_1[]=1&md5_2[]=2

  1. $sha1_1 != $sha1_2 && sha1($sha1_1) === sha1($sha1_2)

可以使用数组绕过,即sha1_1[]=1&sha1_2[]=2

  1. file_get_contents($new_player) === "Welcome to NSSCTF!!!"

强比较类型new_player="Welcome to NSSCTF!!!"【不行】

正解new_player=data://text/plain,Welcome to NSSCTF!!!

  1. @eval($_POST['Nss']);

[SWPUCTF 2024 秋季新生赛]PHP躲猫猫

2024年NSSCTF秋季招新赛WP-Web-CSDN博客

【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呢`

看这个很复杂的样子?

看来需要代码审计

  1. include($NSS);//f1ag在/f1ag里面,快通过include拿到它

include函数包含NSS,说明

通过include($NSS)包含/f1ag,需将$NSS设置为/f1ag(直接包含绝对路径)

  1. md5($ATM)==md5($CTF)

要如何将二者的哈希值相等呢,md5这个弱比较

例:s878926199a s155964671a

?ATM=s878926199a&CTF=s155964671a

相关推荐
ShoreKiten4 小时前
第三届SHCTF--EZphp
web安全·php·php反序列化
WJSKad12354 小时前
[特殊字符] SecRoBERTa:网络安全AI新里程碑[特殊字符]️
人工智能·安全·web安全
上海云盾-小余5 小时前
2026 网络安全新威胁:新型 CC 攻击变种识别与企业级防御方案
安全·web安全
上海云盾-高防顾问5 小时前
扫段攻击防御指南:简单几步,守住网络安全防线
网络·安全·web安全
独行soc5 小时前
2026年渗透测试面试题总结-36(题目+回答)
网络·python·安全·web安全·网络安全·渗透测试·安全狮
L***一5 小时前
网络安全专业入门级认证体系分析与路径规划
网络·安全·web安全
观书喜夜长7 小时前
每日一练:攻防世界「easyupload文件上传漏洞」详细解析与防御
学习·web安全·网络安全
白帽黑客-晨哥7 小时前
湖南网安基地的野蛮生长:当网络安全沦为“做题家”比赛,湖南网安基地在尝试另一种可能
web安全·网络安全·渗透测试·漏洞挖掘·漏洞扫描·湖南网安基地
2401_858936887 小时前
深入理解 TCP 并发服务器:从 IO 模型到多路复用实现
服务器·tcp/ip·php