尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
(SQL注入学习)无回显的报错注入(Error-Based)
摘要本题主要考查对无回显的报错注入 实战使用方法。目录一、题目详情二、解题思路及原理1、登录绕过2、利用 updatexml 函数爆库名1完整函数输入2双写关键字实现绕过过滤机制4、利用 updatexml 函数爆字段名5、利用 updatexml 函数爆数据一、题目详情题目来源CTF²中的“[极客大挑战 2019]BabySQL”靶机环境启动靶机进入靶机http://bcb4835e85fc7c1a933a9d4d.http-ctf2.dasctf.com:80二、解题思路及原理1、登录绕过万能密码失效但可以得出1页面是不显示查询结果但会显示 SQL 报错信息2是字符型注入2、利用updatexml函数爆库名 and updatexml(1,concat(0x7e,(select database()),0x7e),1)#注页面会报错XPATH syntax error: ~test~从而拿到数据库名。and逻辑与把恶意条件拼进原查询。updatexml(xml_target, xpath_expr, new_value)是 MySQL 用来修改 XML 文档的函数。updatexml第1参数和第3参数这里随便给个1占位因为根本不打算真的修改只为触发报错无实际作用。updatexml第2个参数要求合法的 XPATH 表达式传入非法内容时会把内容原样带出报错XPATH syntax error: ...如果 XPath 格式错误MySQL 会抛出错误并把错误内容即你传入的字符串显示在报错信息里。通过看这个内容来判断我们的sql语句注入情况concat(0x7e, (子查询), 0x7e)把~ 子查询结果 ~拼成一个字符串作为非法 XPath。0x7e是~的十六进制作为边界标记方便从报错里截取有效内容updatexml()和extractvalue()函数在报错注入时报错信息中能回显的字符串长度最大就是 32 个字符。但为了能看到“~”边界标记这里设置默认为30个字符测试1完整函数输入注意看那个报错内容把我们的关键字进行过滤了因为select不见了。因为还不确定会不会过滤别的关键字但经过测试会把所有关键字过滤。此外从报错内容可以看到我们前面那个and和空格都不见了说明还会过滤空格和and。后续通过||或运算代替and把注入语句拼进原有查询空格过滤掉就不用写空格了。其实应该这么写才能代替and把注入语句拼入原有查询 || ... || 但后面我用用#把“||”注释掉了2双写关键字实现绕过过滤机制过滤逻辑是「检测到关键字就删除且只删一次」。绕过方法把关键字自身嵌套进自己中间删掉中间一份后剩余部分正好拼回原词原关键字双写形式删除一次后selectselselectectselectfromfrfromomfromwherewwhereherewhereoroorr嵌在单词里orsubstrsubsubstrstrsubstrlimitllimitimitlimit本题最大的坑过滤器不分单词边界直接删子串所以会误伤正常单词information_schema含or→ 被删成infmation_schema→ 需写成infoorrmation_schemapassword含or→ 被删成passwrd→ 需写成passwoorrd如何诊断会过滤哪些词报错回显里缺了哪个词下次就把哪个词双写。报错信息会原样显示最终执行的 SQL 片段对比自己提交的 payload 就能精确看出过滤名单。经测试需要输入以下的sql代码才能绕过拿到库名||updatexml(1,concat(0x7e,(selselectect database()),0x7e),1)#3、利用updatexml函数爆表名 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e),1)#子查询select group_concat(table_name) from information_schema.tables where table_schemadatabase()group_concat(table_name)聚合函数把多行table_name合并成一个逗号分隔的字符串。因为updatexml的第 2 参数只能接收单值若直接select table_name会返回多行而报错所以用group_concat把多行压成一行from information_schema.tablesinformation_schema是 MySQL 自带的元数据数据库tables表记录了所有库对应的所有表的信息where table_schemadatabase()过滤条件只取当前所在数据库的表database()返回当前数据库名。table_nameinformation_schema.tables里的字段即表的名字这个是标准写法但前面得知已经是存在过滤机制的故需要对过滤构建另一种写法。||updatexml(1,concat(0x7e,(selselectect(group_concat(table_name))frfromom(infoorrmation_schema.tables)whewherere(table_schemageek)),0x7e),1)#selselectect绕过「删一次」式过滤删除后还原成selectfrfromom同上还原成frominfoorrmation_schema绕过对or/information的过滤大量()打断 WAF 正则的连续关键词匹配同时不破坏 SQL 语法||替代and/or绕过关键词过滤括号在 SQL 里本来就可用于包裹子查询/表达式(select ...)→ 子查询合法(group_concat(...))→ 函数调用加括号合法from (information_schema.tables)→ 表名加括号合法where (table_schemageek)→ 条件加括号合法结果如下拿到了两个表根据做题经验flag一般藏在b4bsql中。4、利用updatexml函数爆字段名 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_name表名),0x7e),1)#同上这里不过阐述。这个是标准写法但前面得知已经是存在过滤机制的故需要对过滤构建另一种写法。||updatexml(1,concat(0x7e,(selselectect(group_concat(column_name))frfromom(infoorrmation_schema.columns)whwhereere(table_nameb4bsql)),0x7e),1)#测试结果如下得到了字段名为id、username、password5、利用updatexml函数爆数据 and updatexml(1,concat(0x7e,(select group_concat(字段1,0x3a,字段2) from 表名),0x7e),1)#同上这里不过阐述。这个是标准写法但前面得知已经是存在过滤机制的故需要对过滤构建另一种写法。||updatexml(1,concat(0x7e,(selselectect(subsubstrstr(group_concat(username,:,passwoorrd),N,30))frfromom(b4bsql)),0x7e),1)#由于每次回显的是30个字符故需要修改参数N依次取 1, 31, 61, 91, 121, 151, 181, 211直到最后界面上显示的是~~即为输出结果。substr(..., N, 30)从第 N 位开始取 30 个字符——解决 32 字符回显上限group_concat(username, 0x2d, password)把多行username-password拼成一行N1N31N61N91N121N151N181开始出现flag了就快拿到了N211其实这里已经拿到完整的flag但我还想看看后面是啥。N241看到出现“~~”显示输出结束的标志了
RELATED

