哈希拓展攻击CTF题做法

目录

基础:

盐(Salt):

哈希长度拓展攻击:

kali下载相关工具hash-ext-attack:

hash拓展题目特征:

哈希拓展ctf题:

2023楚慧杯upload_shell

实验吧之让我进去:


前言:具体怎么加密解密补位的原理我不懂,深入理解的部分我在文末挂了链接,以下也只是我做题的结论和通解,可能不准确(但是做题还挺准确),有错误欢迎指出:

基础:

盐(Salt):

是在密码加密过程中引入的一个随机值,它与密码结合使用,目的是增加密码的复杂性和安全性。在密码加密中,常见的做法是将用户提供的密码进行哈希处理,然后存储哈希值而不是明文密码。这样可以防止密码被明文泄露,但也带来了一些安全风险。盐的作用是对密码进行加强并增加密码的熵。具体而言,它通过在密码中添加一个随机生成的字符串,使得相同的密码在加密后生成不同的哈希值。这样即使两个用户拥有相同的密码,它们的哈希值也会不同,从而增加了破解密码的难度。使用盐的典型示例是将盐值和密码一起输入到哈希函数中进行计算,然后将盐值和生成的哈希值一起存储在数据库中。在验证密码时,系统会从数据库中获取盐值,并将用户输入的密码和盐值一起传递给哈希函数进行匹配。

哈希长度拓展攻击:

可以被用来构造一个新的有效哈希值,从而绕过原有的认证。这是因为,MD5和SHA-1算法的哈希函数存在一个特定的性质:给定一个消息M和其哈希值H,可以很容易地计算出一个新的消息M',使得M'的哈希值为任意指定的值H'。也就是说我们可以在不知道a的字符串具体字母:(前提知道字符串a的md5值和字符串a的长度) 可以算出字符串(a+b)的md5值 ,b为你自己构造的一个字符串。

如果一个应用程序是这样操作的:

  1. 准备了一个密文和一些数据构造成一个字符串里,并且使用了MD5之类的哈希函数生成了一个哈希值(也就是所谓的signature/签名)
  2. 让攻击者可以提交数据以及哈希值,虽然攻击者不知道密文
  3. 服务器把提交的数据跟密文构造成字符串,并经过哈希后判断是否等同于提交上来的哈希值

这个时候,该应用程序就易受长度扩展攻击,攻击者可以构造出{$secret || data || attacker_controlled_data}的哈希值

kali下载相关工具hash-ext-attack:

git clone https://github.com/shellfeel/hash-ext-attack.git

cd /home/kali/hash-ext-attack/
pip install -r requirements.txt

hash拓展题目特征:

通常会给出$secert+“一串明文”的md5值,虽然不知道$secret是什么但是会给出$secret的长度,出现这种情况题目就大概率掺杂了哈希拓展攻击

哈希拓展ctf题:

2023楚慧杯upload_shell

 <?php
