`

MySQL udf 获取linux文件修改时间

阅读更多

 

getFileModifiedTime.c

 #include <mysql.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <errno.h>
    #include <unistd.h>
    #include <stdint.h>

    /*资源分配*/
    my_bool getFileModifiedTime_init(UDF_INIT *initid, UDF_ARGS *args, char *message);

    /*自定义函数*/
    char *getFileModifiedTime(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error);

    /*资源回收*/
    void getFileModifiedTime_deinit(UDF_INIT *initid);

    /*
      参数说明:
             UDF_INT *initid
               UDF_INIT 指针可以用于将分配好的资源传递给其他函数使用。

             UDF_ARG *args
               UDF_ARG 指针

             char *message
               出错信息指针

      返回值 0 成功, 1 失败
     


   
     
    针对UFD_INT和UDF_ARG的成员做一个简单说明。
    typedef struct st_udf_args
    {
      unsigned int arg_count; 参数个数
      enum Item_result *arg_type; 参数类型
      char **args; 参数指针
      unsigned long *lengths; 参数长度
      char *maybe_null; 是否可以为空,1表示可以为空
      char **attributes; 参数属性的指针
      unsigned long *attribute_lengths; 参数属性的指针指向内容的长度
      void *extension;                                            扩展指针
    } UDF_ARGS;


    typedef struct st_udf_init
    {
      my_bool maybe_null; 1表示返回值可以为空
      unsigned int decimals; 可以用来设置double类型小数点后的长度
      unsigned long max_length; 自定义字符串函数返回结果的最大长度
      char *ptr; 字符串指针 一般init里面分配的内存可以把地址给ptr,用于传递到其他函数,比如deinit里面释放分配的内存
      my_bool const_item; 函数是否返回固定结果
      void *extension;                         扩展指针
    } UDF_INIT;
    */

  
 /* init函数在getFileModifiedTime函数执行前调用*/
    my_bool getFileModifiedTime_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
    {
        if(args->arg_count==1
        &&      args->arg_type[0]==STRING_RESULT
        ){
                initid->maybe_null = 1;
                return 0;
        } else {
                strcpy(
                        message
                ,       "Expected exactly one parameter(STRING filePath)"
                );
                return 1;
        }
    }

    /*
      参数说明:
             UDF_INT *initid
               同init函数

             UDF_ARG *args
               用于读取穿进来参数的信息:传入的值,传入值的长度 ,类型等等,具体看上面结构体的说明

     *result
              保留参数

            *length
              用于设置返回值的长度

            *is_null
              是否为空

            *error
                 如果设置为1自定义函数将不被再调用
*/
    char *getFileModifiedTime(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
    {

        struct stat attr;
        int tmpResult = -1;
        static char str_time[20];
        struct tm *local_time = NULL;
        time_t utc_time;

        tmpResult=stat(args->args[0], &attr);
        if (tmpResult == -1 ) {
                *length=0;
                return NULL;
        }
        /**length=strlen(ctime(&attr.st_mtime));        
        return ctime(&attr.st_mtime);*/

        utc_time = attr.st_mtime;
        local_time = localtime(&utc_time);
        strftime(str_time, sizeof(str_time), "%Y-%m-%d %H:%M:%S", local_time);
        *length=sizeof(str_time);
        return str_time;
    }

 /* deinit函数在getFileModifiedTime函数执行完调用*/
    void getFileModifiedTime_deinit(UDF_INIT *initid)
    {
     if(initid->ptr){
             free(initid->ptr);
      }
      return;
    }




 


gcc -shared -o getFileModifiedTime.so  getFileModifiedTime.c -I /usr/include/mysql

sudo cp getFileModifiedTime.so  /usr/lib/mysql/plugin/

mysql@localhost:(none) 05:31:46>create function getFileModifiedTime returns string soname "getFileModifiedTime.so";

mysql@localhost:(none) 05:31:46>select getFileModifiedTime("/home/haibo/script/c/getFileModifiedTime.c");
+-------------------------------------------------------------------+
| getFileModifiedTime("/home/haibo/script/c/getFileModifiedTime.c") |
+-------------------------------------------------------------------+
| 2016-11-10 17:02:04                                               |
+-------------------------------------------------------------------+
备注:只适合[linux/unix]

0
4
分享到:
评论

相关推荐

    mysql提权4大招数mysql提权4大招数

    本文将详细阐述 MySQL 提权的四种常见方法:UDF 提权、VBS 提权、WebShell 提权以及 Linux 下的 MySQL Backdoor 提权。 #### 一、UDF 提权 **UDF(User Defined Function)提权** 是指通过创建自定义函数来执行...

    mysql配置http相关包

    4. 配置MySQL服务器以允许HTTP访问,这可能涉及到修改`my.cnf`配置文件,添加相应的安全设置和权限。注意,通过HTTP传输数据可能存在安全风险,因此需要谨慎设置防火墙规则和访问控制。 5. 最后,测试HTTP UDF功能...

    MySql5.0安装程序

    1. **下载安装包**:用户可以从MySQL官方网站或第三方下载站点获取MySQL5.0.22的安装程序,确保下载的是适合自己操作系统的版本,如Windows、Linux或Mac OS。 2. **运行安装程序**:在Windows环境下,双击下载的....

    学习MySQL的资料和练习.zip

    - **下载与安装**:MySQL可以从官方网站下载,有多种操作系统版本,如Windows、Linux、Mac OS等。 - **配置MySQL服务器**:包括设置用户、密码、端口、数据存储路径等。 3. **数据库与表** - **创建数据库**:...

    晨讲面试题.docx

    - 权限提升是关键,针对Windows系统,可能存在MySQL UDF提权、Serv-U提权或旧版本漏洞(如IIS6、PR、巴西烤肉),而在Linux环境下,脏牛漏洞、内核版本漏洞和MySQL、Oracle的提权策略同样重要。完成攻击后,清理...

    渗透测试面试题2019版.pdf

    - MySQL数据库的UDF提权、Serv-U提权等。 - Windows系统下的溢出提权、Linux系统下的脏牛漏洞、内核版本漏洞提权等。 ### 清除测试痕迹与报告编写 **4. 清理测试数据** - 在完成渗透测试后,确保清除所有测试...

    Web渗透-网络安全面试 面试宝典 2023最新版65页超全解析.pdf

    4. **权限提升**:在获得初步权限后,可能需要进一步提权,例如Windows下的MySQL UDF提权、Linux脏牛漏洞提权等。 5. **安全开发生命周期**(SDLC)和源代码审计:强调了在开发阶段就考虑安全的重要性,通过审计源...

    Web渗透面试面试集锦.docx

    5. **权限提升** 是渗透测试的关键步骤,涉及Windows和Linux下的提权技术,如MySQL UDF、Serv-U、脏牛漏洞等。 6. **日志清理** 是为了防止留下痕迹,消除攻击证据。 7. **CMS识别** 有助于找到已知的CMS漏洞,而*...

    DataX Web分布式数据同步工具-其他

    29、公共字段(创建时间,创建人,修改时间,修改者)插入或更新时自动填充 30、对swagger接口进行token验证 31、任务增加超时时间,对超时任务kill datax进程,可配合重试策略避免网络问题导致的datax卡死。 32、...

Global site tag (gtag.js) - Google Analytics