【八个月网安课程】第五周·周二:数字型与字符型注入检测,闭合方式

【八个月网安课程】第五周·周二:数字型与字符型注入检测,闭合方式 今天你首次真正地“攻击”一个 Web 应用学会如何通过简单的符号和逻辑判断来发现 SQL 注入点并精准确定闭合方式。这是手工注入的起手式也是区分脚本小子与安全研究者的关键分水岭。第五周·周二数字型与字符型注入检测闭合方式 今日学习目标达成效果能准确区分数字型注入与字符型注入的原理参数是否被引号包裹决定了注入语法能通过简单的输入测试添加单引号、双引号、运算符号判断目标参数是否存在 SQL 注入漏洞能识别数据库错误信息并从中推断出服务器使用的数据库类型以及大致的 SQL 语句结构能熟练使用注释符(--、#) 截断原始语句的后续部分构造属于自己的可控查询能在 sqli-labs Less-1 中独立找出闭合方式为单引号闭合并成功使用 OR 11使 SQL 语句逻辑永真能写出完整的注入 payload解释每一步符号的作用闭合、逻辑操作、注释。 一、SQL 注入的本质打破原有语句结构SQL 注入漏洞发生在用户输入被拼接到 SQL 查询语句中且未作任何过滤或参数化。正常登录查询可能是SELECT*FROMusersWHEREusernameadminANDpasswordpass123;如果用户输入的用户名是admin --拼接后就变成SELECT*FROMusersWHEREusernameadmin-- AND password...;第一个单引号闭合了原本的引号--是 SQL 单行注释后面的所有语句都被数据库忽略最终执行的逻辑变为usernameadmin成立就返回用户密码验证被完全绕过。这就是注入的核心用特殊字符打破代码与数据的边界。今天我们将系统学习如何寻找这个“边界”并确定需要用什么符号来闭合它。 二、数字型注入 vs 字符型注入根据参数在 SQL 语句中是否被引号包围注入分为两类它们的检测方法截然不同。1. 数字型NumericSQL 中类似SELECT * FROM news WHERE id123参数123没有引号直接是数字。检测方法算数运算输入11如果页面返回 id 为 2 的内容说明运算被执行存在注入输入1-1如果返回 id0 的内容也证实了注入。逻辑判断and 11页面正常and 12页面异常或内容消失说明注入存在因为id123 and 12永远不成立查询无结果。闭合需求数字型不需要闭合引号可直接追加逻辑但若需要 UNION 查询可能需要注释掉后续排序等。2. 字符型StringSQLSELECT * FROM users WHERE usernameadmin参数admin被单引号或双引号包围。检测方法添加单引号输入adminSQL 变成... usernameadmin多出一个引号导致语法错误。如果页面显示数据库错误或白屏说明输入未经处理直接进入 SQL极可能存在注入。永真/永假测试如果能确定闭合符号尝试 OR 11需要正确闭合。比如对于单引号闭合 OR 11 --会使得 WHERE 条件永真返回所有数据。闭合方式必须知道前面使用的是什么引号以及是否有括号。常见的闭合组合单引号双引号)单引号括号)双引号括号))等嵌套形式如何确认闭合通过报错信息或逐步尝试。典型方法输入\反斜杠有时可以转义后面的引号而暴露原始语句在某些编码下更通用的方法是使用注释符和永真条件不断测试直到页面正常且逻辑成立。 三、注释符截断语句的利器确定闭合后我们需要把原始语句后面多余的部分如 AND password...注释掉才能自由控制查询。不同数据库的注释符有差异MySQL 支持以下三种注释符说明示例--(两个短横空格)单行注释注意必须后面有空格或控制符在 URL 中常写作--会被解码为空格 OR 11 --#单行注释不需要空格但 URL 中#通常用于锚点不会被发送到服务器因此常使用%23(URL编码的#) OR 11 %23/*...*/多行注释用于绕过某些过滤或注释掉一段代码 UNION SELECT 1,2,3 /*今天重点使用--或%23。✍️ 四、动手实践搭建 sqli-labs 靶场并对 Less-1 进行注入检测Sqli-labs 是经典的 SQL 注入练习平台包含了各种闭合和过滤的关卡。我们今天先攻克 Less-1。1. 安装 sqli-labs 环境使用 Docker 最简单如果你已有 PHP 环境如 Apache MySQL可以手动部署。更推荐使用 Dockerdockerpull acgpiano/sqli-labs# 或 vulhub 中的 sqli-labsdockerrun-d-p80:80 acgpiano/sqli-labs或者本地搭建将 sqli-labs 源码放到 Web 目录设置好数据库连接。为了实验方便可以临时使用公开在线靶场但注意稳定性例如http://sqli-labs:8080/假设务必确认是自己搭建的。假设服务运行在http://192.168.1.100:80本地虚拟机或本机我们开始。2. Less-1 页面分析访问http://192.168.1.100/Less-1/你会看到一个提示Please input the ID as parameter with numeric value。正常访问?id1会显示用户信息Your Login name:Dumb, Your Password:Dumb等。此时后台 SQL 类似SELECT*FROMusersWHEREid1LIMIT0,1注意 id 是被单引号包围的这是一个字符型注入。3. 检测注入点数字型测试?id1 and 12页面无变化或仍正常显示因为1被视为字符串and 12是在字符串外部可能没有作用。数字型测试不能直接判断。字符型测试加单引号?id1。页面返回错误You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 1 LIMIT 0,1 at line 1错误信息中可以看到1说明多出一个引号。这证实了注入点存在且是单引号闭合。永真条件测试尝试?id1 and 11。原始语句变为WHERE id1 and 11 LIMIT 0,1这是合法的页面正常显示 id1 的数据。再尝试?id1 and 12页面无显示因为条件为假。这进一步确认注入有效且闭合方式就是。使用注释符关闭多余部分?id1 ----中--注释掉后面的LIMIT 0,1页面正常。至此闭合方式确定为单引号。4. 经典永真注入?id1 OR 11 --SQL 变成SELECT*FROMusersWHEREid1OR11-- LIMIT 0,1OR 11使得整个 WHERE 条件永真返回所有用户。实际页面会显示多组用户名密码由于 PHP 代码可能只取一行Less-1 默认显示第一行但仍可证明注入成功。你还可以尝试?id-1 OR 11 --以查看其他数据。 五、课后测试题与解析测试题在 sqli-labs Less-1 中找出闭合方式。请描述你的测试步骤以及最终确定的闭合符号。参考答案与步骤访问http://靶机/Less-1/?id1页面正常显示用户信息添加单引号测试?id1页面返回数据库语法错误提示1 LIMIT 0,1。说明参数被单引号包围且单引号未过滤尝试双引号测试?id1可能无报错或不同排除双引号闭合Less-1 仅单引号使用?id1 and 11页面正常?id1 and 12页面异常证明注入逻辑生效且闭合方式为单引号使用注释符闭合?id1 --正常最终确定闭合方式为单引号。核心 payload OR 11 --分解第一个用于闭合前端的引号OR 11添加永真条件且末尾的1实际是用来与后面的原单引号配对让语法正确虽然被注释掉了但为了严谨--注释掉后续的 LIMIT 0,1等避免干扰。✅ 今日学习效果自检清单我能区分数字型注入与字符型注入并分别说出各自的检测方法我亲手在 sqli-labs Less-1 中通过加单引号触发了数据库错误我使用 and 11和 and 12确认了注入存在我知道了至少两种注释符的用法--和%23我成功通过 OR 11 --改变了查询逻辑我明白了闭合的本质让用户输入跳出数据区域进入代码区域⚠️ 阶段避坑重点注释符空格不可丢--后面必须有空格或#URL 编码中常使用-- 解码为空格或--%20。如果忘记空格注释无效可能导致语法错误。区分大小写和数据库特性MySQL 中--可行而#注释在 URL 中需编码为%23。Access 不支持注释符但通常有限制。不要只依赖报错有的站点关闭了错误显示这时使用永真/永假测试盲注今天先掌握有报错的容易情况。测试时记录每一种尝试闭合方式可能多种形成表格记录养成良好的手工渗透习惯。明天我们将深入学习联合查询注入UNION SELECT手工步骤利用今天找到的闭合方式在 Less-1 中逐步获取数据库名、表名和字段名。请确保你的 sqli-labs 环境正常运行明天将直接进入实战数据提取。