session_start();
highlight_file(__FILE__);
include "./my.php";
echo strlen($secret);
echo"<br>";
echo(md5($secret."adminpassword"));
@$username = urldecode($_POST["username"]);
@$password = urldecode($_POST["password"]);
if (!empty($_COOKIE["source"])) {if ($username === "admin" && $password != "password") {if ($_COOKIE["source"] === md5($secret.$username.$password)) {// 在验证用户后,如果登录成功,设置会话变量来表示用户已登录$_SESSION['loggedin'] = true;$_SESSION['username'] = 'admin'; // 用户名$_SESSION['role'] = 'admin'; // 用户角色或权限echo "<script>window.location.href='upload.php';</script>";}else {echo "<br>"; die ("你的cookie好像不太对啊");}}else {die ("可不会轻易放你进去");}
}14
879bd10c8628894d388c068a25326c21

关于该源码解析:

  1. 首先,通过highlight_file(__FILE__);将当前文件的源代码显示在页面上,这可能是为了方便调试和查看代码。

  2. 通过include "./my.php";引入了一个名为"my.php"的文件,其中可能包含了一些相关的变量或函数。

  3. echo strlen($secret);输出了变量$secret的长度为14。

  4. echo(md5($secret."adminpassword"));计算了$secret与字符串"adminpassword"拼接后的MD5哈希值,并将结果输出。

  5. 通过$_POST获取了通过POST请求发送的"username"和"password"参数,并使用urldecode对其进行解码。

  6. 如果存在名为"source"的Cookie,执行以下逻辑:

    • 检查输入的用户名是否为"admin",并且密码不等于"password"。
    • 检查Cookie中的"source"是否等于md5($secret.$username.$password)的值。
  7. 如果验证通过,则设置会话变量来表示用户已登录,包括$_SESSION['loggedin'] = true;$_SESSION['username'] = 'admin';$_SESSION['role'] = 'admin';,然后重定向到"upload.php"页面。

  8. 如果验证未通过,输出错误信息"你的cookie好像不太对啊"。

  9. 如果用户名不是"admin"或密码为"password",则输出错误信息"可不会轻易放你进去"。

我们注意到,md5($salt+“adminroot”)=e6ccbf12de9d33ec27a5bcfb6a3293df,对于未知salt的MD5或SHA-1哈希,哈希长度拓展攻击可以被用来构造一个新的有效哈希值,从而绕过原有的认证。这是因为,MD5和SHA-1算法的哈希函数存在一个特定的性质:给定一个消息M和其哈希值H,可以很容易地计算出一个新的消息M',使得M'的哈希值为任意指定的值H'。也就是说我们可以在不知道a的字符串具体字母:(前提知道字符串a的md5值和字符串a的长度) 可以算出字符串(a+b)的md5值 ,b为你自己构造的一个字符串。

具体怎么加密解密补位的原理我不懂,以下也只是我做题的结论,可能不准确,有错误欢迎指出:

这里我们得知了md5($secret."adminpassword"),即$secret拼接上adminpassword这13个字符等于879bd10c8628894d388c068a25326c21,secret的长度是14,明文的长度是13,明文加秘钥的长度必须要有27。秘钥的长度可以是14到27(14加13),规定了username=admin,下面是把admin当做秘钥的一部分塞进秘钥的长度里,那么秘钥长度就是19,已知明文就是password(不能是其他的,因为我们已知的MD5值就是$secret+adminpassword拼接起来的MD5值),已知hash就是源码里给出的879bd10c8628894d388c068a25326c21,扩展字符随便。把新hash和新明文url塞进包里上传绕过验证

后面对上传页面用sqlmap得到flag

 

实验吧之让我进去:

靶场链接:http://ctf5.shiyanbar.com/web/kzhan.php

抓包把里面的source=0改成source=1,得到源码

源码:

$flag = "XXXXXXXXXXXXXXXXXXXXXXX";
$secret = "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security!$username = $_POST["username"];
$password = $_POST["password"];if (!empty($_COOKIE["getmein"])) {if (urldecode($username) === "admin" && urldecode($password) != "admin") {if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {echo "Congratulations! You are a registered user.\n";die ("The flag is ". $flag);}else {die ("Your cookies don't match up! STOP HACKING THIS SITE.");}}else {die ("You are not an admin! LEAVE.");}
}setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));if (empty($_COOKIE["source"])) {setcookie("source", 0, time() + (60 * 60 * 24 * 7));
}
else {if ($_COOKIE["source"] != 0) {echo ""; // This source code is outputted here}
}

 代码分析:

  1. 变量 $flag 存储了一个标志字符串,表示注册用户成功登录后可以获取到flag。
  2. 变量 $secret 是用于加密和验证的秘密字符串,长度为 15 个字符。
  3. 变量 $username$password 存储了从用户输入中获取的用户名和密码。
  4. 如果存在名为 "getmein" 的 Cookie,会执行以下判断:
    • 判断用户名解码后是否等于 "admin",且密码解码后不等于 "admin"。

    • 如果 "getmein" Cookie 的值等于将秘密字符串与用户名和密码解码拼接后进行哈希得到的结果(md5(secret.urldecode(secret.urldecode(username . $password)))。
    • 如果以上条件都满足,则输出一条成功登录的消息,并终止程序并显示标志字符串。
    • 否则,终止程序并显示错误消息。
  5. 设置名为 "sample-hash" 的 Cookie,值为将秘密字符串与用户名为 "admin",密码为 "admin" 的组合进行哈希得到的结果(md5($secret . urldecode("admin" . "admin"))),有效期为 7 天。
  6. 如果不存在名为 "source" 的 Cookie,会设置一个名为 "source" 的 Cookie,值为 0,有效期为 7 天。
  7. 如果存在名为 "source" 的 Cookie,会进行一个条件判断:
    • 如果 "source" Cookie 的值不等于 0,则输出一段空字符串。这可能是为了输出当前的源代码。

重点在这一行:

setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));

