一、首先是MD5()函数的作用?

MD5()函数的作用是计算字符串的MD5散列。

返回值:如果成功则返回已计算的 MD5 散列,如果失败则返回 FALSE。

二、PHP == 弱类型比较绕过?

代码:

<?php
highlight_file(__FILE__);
error_reporting(0);
$flag = "flag{H3rmesk1t_is_a_loser}";
$val1 = $_GET['val1'];
$val2 = $_GET['val2'];
if (isset($_GET['val1']) and isset($_GET['val2']))
{if ($_GET['val1'] != $_GET['val2']){if ((md5($_GET['val1']) == md5($_GET['val2'])))echo $flag;elseecho "you can't get flag";}
}
?>//此时如果输入 ver1[]=1&ver2[]=2,返回flag

这里比较的是PHP弱类型,需要绕过MD5()。

方法一:数组绕过

由于MD5不能加密数组,在加密数组的时候会返回NULL,所以我们可以传入两个数组绕过。适用于源码中没有判断变量类型或内容,如果加上了过滤函数就不能使用了。

常见的过滤函数:

ctype_alnum(string $text):bool类型//如果text中所有的字符都是字母或者数字,则返回true,否则false
is_numeric(mixed $ver):bool类型//如果ver是数字或者数字字符串,则返回true,否则返回false

例如:

