哈希拓展攻击CTF题做法

news2025/1/15 6:56:18

目录

基础:

盐(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.coloradmin.cn/o/1331906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于“Python”的核心知识点整理大全38

14.1.1 创建 Button 类 由于Pygame没有内置创建按钮的方法&#xff0c;我们创建一个Button类&#xff0c;用于创建带标签的实心矩形。 你可以在游戏中使用这些代码来创建任何按钮。下面是Button类的第一部分&#xff0c;请将这个类保存为 文件button.py&#xff1a; button.py …

渗透实验 XSS和SQL注入(Lab3.0)

windows server2003IIS搭建 配置2003的虚拟机 1、利用AWVS扫描留言簿网站&#xff08;安装见参考文档0.AWVS安装与使用.docx&#xff09;&#xff0c;发现其存在XSS漏洞&#xff0c;截图。 2、 Kali使用beef生成恶意代码 cd /usr/share/beef-xss./beef执行上面两条命令 …

Maven核心概念

1 Maven工程的GAVP Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写&#xff0c;其中前三个是必要的&#xff0c;而 Packaging 属性为可选项。 这四个属性主要为每个项目在maven仓库中做一个标识&#xff0c;方便项目之间相互引用。 GAV G 即…

模式识别与机器学习(八):决策树

1.原理 决策树&#xff08;Decision Tree&#xff09;&#xff0c;它是一种以树形数据结构来展示决策规则和分类结果的模型&#xff0c;作为一种归纳学习算法&#xff0c;其重点是将看似无序、杂乱的已知数据&#xff0c;通过某种技术手段将它们转化成可以预测未知数据的树状模…

使用vue-qr,报错in ./node_modules/vue-qr/dist/vue-qr.js

找到node_modules—>vue-qr/dist/vue-qr.js文件&#xff0c;搜…e,将…去掉&#xff0c;然后重新运行项目。

【RabbitMQ】RabbitMQ详解(二)

RabbitMQ详解 死信队列死信来源消息TTL过期队列达到最大长度消息被拒绝 RabbitMQ延迟队列TTL的两种设置队列设置TTL消息设置TTL 整合SrpingBoot队列TTL延时队列TTL优化Rabbtimq插件实现延迟队列 死信队列 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就…

使用keytool查看Android APK签名

文章目录 一、找到JDK位置二、使用方法2.1 打开windows命令行工具2.2 查看签名 三、如何给APK做系统签名呢? 一、找到JDK位置 安卓AS之后&#xff0c;可选择继续安装JDK&#xff0c;如本文使用amazon版本默认位置&#xff1a;C:\Users\66176.jdks\corretto-1.8.0_342可通过自…

数据预处理:多重共线性_检测和解决办法

文章目录 1.多重共线性简介&#xff08;Collinearity and Multicollinearity&#xff09;1.1 多重共线性的后果1.2 处理多重共线性问题的方法 2. 设置2.1 导入库2.2 数据集特征波士顿房价BMI 数据集 2.3 导入数据 3. 相关矩阵3.1 聚类图 4. 方差膨胀因子4.1 两种多重共线性4.2 …

HackTheBox - Medium - Linux - Format

Format Format 是一种中等难度的 Linux 机器&#xff0c;它突出显示了由解决方案的结构方式引起的安全问题。立足点涉及PHP源代码审查&#xff0c;发现和利用本地文件读/写漏洞&#xff0c;并利用Nginx中的错误配置在Redis Unix套接字上执行命令。横向移动包括浏览 Redis 数据…

指针的含义

我们还取前面图片解释的道理&#xff1a; pa表示的意思就是这个地址&#xff0c;并不会显示出10这个数字 *pa就是指针&#xff0c;最后指向了a10&#xff0c;所以他最后程序输出是10 &pa这个含义就是取pa的地址&#xff0c;那么pa是一个虚拟的地址&#xff0c;只是简单的…

7种常见的网络安全设备及其功能

网络安全设备在现代网络环境中起着至关重要的作用&#xff0c;帮助保护个人和组织免受恶意攻击。本文将介绍7种常见的网络安全设备&#xff0c;包括防火墙、入侵检测系统、反病毒软件、数据加密设备、虚拟私人网络、安全信息和事件管理系统以及网络访问控制设备&#xff0c;并详…

Apache RocketMQ,构建云原生统一消息引擎

本文整理于 2023 年云栖大会林清山带来的主题演讲《Apache RocketMQ 云原生统一消息引擎》 演讲嘉宾&#xff1a; 林清山&#xff08;花名&#xff1a;隆基&#xff09;&#xff0c;Apache RocketMQ 联合创始人&#xff0c;阿里云资深技术专家&#xff0c;阿里云消息产品线负…

postgresql vacuum流程分析

概述 VACUUM是postgresql MVCC机制不可分割的组成部分。 postgresql在管理同一个元组的多个版本时&#xff0c;采取在堆表页面上从老版本到新版本放置元组的方法&#xff0c;每个元组都记录了xmax和xmin用于判断其可见性。这样的好处是&#xff08;1&#xff09;在索引键没有…

RasaGPT对话系统的工作原理

RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目&#xff0c;当超出 Rasa 现有意图(out_of_scope)的时候&#xff0c;就会执行 ActionGPTFallback&#xff0c;本质上就是利用 Langchain 做了一个 RAG&#xff0c;调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂&#xff0c…

OpenCV | 霍夫变换:以车道线检测为例

霍夫变换 霍夫变换只能灰度图&#xff0c;彩色图会报错 lines cv2.HoughLinesP(edge_img,1,np.pi/180,15,minLineLength40,maxLineGap20) 参数1&#xff1a;要检测的图片矩阵参数2&#xff1a;距离r的精度&#xff0c;值越大&#xff0c;考虑越多的线参数3&#xff1a;距离…

[python]用python实现对arxml文件的操作

目录 关键词平台说明一、背景二、方法2.1 库2.2 code 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 一、背景 有时候需要批量处理arxml文件(ARXML 文件符合 AUTOSAR 4.0 标准)&#xff0c;但是工作量太大&#xff0c;阔以考虑用python。 二、方…

2023尚硅谷大数据项目之数据治理考评平台

教程下载&#xff1a;https://download.csdn.net/download/m0_66047725/88655186 【资源目录】: ├──1.笔记 | ├──课堂随笔.pptx 288.70kb | ├──尚硅谷大数据技术之数据治理考评平台完整V1.2.0.docx 1.87M | ├──数据治理总结.mmap 133.77kb | ├──自测题1.txt …

科研学习|论文解读——面向电商内容安全风险管控的协同过滤推荐算法研究

【论文完整内容详见知网链接】&#xff1a; 面向电商内容安全风险管控的协同过滤推荐算法研究 - 中国知网 (cnki.net) 面向电商内容安全风险管控的协同过滤推荐算法研究* 摘 要&#xff1a;[目的/意义]随着电商平台商家入驻要求降低以及商品上线审核流程简化&#xff0c;内容安…

冒泡排序之C++实现

描述 冒泡排序算法是一种简单的排序算法&#xff0c;它通过将相邻的元素进行比较并交换位置来实现排序。冒泡排序的基本思想是&#xff0c;每一轮将未排序部分的最大元素逐个向右移动到已排序部分的最右边&#xff0c;直到所有元素都按照从小到大的顺序排列。 冒泡排序的算法…

LangChain 31 模块复用Prompt templates 提示词模板

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…