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

相关推荐
Xudde.6 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
eastyuxiao7 小时前
如何在不同的机器上运行多个OpenClaw实例?
人工智能·git·架构·github·php
dog2508 小时前
对数的大脑应对指数的世界
开发语言·php
取码网10 小时前
最新在线留言板系统PHP源码
开发语言·php
不写八个11 小时前
PHP教程006:ThinkPHP项目入门
开发语言·php
Freak嵌入式12 小时前
Wiznet以太网模块实现在线动态安装库和自动依赖安装-使用uPyPI包管理平台
开发语言·php
huachaiufo12 小时前
burpsuite代理链实现对google.com 访问
web安全·网络安全
祁白_13 小时前
Bugku:备份是一个好习惯
笔记·学习·web安全·ctf
芙莉莲教你写代码13 小时前
Flutter 框架跨平台鸿蒙开发 - 网络安全学习应用
学习·web安全·flutter·华为·harmonyos
OPHKVPS14 小时前
Metro4Shell攻击进行中:CVE-2025-11953高危漏洞正被用于入侵React Native开发者机器
安全·web安全