代码逻辑如下:

  1. 使用md5($secret . urldecode("admin" . "admin"))计算了字符串"adminadmin"与变量$secret拼接后的MD5哈希值。

  2. setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));将名为"sample-hash"的Cookie设置为上一步计算得到的哈希值。

  3. time() + (60 * 60 * 24 * 7)设置了Cookie的过期时间,当前时间加上7天的秒数,即表示Cookie在7天后过期。

抓包后再cookie里能看见sample-hash的值,也就是说我们已知$secert+adminadmin的md5值,还知道 secert的长度为15,我们题里面password不能为admin 但必须是admin开头的字符,因为前提是已知secert+adminadmin的md5值,把admin传给username,新明文传给password,以下两种都能成功得到flag,但是注意第二种在传给password的时候需要删掉一个admin,以保证$username . $password拼接的结果是adminadmin+一串东西,而不是adminadminadmin+一串东西,毕竟我们知道的不是$secert+adminadminadmin的md5值

相关深度理解的链接:

hash哈希长度扩展攻击解析(记录一下,保证不忘)_攻击者对hash算法进行长度扩展攻击的是-CSDN博客

 Everything you need to know about hash length extension attacks | SkullSecurity Blog

用MD5实现hash长度扩展攻击 By Assassin_hash_extender-CSDN博客从一个题目到hash扩展攻击 - 先知社区用MD5实现hash长度扩展攻击 By Assassin_hash_extender-CSDN博客

实验吧之【让我进去】(哈希长度扩展攻击)-CSDN博客 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

编译opencv和opencv_contrib

1 下载源码 下载opencv源码https://github.com/opencv/opencv 下载opencv源码https://github.com/opencv/opencv_contrib 2 开始编译 构建需要下载ffmpeg的包&#xff0c;cmake构建时会自动下载&#xff0c;但是比较满&#xff0c;这里可以从下面链接直接下载 https://downloa…

新版IDEA中Git的使用(一)

说明&#xff1a;本文介绍如何在新版IDEA中使用Git 创建项目 首先&#xff0c;在GitLab里面创建一个项目&#xff08;git_demo&#xff09;&#xff0c;克隆到桌面上。 然后在IDEA中创建一个项目&#xff0c;项目路径放在这个Git文件夹里面。 Git界面 当前分支&Commit …

VSCode软件与SCL编程

原创 NingChao NCLib 博途工控人平时在哪里技术交流博途工控人社群 VSCode简称VSC&#xff0c;是Visual studio code的缩写&#xff0c;是由微软开发的跨平台的轻量级编辑器&#xff0c;支持几乎所有主流的开发语言的语法高亮、代码智能补全、插件扩展、代码对比等&#xff0c…

Java中的抽象abstract

抽象abstract 什么是抽象类抽象类的注意事项、特点 使用好处常见应用场景&#xff1a;模版方法设计模式可以使用final关键字修饰模版方法 什么是抽象类 在Java中有一个关键字叫:abstract&#xff0c;它就是抽象的意思&#xff0c;可以用它修饰类、成员方法。abstract修饰类&am…

openGauss学习笔记-171 openGauss 数据库运维-备份与恢复-导入数据-深层复制

文章目录 openGauss学习笔记-171 openGauss 数据库运维-备份与恢复-导入数据-深层复制171.1 使用CREATE TABLE执行深层复制171.1.1 操作步骤 171.2 使用CREATE TABLE LIKE执行深层复制171.2.1 操作步骤 171.3 通过创建临时表并截断原始表来执行深层复制171.3.1 操作步骤 openGa…

SpringIOC之AbstractMessageSource

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Python量化投资——金融数据最佳实践: 使用qteasy+tushare搭建本地金融数据仓库并定期批量更新【附源码】

