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

相关推荐
曲幽2 天前
你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南
python·fastapi·web·graphql·route·cors·rest·strawberry
带刺的坐椅4 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
曲幽8 天前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
曲幽9 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
两个人的幸福10 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo12 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack12 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820713 天前
PHP 扩展——从入门到理解
php
鹏仔先生14 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下14 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php