<?php
highlight_file(_FILE_);
error_reporting(0);
$flag="flag{123456789}";
$ver1=$_GET['ver1'];
$ver2=$_GET['ver2'];
if(isset($_GET['ver1'])and isset($_GET['ver2']))
{if($GET['ver1']!=$_GET['ver2']){if((md5($_GET['ver1'])==md5($_GET['ver2'])) and is_numeric($_GET['ver1']) and is_numeric($_GET['ver2']))echo $flag;//如果加密和ver1和ver2相等且ver1和ver2都是数字或者数字字符串,则..elseecho "you can't get flag";}
}
?>//此时如果输入 ver1[]=1&ver2[]=2,返回you can't get flag

方法二:科学计数法绕过

原理:可以传入两个md5加密后是0e开头的字符串,但这个以0e开头的字符串只能是纯数字,这样php在进行科学计算法的时候会将它转化为0。

<?php
for($a=1;$a<=1000000000;$a++){$md5 = md5($a);if(preg_match('/^0e\d+$/',$md5)){//preg_match函数是进行正则表达式的匹配,成功返回1,否则返回0,前面的参数是要搜索的模式、字符串形式,后面的参数指输入的字符串。echo $a;echo "\n";echo $md5;echo "\n";}
}
?>//加密后是0e开头的数字字符串:
QNKCDZO
240610708
314282422
s878926199a
s155964671a
s214587387a
s214587387a

例如:

<?php
highlight_file(_FILE_);
error_reporting(0);
$flag="flag{123456789}";
$ver1=$_GET['ver1'];
$ver2=$_GET['ver2'];
if(isset($_GET['ver1'])and isset($_GET['ver2']))
{if($GET['ver1']!=$_GET['ver2']){if((md5($_GET['ver1'])==md5($_GET['ver2'])) and ctype_alnum($_GET['ver1']) and ctype_alnum($_GET['ver2']))echo $flag;//如果加密和ver1和ver2相等且ver1和ver2都是数字或者数字字符串,则..elseecho "you can't get flag";}
}
?>//此时如果输入 ver1=240610708&ver2=314282422,返回$flag,此时ver1和ver2加密后都是0e开头

双MD碰撞绕过

md和md5后都是以0e开头的字符串:
CbDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
7r4lGXCH2Ksu2JNT3BYM

三、PHP===强类型比较绕过?

代码:

<?php
highlight_file(_FILE_);
error_reporting(0);
$flag = "flag{122365944454}";
$ver1=$_GET['ver1'];
$ver2=$_GET['ver2'];
if (isset($_GET['ver1']) and isset($_GET['ver2']))
{if ($_GET['ver1'] != $_GET['ver2']){if(md5($_GET['ver1'])===md5($_GET['ver2']))echo $flag;elseecho "you can't get flag";}
}
?>

方法:数组绕过

原理同上、过程同上,可使用。

注:使用md5加密后完全相等的两个字符串绕过,不能用。

这是刚刚同上第二种方法,加密后’oe’开头的字符串,但因为强比较会比较类型和值,因此不能用这个方法来绕过。

当然可以试试加密后类型和值都完全相等的字符串。有篇博客说可以利用fastcoll_v1.0.0.5.exe来生成符合条件的字符串,还没试过,待考察。

链接:https://blog.csdn.net/LYJ20010728/article/details/116779357

四、sql注入类的MD5绕过?

起因:为了信息的安全,在数据库里存放密码的时候都是进行了加密处理的,大多数查询语句在没有进行处理的情况下应该是:

SELECT * FROM admin WHERE username = 'admin' and password = ".md5($password,true)."

原理:ffifdyop经过MD5加密后变为’or’6xxx阿巴阿巴,

而在mysql中,在用作布尔型判断时,以数字开头的字符串会被当成整型,不过由于是字符串,因此后面必须要有单引号括起来的,比如:‘xxx’or’6xxxxxx’,就相当于’xxx’or 6,就相当于 'xxx’or true,所以返回值是true。

因此查询时就变成了:

sql代码:select * from flag where user='amdin' and password=''or'6xxxx',等于 password=''or true == ture

从而实现了绕过。

开始做题:

题目叫easy md5,但是进去看见一个输入框,直觉跟sql有关,因此往输入框里面输入ffifdyop试试,
果然页面发生变化:

打开f12看源码,发现:

这里直接用科学计数法绕过a和b

这里我构造了一个payload,

http://03fa941a-e636-4c85-9c3d-57d574bbfee0.node4.buuoj.cn:81/levels91.php/?a=s1885207154a&b=s1836677006a

发现一直是404,

发现是自己多打了一个斜杠(博主纠结了一个小时)

于是修改payload,

http://03fa941a-e636-4c85-9c3d-57d574bbfee0.node4.buuoj.cn:81/levels91.php?a=s1885207154a&b=s1836677006a

得到页面:

终于看见希望了,flag近在咫尺!

这里看代码是php强类型比较,用数组绕过,构造payload如下图:

得到结果:

ctf中MD5绕过详细总结及例题[BJDCTF2020]Easy MD5相关推荐

  1. [BJDCTF2020]Easy MD5 1

    知识点 关于md5的一些基本绕过方法: 数组绕过 0e绕过 SQL注入中的ffifdyop万能密码绕过,其中md5函数是md5($string,true) md5强碰撞绕过 WP 首先进入环境,经过一 ...

  2. 在VScode 中使用EASYX详细教程(VScode+MSVC+Easy X)

    众所周知,vscode是一款强大的IDE,深受广大码友喜爱,博主曾尝试过用它实现各种脱离特定平台的写码,这里给大家介绍vscode配置EASYX的详细教程. 1.配置MSVC编译环境 首先要知道的是E ...

  3. 总结ctf中 MD5 绕过的一些思路

    总结ctf中 MD5 绕过的一些思路 1. 常规的0e绕过 2. 数组绕过 3. 强类型绕过 4. \$a==md5($a) 5. md5 与SQL注入 \$a !== $b && m ...

  4. 浅谈CTF中各种花式绕过的小trick

    文章目录 浅谈CTF中各种花式绕过的小trick 前言 md5加密bypass 弱比较绕过 方法一:0e绕过 方法二:数组绕过 强比较绕过 方法:数组绕过 md5碰撞绕过 方法:使用Fastcoll生 ...

  5. CTF:PHP MD5绕过和序列化漏洞

    CTF:PHP MD5绕过和序列化漏洞 作者:高玉涵 博客:blog.csdn.net/cg_i 时间:2021.6.25 9:51 题目复现Docker环境: https://github.com/ ...

  6. CTF中的md5弱类型(ALL_IN_ONE)

    CTF中的md5 文章目录 第一种情况,md5弱类型比较 第二种情况,md5强类型比较 第三种情况,md5碰撞 第四种情况,sql语句 md5值暴破 md4 md2 sha1 其他特殊的hash值(m ...

  7. 【CTF bugku 备份是个好习惯】关于.bak备份文件,md5绕过

    知识点 常用的备份文件后缀有 .bak, .swp bak是备份文件的扩展名,现在很多软件都会创建备份文件,bak文件是各类软件产生的备份文件.打开bak文件的方法有简单,只需要知道它的生成软件,然后 ...

  8. CTF中php相关考点

    以前在做CTF题的时候总是会遇到一些用php的trick才能过的题,知识点还是很杂的,主要是php这种动态弱类型语言实在是太灵活,各种奇葩写法也多,把之前的知识总结下. 学长的博客有对php黑魔法进行 ...

  9. ctf中的php序列化与反序列化

    ctf中的php序列化与反序列化 刚开始学的php序列化与反序列化,有点雨里雾里的,于是做个笔记~~ 首先我们来了解一下概念知道他是怎么样的一个东西: 序列化(串行化):是将变量转换为可保存或传输的字 ...

最新文章

  1. 艾麦捷科技-铂金小猪新年致辞
  2. 2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势
  3. les物流执行系统_物流规划工作如何开展?
  4. mount查看linux分区大小,Linux磁盘管理----分区格式化挂载fdisk、mkfs、mount
  5. python pip如何安装wheel文件?.whl(pip install [wheel])
  6. java 如何检测死锁_Java如何查看死锁
  7. leetcode最小面积_Code Review Swift 算法题: 最小面积矩形  Leetcode 的动人之处
  8. Select的OnChange()事件中获取选中的值
  9. gitlab修改管理员密码流程
  10. s1机试补考补习 9206
  11. AIM Tech Round 4 (Div. 2)
  12. vim-Complex repeats
  13. 《人机交互与戏剧表演:用戏剧理论构建良好用户体验》一导读
  14. GTID复制异常的解决步骤
  15. [转载] strtol() -- 将字符串转换成长整型数(转载)
  16. C++ 前置操作符与后置操作符
  17. PowerDesigner16工具学习笔记-建立CDM
  18. 计算机模块测试题,模拟计算机基础模块测试题.doc
  19. Git commit --amend
  20. 微博上面好看的跳舞美女蛮多的,【Python爬虫】采集微博视频数据(附代完整代码)

热门文章

  1. 怎么计算三因素方差分析中的贡献度_统计学课后思考
  2. 科目二-坡道定点停车起步
  3. Raccoon——(Reverse)EasyRE 01 writeup
  4. 代码随想录训练营day37
  5. 摄氏华氏温度转换。【问题描述】假如用C表示摄氏温度,F 表示华氏温度,则有:F=C×9/5+32。输入一个整数表示摄氏温度,根据该公式编程求对应的华氏温度。结果保留一位小数。
  6. remove.bg - 自动抠图、一键去除图片背景的免费在线工具
  7. IDC发布中国数据治理报告 亿信华辰第一
  8. 图像分类数据集 (INRIA)
  9. 小学计算机课动画制作的评课稿,根据小学信息技术学科特点进行有效评课
  10. 【Spring Cloud】多数据源配置