我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

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

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

二、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,否则falseis_numeric(mixed $ver):bool类型    //如果ver是数字或者数字字符串,则返回true,否则返回false

例如:

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都是数字或者数字字符串,则..        else            echo "you can't get flag";    }}?>//此时如果输入 ver1[]=1&ver2[]=2,返回you can't get flag

方法二:科学计数法绕过

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

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开头的数字字符串:QNKCDZO240610708314282422s878926199as155964671as214587387as214587387a

例如:

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都是数字或者数字字符串,则..        else            echo "you can't get flag";    }}?>//此时如果输入 ver1=240610708&ver2=314282422,返回$flag,此时ver1和ver2加密后都是0e开头

双MD碰撞绕过

md和md5后都是以0e开头的字符串:CbDLytmyGm2xQyaLNhWn770hQgrBOjrcqftrlaZk7r4lGXCH2Ksu2JNT3BYM

三、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;        else            echo "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试试,
果然页面发生变化:

image-20221018014049985

打开f12看源码,发现:

image-20221018021945544

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

这里我构造了一个payload,

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

发现一直是404,image-20221018022400096

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

于是修改payload,

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

得到页面:

image-20221018022234157

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

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

得到结果:

image-20221018023941939

来源地址:https://blog.csdn.net/m0_56691564/article/details/127380406

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录