SQL 注入系统学习(七):MySQL 高级边界与完整复盘
本文仅用于 CTF、靶场、本机实验和明确授权环境。文件写入、数据修改和高负载测试应限定在可恢复的专门环境中。 SQL 注入最终影响并不只由 Payload 决定。MySQL 版本、SQL mode、数据库驱动、账户权限、文件系统权限和应用反馈共同决定一条路线能否成立。 1. MySQL 文件读取1LOAD_FILE('/path/to/file') 能否读取通常取决于: 123456当前账户是否具备 FILE 权限mysqld 操作系统账户是否能读取目标文件secure_file_priv 是否允许该路径文件是否位于数据库服务器本机文件大小是否超过相关限制查询结果是否存在回显通道 发现 SQL 注入并不等于能够读取任意文件。 2. 文件写出12SELECT expressionINTO OUTFILE '/allowed/path/result.txt'; 12SELECT expressionINTO DUMPFILE '/allowed/path/result.bin'; 区别: 12INTO OUT...
SQL 注入系统学习(六):特殊注入点与组合场景
本文仅用于 CTF、靶场、本机实验和明确授权环境。 SQL 注入不只出现在 ?id=1。排序字段、搜索通配符、JSON 列清单、Cookie、请求头,以及从数据库再次取出的旧数据,都可能进入动态 SQL。 1. ORDER BY 注入危险代码: 12$sql = "SELECT id,name,price FROM products ORDER BY " . $_GET['sort']; 正常输入: 12pricecreated_at 这里的输入是列名或表达式,不是普通字符串值。 观察方法: 1234切换列名后结果顺序是否变化不存在列名是否产生 Unknown column数字是否按结果列位置排序条件表达式是否改变第一条记录 排序注入通常不改变响应长度,只改变顺序。 防御: 1234567$allowed = [ 'price' => 'price', 'newest' => 'created_at', ...
SQL 注入系统学习(五):WAF 与受限输入
本文仅用于 CTF、靶场、本机实验和明确授权环境。 WAF 题最容易陷入“随机换大小写、随机套编码”的循环。有效的分析方法不是收集最多的变形,而是回答:谁在检查输入、检查发生在哪次解码前后、过滤之后 MySQL 最终看到了什么。 1. 先判断拦截发生在哪一层输入通常经过: 1234567浏览器或代理编码→ Web 服务器解析→ WAF 检查→ 框架解码→ 应用过滤或类型转换→ 数据库驱动→ MySQL 解析 不同现象提供不同线索: 现象 可能位置 固定 403 页面 WAF 或 Web Server 跳转到统一错误页 应用或安全中间件 MySQL 语法错误 输入大概率到达数据库 关键词静默消失 应用删除型过滤器 数字前缀保留 类型转换或截断 2. 常见过滤器类型2.1 拒绝型123if (preg_match('/union/i', $input)) { die('blocked');} 2.2 删除型1$input = str_ireplace('union&...
SQL 注入系统学习(四):布尔与时间盲注
本文仅用于 CTF、靶场、本机实验和明确授权环境。时间测试应控制延时、并发和请求数量,避免影响环境可用性。 盲注的核心不是“爆破”,而是把看不到的数据改写成一系列能够观察的真假问题。 1. 什么是布尔盲注页面不显示数据库内容,但条件真假会产生稳定差异: 12条件为真 → 页面出现 Welcome条件为假 → 页面出现 Not found 在本地靶场中: 121 AND 1=11 AND 1=2 如果两者稳定对应不同页面,就建立了布尔反馈通道。 2. 先找稳定特征不要只比较完整响应长度,因为页面可能包含随机数、时间戳或动态 Token。 优先寻找: 123456固定文字是否存在JSON 中某个字段的值HTTP 状态码是否发生重定向第一条记录是否变化某个 HTML 节点是否出现 每组真假条件都应重复验证。 3. 判断长度假设目标是当前数据库名: 123LENGTH(DATABASE()) = 4LENGTH(DATABASE()) > 4LENGTH(DATABASE()) BETWEEN 1 AND 10 长度函数替代: 1234LENGTHOCTET_LEN...
SQL 注入系统学习(三):MySQL 函数与替代
本文仅用于 CTF、靶场、本机实验和明确授权环境。 面试中常见的问题是:“SUBSTRING() 被过滤怎么办?”真正稳妥的回答不是背另一个函数名,而是先说清楚原函数承担什么能力,再选择同义函数、等价表达式或另一条反馈通道。 1. 截取字符串12345SUBSTRING('abcdef',2,3) -- bcdSUBSTR('abcdef',2,3) -- bcdMID('abcdef',2,3) -- bcdLEFT('abcdef',2) -- abRIGHT('abcdef',2) -- ef SUBSTR()、MID() 是 SUBSTRING() 的同义形式。LEFT() 和 RIGHT() 适合从两端取值。 SUBSTRING 被过滤1234SUBSTRMIDLEFTRIGHT 逗号同时被过滤MySQL 支持标准语法: 123SUBSTRING('abcdef' FROM 2 FOR ...
SQL 注入系统学习(二):联合查询与元数据
本文仅用于 CTF、靶场、本机实验和明确授权环境。 上一篇解决的是“输入进入了什么 SQL 上下文”。这一篇继续处理有数据回显时最常见的路线:联合查询。 联合查询不是从 UNION SELECT 开始,而是先回答三个问题:原查询有几列、哪些列能承载目标数据、哪些列会显示在页面上。 1. UNION 的基本要求假设原查询是: 123SELECT id, usernameFROM usersWHERE id = 1; 联合另一条查询: 123SELECT id, username FROM users WHERE id = 1UNIONSELECT 100, 'demo'; 通常需要: 12345两边列数相同对应列的数据类型可以兼容输入位置允许形成第二条 SELECT应用会读取联合后的结果至少有一列能在页面中观察 因此,直接输入一长串 UNION SELECT 后报错,并不能判断漏洞是否存在。 2. 判断列数2.1 ORDER BY在本地靶场中逐步测试: 123ORDER BY 1ORDER BY 2ORDER BY 3 假设前两个正常,第三个出现...
SQL 注入系统学习(一):从输入到查询结构
本文中的测试方法仅用于 CTF、靶场、本机实验和明确授权环境。 刚开始学习 SQL 注入时,很容易把注意力全放在 Payload 上:看到 id 就加单引号,看到报错就试 UNION SELECT。这种方法偶尔能解题,但题目只要换一个引号、增加一层括号或隐藏错误,原来的 Payload 就失效了。 真正可以迁移的能力是:根据请求和响应,还原用户输入在 SQL 中的位置。 1. SQL 注入究竟是什么考虑一段危险的 PHP 代码: 123$id = $_GET['id'];$sql = "SELECT id, username FROM users WHERE id = $id";$result = mysqli_query($conn, $sql); 正常访问: 1/user.php?id=1 数据库收到: 123SELECT id, usernameFROM usersWHERE id = 1; 如果本地靶场中的输入是: 11 AND 1=2 最终查询变成: 123SELECT id, usernameFROM users...
SWPUCTF 2025 秋季新生赛 Writeup(全 8 题)
SWPUCTF 2025 秋季新生赛 Web 方向全部 8 道题解:从 SSTI 盲打到无字母数字 RCE,从反序列化全家桶到 SQL 注入 UDF 提权,一篇文章全收录。 目录 诚实大厅(SSTI 盲打) 我是复读机(Flask SSTI) DANGEROUS TRIAL(史莱姆四关) 光能族,哎呀(文件上传) FIRST MEETING(反序列化全家桶) php命令执行(无字母数字 RCE) sql仅仅只是sql吗(SQL注入+UDF提权) Punishing(战双帕弥什) 诚实大厅(SSTI 盲打) 题目主题:诚实大厅(”兄弟 GET ssti”)考点:SSTI 盲打(无回显 + 不出网 + 严格过滤)→ RCE → 写文件外带 题目描述页面提示:”兄弟 GET ssti”,参数为 ssti(GET),搜索框实际无回显。 题目分析 参数:?ssti=xxx(GET) 无回显:{{7*7}} 页面无变化 → 盲打题 有过滤:部分关键词返回 400 不出网:不能外带数据 解决...
URI解析链语义鸿沟-深度解析
URI解析链语义鸿沟 - 深度解析 一次 CTF 实战的完整复盘:为什么”同一个 URI 在不同组件中被解释为不同含义”会成为高级 Web 手的分水岭。 题目设定 技术栈:Jetty 12 + Spring Boot(嵌入式) 目标:读取 /WEB-INF/flag.txt 阻碍:① Jetty WEB-INF 保护 ② 自定义 ErrorController 吞掉所有异常 考点 1:WEB-INF 目录保护机制为什么要有 WEB-INF?这是 Java Servlet 规范规定的特殊目录,存放服务端资源: 12345WEB-INF/├── web.xml ← 部署描述符(路由、过滤器、Servlet 配置)├── classes/ ← 编译后的 Java 字节码(.class 文件)├── lib/ ← 依赖 JAR 包└── flag.txt ← 本题的 flag 核心规则:WEB-INF 下的文件只能由服务端代码访问(ServletContext.getResource()、JSP 转发等)...
BACCTF2024 Web Writeup
本文记录 BACCTF2024 部分 Web 方向题解。原文中的 Typora 本地截图路径已统一替换为 Hexo 可访问的 /img/ctf/bacctf2024/ 路径。 Tic-Tac-Toe这道题目是一个井字棋游戏 这个题目源码没什么好看 因为是小游戏 我们到network里面查看一下 找到了ws 那就轻松了 是一个WebSocket 状态篡改题 我们后面使用bp抓包 我们先随便过一个格子 然后后面在对这个position进行改动 返回包被拦截后一定要改动后放行 并且不能直接改动到赢的局面 一定要改动到赢前一步 JSLearning.com 给了js附件 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950import express from 'npm:express@4.18.2'const app = express();const flag = Deno.readTextFileSync(...