RESTful APInahamcon Fuzzies-write-up
RESTful API 路径详解
RESTful API(Representational State Transfer)是一种 基于 HTTP 协议的 API 设计风格,它通过 URL 路径 和 HTTP 方法(GET、POST、PUT、DELETE 等)来定义资源的访问方式。它的核心思想是 将数据(资源)暴露为 URI(路径),并通过标准 HTTP 方法操作这些资源。
1. RESTful API 路径是什么?
RESTful API 路径(Endpoint)是一个 URL,用于访问服务器上的特定资源。它的结构通常遵循以下模式:
http(s)://域名/api/资源名/{资源ID}/子资源/{子资源ID}?查询参数
例如:
https://example.com/api/users/1/posts?limit=10
/api
:通常标识这是一个 API 接口。
/users
:表示操作的是 用户资源。
/1
:表示操作的是 ID=1 的用户。
/posts
:表示操作的是该用户的 帖子(子资源)。
?limit=10
:查询参数(可选),用于过滤、排序或分页。
2. RESTful API 路径的作用
(1) 标准化资源访问
-
每个 URL 代表一种 资源(如用户、订单、商品)。
-
使用 HTTP 方法(GET、POST、PUT、DELETE)来定义操作类型:
HTTP 方法 用途 示例(用户管理) GET
获取资源 GET /api/users
(获取所有用户)POST
创建资源 POST /api/users
(新增用户)PUT
更新整个资源 PUT /api/users/1
(更新用户1)PATCH
部分更新资源 PATCH /api/users/1
(修改用户1的部分字段)DELETE
删除资源 DELETE /api/users/1
(删除用户1)
(2) 可读性强
-
路径清晰,例如:
-
GET /api/orders/100
→ 获取订单 ID=100 的详情。 -
DELETE /api/products/5
→ 删除商品 ID=5。
-
(3) 无状态(Stateless)
-
每个请求包含所有必要信息,服务器不存储会话状态,适合分布式系统。
(4) 支持缓存、可扩展
-
由于使用 HTTP 标准,可以方便地利用 CDN 缓存、负载均衡 等技术。
3. 哪里会用到 RESTful API?
(1) 前后端分离开发
-
前端(Web/App)通过 RESTful API 与后端(服务器)交互,获取或提交数据。
-
例如:
-
Vue/React 前端:
fetch("/api/users")
获取用户列表。 -
移动端(Android/iOS):调用
GET /api/products
获取商品数据。
-
(2) 微服务架构
-
不同服务之间通过 RESTful API 通信,例如:
-
订单服务调用支付服务:
POST /api/payments
。 -
用户服务调用通知服务:
POST /api/notifications
。
-
(3) 第三方开放平台
-
许多公司提供 RESTful API 供开发者使用,例如:
-
Twitter API:
GET /2/tweets/{id}
获取推文。 -
GitHub API:
GET /repos/{owner}/{repo}
获取仓库信息。 -
Stripe 支付 API:
POST /v1/payment_intents
创建支付订单。
-
(4) 企业内部系统
-
企业内部不同系统(ERP、CRM)通过 RESTful API 交换数据。
4. RESTful API 路径设计最佳实践
(1) 资源命名使用名词(而非动词)
-
✅ 正确:
/api/users
(资源:用户) -
❌ 错误:
/api/getUsers
(违反 REST 风格)
(2) 使用复数形式
-
通常使用复数形式表示资源集合:
-
/api/users
(而不是/api/user
) -
/api/products
(而不是/api/product
)
-
(3) 层级关系表示子资源
-
例如:
-
GET /api/users/1/posts
→ 获取用户 1 的所有帖子。 -
POST /api/users/1/posts
→ 为用户 1 创建新帖子。
-
(4) 使用查询参数(?)进行过滤、分页
-
GET /api/orders?status=completed
→ 获取已完成的订单。 -
GET /api/products?page=2&limit=10
→ 分页获取商品。
(5) 版本控制(可选)
-
在 URL 或 Header 中加入版本号,例如:
-
GET /api/v1/users
-
GET /api/v2/users
-
5. 示例:一个完整的 RESTful API 设计
假设我们有一个 博客系统,API 设计如下:
功能 | HTTP 方法 | 路径 | 描述 |
---|---|---|---|
获取所有文章 | GET | /api/posts | 返回文章列表 |
创建新文章 | POST | /api/posts | 新增一篇文章 |
获取单篇文章 | GET | /api/posts/1 | 返回 ID=1 的文章 |
更新文章 | PUT | /api/posts/1 | 修改 ID=1 的文章 |
删除文章 | DELETE | /api/posts/1 | 删除 ID=1 的文章 |
获取文章的所有评论 | GET | /api/posts/1/comments | 获取文章 1 的评论 |
新增评论 | POST | /api/posts/1/comments | 给文章 1 添加评论 |
6. 总结
-
RESTful API 路径 是基于 HTTP 的标准化资源访问方式。
-
用途:前后端交互、微服务通信、开放平台 API。
-
核心特点:
-
使用 名词 表示资源(如
/users
)。 -
通过 HTTP 方法 定义操作(GET/POST/PUT/DELETE)。
-
路径清晰、可读性强、支持缓存和扩展。
-
-
最佳实践:使用复数名词、层级表示关系、查询参数过滤数据。
NahamCon CTF 2025-Fuzzies
题目描述:
对一个似乎是玩具公司的网站进行fuzzing模糊测试,总共有5个flag,这个题讲述的故事还有点细思极恐,有点意思
Flag1
由于题目给出了两个爆破字典,我们可以先试试目录遍历看看有没有什么数据泄露或者后台管理员登录界面等
使用工具dirsearch并使用命令python dirsearch.py -u "url" -w "字典路径" -e *
成功找到以上路径,其中upload和images都无法正常访问
这个admin界面应该就是管理员的登录界面
尝试sql注入无果,于是使用题目所给字典爆破
但失败了
应该是账号出错了,于是聪明的我注意到在memory界面有很多名字,结果我就把这些名字一个一个当成用户名去尝试了,结果浪费一大把时间。这里的关键点应该是api路径,利用方式也就是上面说的RESTful API路径
我们尝试访问/api/users,查看是否有用户信息,虽然没有访问到,但提示是401要求身份验证,那么也证明是有信息的,再随便访问一个别的,通过对比可以证明这一点
猜测后面路径跟上数字表示用户id,在输入数字时401报错,不是数字时出现endpoint not found报错,猜想确实是有用户id这一说并且就是使用数字表示id
既然知道了有大概有用户id这一说,那按照api的套路后面的路径就大概率还是功能模块,但我们不知道模块名字叫什么,于是继续使用他给出的字典爆破
发现存在一个功能模块叫log,并且回显的是user not found
那么应该是没有用户id为1的用户,那么再继续爆破用户id就好了
在用户id为87时发现有有用内容回显
访问api/users/87/log,发现第一个flag
Flag2
上面我们找到了第一个flag,其后面紧跟着一个username,叫做brian.1954,那么就尝试使用这个账号登录并且爆破这个账号的密码
在密码为dalls时返回数据长度不同并且状态码为302跳转,大概率就是密码
使用密码dallas登录,发现登录成功,以及第二个flag
Flag3
进入管理员界面后,我们先看Memory Management,从这里故事就有点细思极恐的感觉了
以及前面的memory里有说到一个人弄丢了fuzzy但是后面发现fuzzy自己坐在公园长椅上等她,当时就感觉这fuzzy不会有生命吧,或者说被恶灵附身了什么的,感觉有点意思,现在加上这两条未公开的回忆,更让人觉得这个玩具工厂没有那么简单了
说回正题,我尝试通过这两条未被接受的memory,并且抓包查看其中内容,但是似乎没有什么有效信息
于是将方向转向另一个模块Internal messages
这里有三篇文章,其中第三片文章说到产品问题,说到玩具绝对不能被淋湿,然而前面有一条memory就是他在洗澡时,玩具fuzzy掉入了水中,然后fuzzy不见了,最后他的房子都被毁了,可能是遇到水就会唤醒fuzzy心里沉睡的野兽?还是通过水这个生命源泉赋予了它生命?还是恶灵的召唤需要水元素???真实细思极恐啊,有点意思。
又扯远了
我们可以注意到这里访问每一个文章时url都有对应的类似文章id的部分
于是我就想试着使用爆破的方式看看有没有隐藏的文章
还真找到了两个,分别是id为98和842
其中98的是关于新工厂的地理位置
我勒个是在墓地上建造啊,这样恶灵附身的说法就更有可能了,当时做到这里真实冷汗直冒,但似乎这没有别的什么有用信息了,我们再看842
成功从842里找到了第3个flag
这篇文章表述这个工厂在研发一种活体毛绒玩具,又细思极恐了>_<
Flag4
前面给到了这个二维码的UUID,在开始时的界面Our collection里的界面源代码里有提到
这里的图片应该是从/api/fuzzies这个路径下获取的
我们试着访问这个路径
可以看到很多图片的信息包括名字和id等
那么我们可以根据RESTful API的格式来通过拼接参数来查询我们想要的内容
我们在后面跟上参数?id=666e8400-e29b-41d4-a716-446655440666来查看前面二维码的图片信息
这里发现第四个flag
Flag5
我们已经发现了这张隐藏的图片,那么就试着去看看这张图片,这里图片信息已经给出路径和名称了,为/images/fuzzies/the-evid-one.png(看到这名字时候感觉有点不对劲,难道终于要发现这个恶灵了吗)
我勒个去啊,当时做到这真给我吓一小跳,这跟前面画风差别太大了吧
看看着差别
最后一个flag就藏在那张鬼图里面,我们将the-evil-one.png下载后使用010 editor打开直接搜索flag,就找到最后一个flag了
或者使用exitfool工具查看也可以
总结
至此所有的flag都找到了,这里只要发现第一个flag后接下来的任务都不算太难,主要考了RESTful API的了解和利用,同时这个故事更是深得我心,在温暖温馨的画风中穿插了一条恐怖悬疑暗线,一个CTF题目设计成这样我觉得还是非常有意思的,在做的时候并不会感到累进而带替的是对了解故事真相的渴望
相关文章:

RESTful APInahamcon Fuzzies-write-up
RESTful API 路径详解 RESTful API(Representational State Transfer)是一种 基于 HTTP 协议的 API 设计风格,它通过 URL 路径 和 HTTP 方法(GET、POST、PUT、DELETE 等)来定义资源的访问方式。它的核心思想是 将数据…...
安装DockerDocker-Compose
Docker 1、换掉关键文件 vim /etc/yum.repos.d/CentOS-Base.repo ▽ [base] nameCentOS-$releasever - Base - Mirrors Aliyun baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck1 enabled1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-C…...

2025年机械化设计制造与计算机工程国际会议(MDMCE 2025)
2025年机械化设计制造与计算机工程国际会议(MDMCE 2025) 2025 International Conference on Mechanized Design, Manufacturing, and Computer Engineering 一、大会信息 会议简称:MDMCE 2025 大会地点:中国贵阳 审稿通知&#…...
Java生态中的NLP框架
Java生态系统中提供了多个强大的自然语言处理(NLP)框架,以下是主要的NLP框架及其详细说明: 1、Apache OpenNLP 简介:Apache OpenNLP是Apache软件基金会的开源项目,提供了一系列常用的NLP工具。 主要功能: …...
NVM,Node.Js 管理工具
node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/ 一、什么是 NVM? NVM 是一个命令行工具,允许你在同一台机器上安装、切换和管理多个 Node.js 版本,解决项目间版本冲突问题。 二、安装 …...

