2026/1/10 15:18:32
网站建设
项目流程
网站推广每天必做的流程,阿里云备案网站备案,重庆市建设工程信息网 最权威平台中项网,烟台哪家公司可以做网站第一关
先来判断是否可以在url上直接打开地址栏#xff0c;post传入的内容是否直接会拼接到数据库语句中?id1%20%27and%2012%20--%20ads%20是空格的url的代码具体操作流程如下1,判断是否是注入类型
若输入 ?id1 页面正常#xff0c;输入 ?id1 页面报错#xff0c;就证明了…第一关先来判断是否可以在url上直接打开地址栏post传入的内容是否直接会拼接到数据库语句中?id1%20%27and%2012%20--%20ads%20是空格的url的代码具体操作流程如下1,判断是否是注入类型若输入 ?id1 页面正常输入 ?id1 页面报错就证明了单引号闭合的字符型注入存在。?id1%20%27and%2012%20--%20ads?id1%20%27and%2011%20--%20ads百分号27是单引号看两个显示结果会不会变2,判断字段ORDER BY 关键字的核心作用MySQL 语法用于对查询结果集进行排序语法格式为 ORDER BY 字段名/字段索引。这里的关键特性ORDER BY 支持用数字「字段索引」代替字段名数字 N 表示 “对查询结果的第 N 个字段进行排序”。步骤 2判断字段数order by用 order by N 猜解查询的字段数量输入 ?id1 order by 1---- 是注释符让后面的 SQL 失效页面正常。输入 ?id1 order by 2--页面正常。输入 ?id1 order by 3--页面正常。输入 ?id1 order by 4--页面报错说明字段数是 3。3确定回显位置-1 union select 1,2,3--输入 ?id-1 union select 1,2,3--页面显示 2 和 3确定这两个位置为回显位。数据库原理拆解UNION SELECT 联合查询的核心规则MySQL 语法用于将两个或多个 SELECT 语句的查询结果集合并为一个结果集返回。必须满足核心前提条件多个 SELECT 语句查询的「字段数量必须相同」且对应字段的数据类型兼容否则报错。例如SELECT 1,2,3 UNION SELECT 4,5,6; 合法均为 3 个字段SELECT 1,2 UNION SELECT 3,4,5; 非法字段数不一致。为什么要用 id-1原始 SQL 中 id1 会查询到有效数据存在 id1 的用户此时 UNION SELECT 的结果集会被原始查询结果覆盖页面只显示原始数据无法看到联合查询的内容。传入 id-1拼接后的 SQL 为 SELECT * FROM users WHERE id-1 UNION SELECT 1,2,3--;由于数据库中不存在 id-1 的用户原始查询结果集为空。根据 MySQL 联合查询的规则当第一个 SELECT 结果集为空时会直接显示第二个 SELECT联合查询的结果集这是我们能看到 1,2,3 的关键。回显位置的含义页面最终显示 2 和 3说明原始 SQL 查询结果集中第 2 个和第 3 个字段的内容会被渲染到页面上第 1 个字段可能不显示或被隐藏。后续我们只需要将 2 和 3 替换为实际的查询语句如查数据库名、账号密码就能让查询结果在页面上显示出来这是联合查询注入的核心价值。4查询数据库信息核心注入操作操作回顾通过替换回显位的 2,3依次查询数据库名、表名、字段名、账号密码。数据库原理拆解分步骤解析1. 查询当前数据库名?id-1 union select 1,database(),3--database()MySQL 内置系统函数作用是返回当前正在使用的数据库名称即原始 SQL 所属的数据库。拼接后的 SQL 为SELECT * FROM users WHERE id-1 UNION SELECT 1,database(),3--;原理联合查询的第 2 个字段被替换为 database()数据库执行该函数后返回当前数据库名通常是 security并通过页面的回显位展示出来。2. 查询数据库中的表名group_concat(table_name) information_schema.tables核心语法SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schemadatabase();各部分原理拆解information_schema.tables系统数据库 information_schema 中的 tables 表存储了 MySQL 中所有数据库的表元数据包括数据库名 table_schema、表名 table_name、表类型等。WHERE table_schemadatabase()过滤条件只查询当前数据库database() 返回的结果中的表避免查询到其他数据库如 mysql、information_schema的表。group_concat(column_name)MySQL 内置聚合函数作用是将多行查询结果拼接为一行字符串返回用逗号分隔。若不用 group_concat()直接 SELECT table_name联合查询只会返回单行结果默认只取第一行无法看到所有表名用 group_concat() 可以将所有表名emails,referers,uagents,users拼接为一行一次性在回显位展示完整这是注入中高效查询多行数据的核心技巧。拼接后的 SQL 执行后会从 information_schema.tables 中提取当前数据库的所有表名拼接后通过回显位展示。3. 查询 users 表的字段名group_concat(column_name) information_schema.columns核心语法SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schemadatabase() AND table_nameusers;各部分原理拆解information_schema.columns系统数据库 information_schema 中的 columns 表存储了 MySQL 中所有表的字段元数据包括数据库名 table_schema、表名 table_name、字段名 column_name、字段类型等。过滤条件 table_schemadatabase() AND table_nameusers精准定位「当前数据库」中的「users 表」只查询该表的字段信息。同样使用 group_concat(column_name) 将所有字段名id,username,password拼接为一行通过回显位完整展示。4. 查询 users 表的账号密码group_concat(username,:,password)核心语法SELECT group_concat(username,:,password) FROM users;各部分原理拆解users 表是 SQLi-Labs 中存储管理员账号密码的核心业务表从步骤 2 中查询得到。username,:,passwordMySQL 中支持用逗号 , 拼接字符串这里将 username用户名、分隔符 :、password密码拼接为一个字符串如 admin:admin方便阅读。group_concat()将 users 表中所有行的账号密码拼接为一行一次性展示所有数据避免多次查询高效获取全部核心信息。拼接后的 SQL 执行后数据库会从 security 数据库的 users 表中提取所有账号密码通过回显位展示完成核心注入目标。总结整个注入流程的核心是篡改后台原始 SQL利用 MySQL 语法特性注释符、ORDER BY、UNION SELECT、系统表 / 函数实现非法查询。关键节点闭合单引号突破字符型注入限制→ 猜字段数满足联合查询前提→ 找回显位获取查询结果出口→ 查元数据通过 information_schema 获取核心信息。所有操作的底层支撑都是 MySQL 的基础语法和系统表 / 函数的特性这也是 SQL 注入的核心第二关和上面只有闭合方式的区别闭合方式为双引号第三关和上面只有闭合方式的区别闭合为单引号和括号第四关和上面只有闭合方式的区别闭合为单引号和括号SQLi-Labs 5-7 关原理讲解注入类型与核心技巧这三关分别对应报错注入、盲注布尔型、盲注时间型第五关核心特征页面只返回 “正确 / 错误” 提示无数据回显但会输出 SQL 语法错误信息如 “you have an error in your SQL syntax”。SELECT * FROM users WHERE id$id LIMIT 0,1;利用MySQL 报错函数如extractvalue()、updatexml()让数据库在执行恶意 SQL 时抛出错误并将查询结果嵌入错误信息中返回实现 “无回显下获取数据”。常用报错函数extractvalue()语法extractvalue(1, concat(0x7e, 查询语句, 0x7e))作用从 XML 文档中提取值当第二个参数包含特殊字符如~时会抛出错误并显示参数内容。示例查数据库名plaintext?id1 and extractvalue(1,concat(0x7e,database(),0x7e))--页面会返回错误XPATH syntax error: ~security~其中security就是数据库名。updatexml()原理与extractvalue()类似语法updatexml(1, concat(0x7e, 查询语句), 1)。核心逻辑通过构造包含报错函数的 SQL强制数据库输出错误信息间接获取查询结果无需页面回显数据。第六关核心特征页面仅返回 “存在数据” 或 “不存在数据”如 “you are in”/“you are not in”无任何错误提示或数据回显。原始 SQLsqlSELECT * FROM users WHERE id$id LIMIT 0,1;字符型注入双引号闭合原理利用SQL 逻辑判断的布尔结果true/false通过 “逐字符猜解” 的方式获取数据。核心技巧逐字符判断利用substr()、ascii()函数substr(目标字符串, 位置, 1)截取字符串指定位置的字符ascii(字符)将字符转换为 ASCII 码值。示例猜数据库名第 1 个字符plaintext?id1 and ascii(substr(database(),1,1))100--一键获取完整项目代码若页面显示 “you are in”说明数据库名第 1 个字符的 ASCII 码大于 100逐步缩小范围最终确定字符如security的第 1 个字符s的 ASCII 码是 115。核心逻辑通过构造逻辑判断语句根据页面的 “存在 / 不存在” 提示逐个字符推导目标数据效率低但适用于无回显、无报错的场景。第七关核心特征页面无任何回显、无错误提示无论 SQL 是否正确页面均显示相同内容。原始 SQLsqlSELECT * FROM users WHERE id((($id))) LIMIT 0,1;字符型注入单引号 括号闭合需用)))闭合原理利用MySQL 的延时函数sleep(N)通过 “是否延时” 判断 SQL 逻辑的布尔结果进而逐字符猜解数据。核心技巧延时判断结合if()函数语法if(条件, sleep(3), 1)作用若条件为真数据库延时 3 秒执行若为假立即执行。示例猜数据库名第 1 个字符plaintext?id1))) and if(ascii(substr(database(),1,1))115, sleep(3), 1)--若页面加载时间超过 3 秒说明条件为真数据库名第 1 个字符是s若立即加载说明条件为假需调整字符的 ASCII 码值。第八关第 8 关布尔盲注单引号闭合无任何回显增强版核心特征页面仅返回两种状态You are in...........条件为真、无该提示 / 空白页面条件为假无错误回显、无数据回显。与第 6 关核心逻辑一致仅闭合方式不同属于纯布尔盲注场景。原始 SQLsqlSELECT * FROM users WHERE id$id LIMIT 0,1;字符型注入单引号闭合无报错输出是第 6 关的单引号版本原理与第 6 关布尔盲注核心原理完全一致利用SQL逻辑判断的布尔结果通过substr()截取字符、ascii()转换 ASCII 码逐字符猜解数据。核心差异第 6 关是双引号闭合第 8 关是单引号闭合注入语句前缀需对应调整。?id1 and ascii(substr(database(),1,1))115--第九关第十关第十一关注入点从URL 的 GET 参数转移到页面的 POST 表单参数用户名uname、密码passwd。页面有登录成功 / 失败提示Your Login name or Password is wrong支持报错注入或布尔盲注。原始 SQLSELECT * FROM users WHERE username$uname AND password$passwd LIMIT 0,1;字符型注入单引号闭合POST 参数传递无数据回显但有登录状态反馈原理POST 注入与 GET 注入的核心区别GET 注入参数通过 URL 传递可直接在地址栏构造语句。POST 注入参数通过 HTTP 请求体传递需借助工具如 Burp Suite或浏览器开发者工具构造表单数据。注入核心逻辑与 GET 型字符注入一致先闭合单引号再构造注入语句最后用注释符注释多余内容。示例用报错注入查数据库名在uname字段输入plaintextadmin and extractvalue(1,concat(0x7e,database(),0x7e))--密码字段可任意输入如123提交后页面会返回报错信息包含当前数据库名。核心逻辑注入原理与 GET 型注入一致仅参数传递方式不同需掌握 POST 表单数据的构造方法。