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

相关推荐
2401_873479402 小时前
企业安全团队如何配合公安协查?IP查询在电子取证中的技术实践
tcp/ip·安全·网络安全·php
祁白_3 小时前
nmap工具笔记整理
笔记·web安全·测试
L1624763 小时前
Win11 共享→Windows Server 访问故障总结(极简可复用)
开发语言·windows·php
niucloud-admin4 小时前
PHP V6 单商户常见问题——本地phpstudy部署,访问域名/admin 、域名/wap无法自动跳转对应首页问题
php
oscar9995 小时前
在浏览器中使用 OpenCode
web·browser·opencode
隔窗听雨眠6 小时前
MySQL主从延迟根因诊断法
开发语言·php
niucloud-admin7 小时前
PHP V6 单商户常见问题——运行内存太小导致的报错处理
php
nbwenren7 小时前
办公AI实测:Gemini3、GPT-4o、Claude3.5谁更强?
服务器·数据库·php
hopetomorrow8 小时前
学习路之PHP --PHP 常用扩展及作用表
开发语言·学习·php
YaBingSec8 小时前
玄机网络安全靶场:Hadoop YARN ResourceManager 未授权 RCE WP
大数据·数据库·hadoop·redis·笔记·分布式·web安全