用qteasytushare实现金融数据本地化存储及访问 目的什么是qteasy什么是tushare为什么要本地化使用qteasy创建本地数据仓库qteasy支持的几种本地化仓库类型配置本地数据仓库配置tushare 的API token 配置本地数据源 —— 用MySQL数据库作为本地数据源下载金融历史数据 数据的定期…

超维空间S2无人机使用说明书——31、使用yolov8进行目标识别

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov8进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;以及yolov7。 简介&#xff0c;为了提高识别速度&#xff0c;系统采用了G…

c语言的练习---BCD解密

#继续源于c语言翁恺先生 一.分析 初看这道题的时候&#xff0c;可能很多人就想选择放弃&#xff0c;但这道题实在不是考察我们对于编码的能力&#xff1b;而是我们的数学能力。 就拿它的输入样例---18&#xff0c;来举例。 我们来看---在十进制中&#xff0c;是18D&#xf…

锯齿云服务器租赁使用教程

首先登陆锯齿云账号 网盘上传数据集与代码 随后我们需要做的是将所需要的数据集与代码上传到网盘&#xff08;也可以直接在租用服务器后将数据集与代码传到服务器的硬盘上&#xff0c;但这样做会消耗大量时间&#xff0c;造成资源浪费&#xff09; 点击工作空间&#xff1a;…

移除石子使总数最小(LeetCode日记)

LeetCode-1962-移除石子使总数最小 题目信息: 给你一个整数数组 p i l e s piles piles &#xff0c;数组 下标从 0 0 0 开始 &#xff0c;其中 p i l e s [ i ] piles[i] piles[i] 表示第 i i i 堆石子中的石子数量。另给你一个整数 k k k &#xff0c;请你执行下述操作…

无需改动现有网络,企业高速远程访问内网Linux服务器

某企业为数据治理工具盒厂商&#xff0c;帮助客户摆脱数据问题困扰、轻松使用数据&#xff0c;使得客户可以把更多精力投入至数据应用及业务赋能&#xff0c;让数据充分发挥其作为生产要素的作用。 目前&#xff0c;该企业在北京、南京、西安、武汉等地均设有产研中心&#xff…

docker构建镜像及项目部署

文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件&#xff0c;完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…

运维大模型探索之 Text2PromQL 问答机器人

作者&#xff1a;陈昆仪&#xff08;图杨&#xff09; 大家下午好&#xff0c;我是来自阿里云可观测团队的算法工程师陈昆仪。今天分享的主题是“和我交谈并获得您想要的PromQL”。今天我跟大家分享在将AIGC技术运用到可观测领域的探索。 今天分享主要包括5个部分&#xff1a;…

【Python】基于flaskMVT架构与session实现博客前台登录登出功能

目录 一、MVT说明 1.Model层 2.View层 3.Template层 二、功能说明 三、代码框架展示 四、具体代码实现 models.py 登录界面前端代码 博客界面前端代码&#xff08;profile.html&#xff09; main.py 一、MVT说明 MVT架构是Model-View-Template的缩写&#xff0c;是…

HarmonyOS构建第一个JS应用(FA模型)

构建第一个JS应用&#xff08;FA模型&#xff09; 创建JS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&#xf…

SpringBoot3-基础特性

文章目录 自定义 banner自定义 SpringApplicationFluentBuilder APIProfiles指定环境环境激活环境包含Profile 分组Profile 配置文件 外部化配置配置优先级 外部配置导入配置属性占位符 单元测试-JUnit5测试组件测试注解断言嵌套测试参数化测试 自定义 banner banner 就是启动…

计算机毕业设计 基于SpringBoot的房屋租赁管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

嵌入式开发中利用strstr()对部分模块回传数据进行解析的问题(坑)

受到以下博文的启发&#xff1a; https://www.cnblogs.com/yup1983/p/11337837.html 验证&#xff1a; 最近通过ESP8266远程控制小车&#xff0c;在wifi回传的数据解析过程中遇到标题所述的烦恼 如上截图所示&#xff0c;数据回传过程中会接受到‘\0’字节对应的ASCII码为0x0…