Jmeter逻辑控制器、定时器
目录 一、Jmeter逻辑控制器 ①IF(如果)控制器 作用: 位置: 参数介绍: 步骤: ②循环控制器 作用: 位置: 步骤: 线程组属性VS循环控制器 ③ForEach控制器 作用: 位置&am…...
每日八股文6.2
每日八股-6.2 Go1.GMP调度原理(这部分多去看看golang三关加深理解)2.GC(同样多去看看golang三关加深理解)3.闭包4.go语言函数是一等公民是什么意思5.sync.Mutex和sync.RWMutex6.sync.WaitGroup7.sync.Cond8.sync.Pool9.panic和rec…...

R3GAN利用配置好的Pytorch训练自己的数据集
简介 简介:这篇论文挑战了"GANs难以训练"的广泛观点,通过提出一个更稳定的损失函数和现代化的网络架构,构建了一个简洁而高效的GAN基线模型R3GAN。作者证明了通过合适的理论基础和架构设计,GANs可以稳定训练并达到优异性能。 论文题目:The GAN is dead; long l…...

吴恩达机器学习笔记(1)—引言
目录 一、欢迎 二、机器学习是什么 三、监督学习 四、无监督学习 一、欢迎 机器学习是当前信息技术领域中最令人兴奋的方向之一。在这门课程中,你不仅会学习机器学习的前沿知识,还将亲手实现相关算法,从而深入理解其内部机理。 事实上&…...
信贷风控规则策略累计增益lift测算
在大数据风控业务实践过程中,目前业内主要还是采用规则叠加的办法做策略,但是会遇到一些问题: 1.我们有10条规则,我上了前7条后,后面3条的绝对风险增益是多少? 2.我的规则之间应该做排序吗,最重…...