相关推荐

OpenRig:基于Node.js+tmux+YAML的本地Codex开发环境构建指南

OpenRig:基于Node.js+tmux+YAML的本地Codex开发环境构建指南

1. OpenRig 是什么:一个被误读的开源项目名与真实技术图谱 OpenRig 这个词在当前中文技术社区里,正经历一场典型的“语义漂移”——它既不是某个广为人知的成熟开源项目(如 OpenCV、OpenSSH),也不是官方发布的标准化工…

📅 2026/10/4 6:22:47
VS2019+Qt+OpenCV图像显示:Mat转QImage的环境配置与避坑指南

VS2019+Qt+OpenCV图像显示:Mat转QImage的环境配置与避坑指南

简介:面向需要在VS2019中集成Qt与OpenCV开展图像处理的开发者,这套工程示例完整演示了从环境配置、图像读取到界面显示、灰度转换、平滑滤波等基础操作,代码注释与项目预设齐全,适合计算机视觉初学者快速上手,也可作为…

📅 2026/10/4 6:22:47
深入PenguinHarness架构:SDK、Server、CLI与Web接口边界设计完整解析

深入PenguinHarness架构:SDK、Server、CLI与Web接口边界设计完整解析

深入PenguinHarness架构:SDK、Server、CLI与Web接口边界设计完整解析 【免费下载链接】penguin-harness 🐧 Unified and Stable RSI Platform 项目地址: https://gitcode.com/gh_mirrors/pe/penguin-harness PenguinHarness 是一个开源、本地优先…

📅 2026/10/4 6:17:47
MORE NEWS

更多资讯

📰

夜间老鼠检测数据集:VOC+YOLO双格式316张图565框实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

GitHub Trending日榜观察:AI工具、本地应用与学习资源趋势解析

早上七点出头,我照例打开GitHub的Trending页面,准备给今天的技术雷达做个晨检。2026年9月29日,周二,这份日榜比我预想的更有意思:前排依旧是AI相关项目的天下,但仔细看下来,上榜的仓库类型和三个…

📰

UVM序列响应与寄存器模型:从八个包卡死到镜像值同步实战解析

写这个UVM和SystemVerilog系列笔记已经到第四期了。前几期把验证环境的基本骨架、objection机制、sequence和driver之间的握手流程、还有factory和config_db的常见用法都过了一遍,评论区有不少朋友催更,也有人私信问“为啥我的sequence回包没处理&#x…

📰

插件系统从加载失败到排查:IAR、Web Boot与MusicFree实战拆解

做了这么多年开发,我早就把“插件”这个词从功能名词变成了排障关键词。plugins这个标签背后,既有嵌入式IDE里那些帮你多长一只手的功能扩展,也有Web应用启动时那一行让人头皮发麻的加载报错,还有音乐播放器里充满黑话的“接口模板…

📰

Agent Skill 从能跑到稳定跑:SKILL.md 编写原则与实战指南

1. 从“能跑”到“好用”:Skill 到底在解决什么问题这两年做 Agent 的人越来越多,但真正把 Agent 落到生产环境里的人都会遇到同一个坎:模型本身够聪明,工具也接了一堆,可一到具体任务上,输出就是不稳定。同…

📰

把AI对话存成笔记:Agent Client for Obsidian的Chat Export导出技巧与最佳实践

把AI对话存成笔记:Agent Client for Obsidian的Chat Export导出技巧与最佳实践 【免费下载链接】obsidian-agent-client Bring AI agents into Obsidian via Agent Client Protocol (ACP), such as Claude Code, Codex and Gemini CLI. 项目地址: https://gitcode…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