Getshell Via phpmyadmin SQL Execution In /import.php To Writ
目录 1 . 漏洞描述 2 . 漏洞触发条件 3 . 漏洞影响范围 4 . 漏洞代码分析 5 . 防御方法 6 . 攻防思考 1. 漏洞描述 phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接
目录
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(''); select cmd from a into outfile ' C:/htdocs/1.php'; Drop TABLE IF EXISTS a; DROP TABLE IF EXISTS `a`; ----1--- ----2--- select ''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|dumpfile)/sim", $import_text, $matches)) { echo "request error!" . "" . $matches[0]; die(); }
要特别注意的是,在使用PHP的正则匹配引擎的时候,需要考虑到换行场景下的bypass风险
还需要注意的,MYSQL存在很多扩展语法,例如
1. 定义存储过程 2. 定义函数 3. 定义触发器 4. 使用语法预处理编译 /* prepare stmt from 'select count(*) from information_schema.schemata'; 这里待编译的sql语句也可以进行字符变形以此进行bypass execute stmt; */
Relevant Link:
http://php.net/manual/en/function.preg-match.php#111573 http://blog.sina.com.cn/s/blog_3fe961ae01013r8f.html
6. 攻防思考
Copyright (c) 2014 LittleHann All rights reserved
下一篇: PHP初学者最感迷茫的问题小结_PHP