【笔记】Windows 部署 Suna 开源项目完整流程记录
#工作记录 因篇幅有限,所有涉及处理步骤的详细处理办法请参考文末资料。 Microsoft Windows [Version 10.0.27868.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗…...

【Elasticsearch】Elasticsearch 核心技术(一):索引
Elasticsearch 核心技术(一):索引 1.索引的定义2.索引的命名规范3.索引的增、删、改、查3.1 创建索引3.1.1 创建空索引 3.2 删除索引3.3 文档操作3.3.1 添加/更新文档(指定ID)3.3.2 添加文档(自动生成ID&am…...
AudioTrack的理解
采样率说的是一秒钟采样多少点 波形频率说的是一个采样周期内有多少个波形 pcm编码说的是 16 还是8 直接决定write的时候使用short还是byte 一、初始化配置 参数设定 需定义音频格式、采样率及缓冲区大小,确保符合硬件支持范围 // 音频参数配置 int sample…...
HTTP请求与HTTP响应介绍及其字段
HTTP请求 请求行:请求行主要包含请求方法、请求URI(统一资源标识符)和HTTP协议版本。例如: GET /index.html HTTP/1.1 请求头(Headers):包含客户端的元数据,为服务器提供了额外信息…...

Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理
Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理 面试周期就是要根据JD调整准备内容(挠头),最近会混合复习针对全栈这块的内容,目前是根据受伤的JD,优先选择一些基础的操作系统、Java、Nod…...

中科院报道铁电液晶:从实验室突破到多场景应用展望
2020年的时候,相信很多关注科技前沿的朋友都注意到,中国科学院一篇报道聚焦一项有望改写显示产业格局的新技术 —— 铁电液晶(FeLC)。这项被业内称为 "下一代显示核心材料" 的研究,究竟取得了哪些实质性进展…...

智慧政务标准规范介绍:构建高效、协同的政务信息体系
在当今信息化快速发展的时代,智慧政务作为政府数字化转型的重要方向,正逐步改变着政府管理和服务的方式。为了确保智慧政务系统的建设能够有序、高效地进行,国家制定了一系列标准规范,其中GB∕T 21062系列标准《政务信息资源交换体…...
6个月Python学习计划 Day 12 - 字符串处理 文件路径操作
第一周 Day 1 - Python 基础入门 & 开发环境搭建 Day 2 - 条件判断、用户输入、格式化输出 Day 3 - 循环语句 range 函数 Day 4 - 列表 & 元组基础 Day 5 - 字典(dict)与集合(set) Day 6 - 综合实战:学生信息…...
CSS篇-3
1. CSS 中哪些样式可以继承?哪些不可以继承? 可继承的样式: 与字体相关的样式,如:font-size、font-family、color 列表样式:list-style(如 UL、OL 的 list-style-type) 不可继承的样式: 与布局和尺寸相关的样式,如:border、padding、margin、width、height 总结: …...
Unity使用Lua框架和C#框架开发游戏的区别
在Unity中使用Lua框架和C#框架开发游戏有显著的区别,主要体现在性能、开发效率、热更新能力、维护成本等方面。 1. 语言类型与设计目标 维度LuaC#类型动态类型、解释型脚本语言静态类型、编译型面向对象语言设计初衷轻量级嵌入、配置和扩展宿主程序通用开发&#…...
Go开发简历优化指南
一、简历格式与排版 (一)简洁至上 去除多余装饰:在 Go 后台开发简历中,应摒弃那些花哨却无实际作用的元素,比如复杂的封面、页眉、页脚等。设想招聘人员每日要处理大量简历,若你的简历有繁杂的封面设计&a…...

手机照片太多了存哪里?
手机相册里塞满了旅行照片、生活碎片,每次清理都舍不得删?NAS——一款超实用的存储方案,让你的回忆安全又有序~ 1️⃣自动备份解放双手 手机 / 电脑 / 相机照片全自动同步到 NAS,再也不用手动传文件 2️⃣远程访问像…...
【论文笔记】SecAlign: Defending Against Prompt Injection with Preference Optimization
论文信息 论文标题:SecAlign: Defending Against Prompt Injection with Preference Optimization - CCS 25 论文作者: Sizhe Chen - UC Berkeley ;Meta, FAIR 论文链接:https://arxiv.org/abs/2410.05451 代码链接:h…...
IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比
IP Search Performance Tests qqzeng-ip by 2025-06-01 测试环境: BenchmarkDotNet v0.15.0 macOS Sequoia 15.5 (24F74) [Darwin 24.5.0] Apple M4 Max, 1 CPU, 14 logical and 14 physical cores .NET SDK 10.0.100-preview.4.25258.110 [Host]: .NET…...

OpenRouter使用指南
OpenRouter 是一个专注于大模型(LLM)API 聚合和路由的服务平台,旨在帮助开发者便捷地访问多种主流大语言模型(如 GPT-4、Claude、Llama 等),并提供统一的接口、成本优化和智能路由功能。以下是它的核心功能…...
Linux 中 m、mm、mmm 函数和 make 的区别
在 Linux 内核开发和 Android 开发中,构建系统通常使用 make 命令来编译和构建项目。而在 Android 开发环境中,还有 m、mm 和 mmm 等命令,这些命令是 Android 构建系统的一部分,提供了更高效和便捷的构建方式。以下将详细介绍这些…...
【MAC】YOLOv8/11/12 转换为 CoreML 格式并实现实时目标检测
在本文中,我们将详细介绍如何将 YOLOv8/11/12 模型转换为 CoreML 格式,并使用该模型在摄像头实时检测中进行目标检测。主要适用于M1、M2、M3、M4芯片的产品。 以下教程在YOLOv8/11/12均适用,此处就以 YOLOv11 举例 目录 前提条件YOLOv8/11/12 转换为 CoreML实时目标检测结论…...
NodeJS全栈WEB3面试题——P7工具链 测试
📊 7.1 Truffle vs Hardhat:各自的优势? 项目TruffleHardhat📦 成熟度老牌框架,社区大,文档全面新一代框架,现代化设计🧪 测试支持内置 Mocha 测试框架支持 Mocha Chai,…...
Mybatis框架各配置文件主要内容详解(二)
ResultMap解决了数据库字段与实体类之间不一致导致的问题 <!--resultMap:设置自定义映射属性:id:表示自定义映射的唯一标识type:查询的数据要映射的实体类的类型子标签:id:设置主键的映射关系result&…...

【优选算法 | 队列 BFS】构建搜索流程的核心思维
算法相关知识点可以通过点击以下链接进行学习一起加油!双指针滑动窗口二分查找前缀和位运算模拟链表哈希表字符串模拟栈模拟(非单调栈)优先级队列 很多人学 BFS 的时候都知道“用队列”,但为什么一定是队列?它到底在整个搜索流程中起了什么作…...