CTF入门_MD5相等

1.题目

一道经典的入门题:

<!DOCTYPE html>
<html>
<head>
    <title>经典题目</title>
    <meta charset="utf-8">
</head>
<body>

</body>
</html>
<?php
error_reporting(0); 
include_once('flag.php'); 
highlight_file('index.php');  

$md51 = md5('QNKCDZO'); 
$a = $_GET['b']; 
$md52 = md5($a); 
if(isset($a)){ 
if ($a != 'QNKCDZO' && $md51 == $md52) { 
    echo $flag; 
} else { 
    echo "false!!!"; 
}} 
?>

2.逐句分析

根据代码,易发现,php标签中有东西,逐句分析一下:

error_reporting(0); 

百度一下发现:

<?php

// 关闭所有PHP错误报告
error_reporting(0);
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// 报告 E_NOTICE也挺好 (报告未初始化的变量
// 或者捕获变量名的错误拼写)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// 除了 E_NOTICE,报告其他所有错误
error_reporting(E_ALL ^ E_NOTICE);
// 报告所有 PHP 错误 (参见 changelog)
error_reporting(E_ALL);
// 报告所有 PHP 错误
error_reporting(-1);
// 和 error_reporting(E_ALL); 一样
ini_set('error_reporting', E_ALL);

?>

所以这句话没什么太大作用,只是关闭所有PHP错误报告。


include_once就是在脚本执行期间包含并运行一次指定文件(flag.php)。

​ highlight_file 就是对index.php文件中的代码进行高亮显示。

都无太大意义。

include_once('flag.php'); 
highlight_file('index.php');

对于重点部分进行分析,

$md51首先接收QNKCDZO的一次MD5加密值。

$a接收b的GET传参,所以应该是要求我们构造参数b

m d 52 接 收 md52接收 md52a也就是参数b的md5值

$md51 = md5('QNKCDZO'); 
$a = $_GET['b']; 
$md52 = md5($a); 


对于条件语句进行分析,

第一个判断,若a!=null则执行。所以b传参就可满足条件

第二个判断,需满足 a ! = ‘ Q N K C D Z O ‘ , 但 是 又 要 求 参 数 b 也 即 a!=`QNKCDZO`,但是又要求参数b也即 a!=QNKCDZOba的md5值相等,即可输出flag变量。

因此尝试先对QNKCDZO进行md5加密:

md5(QNKCDZO,32) = 0e830400451993494058024219903391

因为,考虑到2个md5值很难相等,所以本人在此处卡住了,查阅了一番资料,md5相等及碰撞绕过

所以找个同样是0E开头的传参即可,0e开头MD5值小结,在其中随便选择一个s1885207154a即可

md5(s1885207154a,32) = 0e509367213418206700842008763514

if(isset($a)){ 
if ($a != 'QNKCDZO' && $md51 == $md52) { 
    echo $flag; 
} else { 
    echo "false!!!"; 
}} 

MD5相等的扩展

PHP在处理哈希字符串时,会利用”!=”或”“来对哈希值进行比较,它把每一个以“0E”开头的哈希值都解释为0,如果两个不同的值经过哈希以后,都是0E开头,那么PHP将会认为他们相同。 由于md51为0e830400451993494058024219903391,在比较时,会被认为是0*10^830400451993494058024219903391,也就是0。

//其中有一个双md5很有意思

 md5($a) == md5(md5($b) 

 MD5值 
md5("V5VDSHva7fjyJoJ33IQl") => 0e18bb6e1d5c2e19b63898aeed6b37ea md5("0e18bb6e1************") => 0e0a710a092113dd5ec9dd47d4d7b86f 
实例
CbDLytmyGm2xQyaLNhWn
md5(CbDLytmyGm2xQyaLNhWn) => 0ec20b7c66cafbcc7d8e8481f0653d18
md5(md5(CbDLytmyGm2xQyaLNhWn)) => 0e3a5f2a80db371d4610b8f940d296af
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值