[CVE-2014-8959] phpmyadmin任意文件包含漏洞分析
2015-07-07 23:07
1131 查看
首发360播报:http://bobao.360.cn/learning/detail/113.html
最近写的文章比较喜欢投递到各大平台,一是能赚点学费养家糊口,二是提高一下原创性。我发现如果文章发到一些社区或直接发博客,知名度不高很容易被转载以后不署名,导致转来转去后来就不知道谁是作者了。写了这么久文章也没给博客带来什么知名度,大概也就是因此吧。不如先发到各大平台再发到自己博客,总之也能赚点钱。
有时候好东西不是不愿分享,就是国内分享环境太差,开源程序不遵守协议、转载文章不带链接、插件模板随便去除版权,屡屡皆是。特别是“红黑联盟”等百度SEO做的比较好的网站,爬下来东西从来不带链接,到头来我是转载他是原创,那么我分享的意义何在,就是在为嘿产妞们铺平道路么?
这段时间和牙僧哥都在对open_basedir做一些研究,也发现了一些好玩的东西,php全版本已经可以绕过open_basedir读文件、列目录了,不知道离写文件还有多远,还是很期待的。
0x01 补丁分析
看到bobao.360.cn上提到了这个漏洞,于是我写个小分析吧,给渗透正没思路的人一个思路,也给学习代码审计的朋友一点资料。
前几天phpmyadmin出了个新的补丁,地址在此:http://www.phpmyadmin.net/home_page/security/PMASA-2014-14.php
修复了一个phpmyadmin4.x版本中的任意文件包含漏洞,我们看一下4.0版本的补丁:https://github.com/phpmyadmin/phpmyadmin/commit/2e3f0b9457b3c8f78beb864120bd9d55617a11b5
在文件libraries/gis/pma_gis_factory.php中对$type_lower多加了个判断。由此我们可以猜测,文件包含的点就出在$type_lower这里。
0x02 漏洞代码分析
我们来到libraries/gis/pma_gis_factory.php 29行:
将传入的参数$type转换小写以后赋值给$type_lower,直接拼接成路径进行include_once。
我们来搜一下factory这个函数:
很多地方在调用,但最直接的还是/gis_data_editor.php,进来看看:
首先$gis_data = $_REQUEST['gis_data'];获取到gis_data,判断$gis_data['gis_type']是否已经存在,如果存在则跳过那一大串if子句。最后就将$gis_data['gis_type'];赋值给$geom_type,并传入PMA_GIS_Factory::factory函数。
实际这个利用方法很简单,简单到其实就是获取$_REQUEST['gis_data']['gis_type']并拼接到include_once中,造成任意文件包含。
0x03 利用过程及POC
那我们来说说利用。这个漏洞为何没火,因为在我看来他需要两个条件:
1.登录到phpmyadmin
2.需要截断
相对比较鸡肋。但实际上这两个条件也不难满足,很多时候我们通过任意文件可能能够获得某些数据库的访问权限,我们通过这个漏洞就能成功提权。
首先我的测试环境为php 5.2.17 + phpmyadmin 4.0.3 (想想我为什么选这样的环境)
创建一个普通用户test,没有任何权限,登录后只能看到test和information_schema表:
构造好URL直接访问(pma的上层目录放着一个包含phpinfo()的图片马u1.gif):
全文:
https://www.leavesongs.com/PENETRATION/phpmyadmin-local-file-include-vul.html
最近写的文章比较喜欢投递到各大平台,一是能赚点学费养家糊口,二是提高一下原创性。我发现如果文章发到一些社区或直接发博客,知名度不高很容易被转载以后不署名,导致转来转去后来就不知道谁是作者了。写了这么久文章也没给博客带来什么知名度,大概也就是因此吧。不如先发到各大平台再发到自己博客,总之也能赚点钱。
有时候好东西不是不愿分享,就是国内分享环境太差,开源程序不遵守协议、转载文章不带链接、插件模板随便去除版权,屡屡皆是。特别是“红黑联盟”等百度SEO做的比较好的网站,爬下来东西从来不带链接,到头来我是转载他是原创,那么我分享的意义何在,就是在为嘿产妞们铺平道路么?
这段时间和牙僧哥都在对open_basedir做一些研究,也发现了一些好玩的东西,php全版本已经可以绕过open_basedir读文件、列目录了,不知道离写文件还有多远,还是很期待的。
0x01 补丁分析
看到bobao.360.cn上提到了这个漏洞,于是我写个小分析吧,给渗透正没思路的人一个思路,也给学习代码审计的朋友一点资料。
前几天phpmyadmin出了个新的补丁,地址在此:http://www.phpmyadmin.net/home_page/security/PMASA-2014-14.php
修复了一个phpmyadmin4.x版本中的任意文件包含漏洞,我们看一下4.0版本的补丁:https://github.com/phpmyadmin/phpmyadmin/commit/2e3f0b9457b3c8f78beb864120bd9d55617a11b5
在文件libraries/gis/pma_gis_factory.php中对$type_lower多加了个判断。由此我们可以猜测,文件包含的点就出在$type_lower这里。
0x02 漏洞代码分析
我们来到libraries/gis/pma_gis_factory.php 29行:
01 | public static function factory($type) |
02 | { |
03 | include_once './libraries/gis/pma_gis_geometry.php'; |
04 |
05 | $type_lower = strtolower($type); |
06 | if (! file_exists('./libraries/gis/pma_gis_' . $type_lower . '.php')) { |
07 | return false; |
08 | } |
09 | if (include_once './libraries/gis/pma_gis_' . $type_lower . '.php') { |
10 | switch(strtoupper($type)) { |
11 | case 'MULTIPOLYGON' : |
12 | return PMA_GIS_Multipolygon::singleton(); |
13 | case 'POLYGON' : |
14 | return PMA_GIS_Polygon::singleton(); |
15 | case 'MULTIPOINT' : |
16 | return PMA_GIS_Multipoint::singleton(); |
17 | case 'POINT' : |
18 | return PMA_GIS_Point::singleton(); |
19 | case 'MULTILINESTRING' : |
20 | return PMA_GIS_Multilinestring::singleton(); |
21 | case 'LINESTRING' : |
22 | return PMA_GIS_Linestring::singleton(); |
23 | case 'GEOMETRYCOLLECTION' : |
24 | return PMA_GIS_Geometrycollection::singleton(); |
25 | default : |
26 | return false; |
27 | } |
28 | } else { |
29 | return false; |
30 | } |
31 | } |
我们来搜一下factory这个函数:
很多地方在调用,但最直接的还是/gis_data_editor.php,进来看看:
01 | // Get data if any posted |
02 | $gis_data = array(); |
03 | if (PMA_isValid($_REQUEST['gis_data'], 'array')) { |
04 | $gis_data = $_REQUEST['gis_data']; |
05 | } |
06 |
07 | $gis_types = array( |
08 | 'POINT', |
09 | 'MULTIPOINT', |
10 | 'LINESTRING', |
11 | 'MULTILINESTRING', |
12 | 'POLYGON', |
13 | 'MULTIPOLYGON', |
14 | 'GEOMETRYCOLLECTION' |
15 | ); |
16 |
17 | // Extract type from the initial call and make sure that it's a valid one. |
18 | // Extract from field's values if availbale, if not use the column type passed. |
19 | if (! isset($gis_data['gis_type'])) { |
20 | if (isset($_REQUEST['type']) && $_REQUEST['type'] != '') { |
21 | $gis_data['gis_type'] = strtoupper($_REQUEST['type']); |
22 | } |
23 | if (isset($_REQUEST['value']) && trim($_REQUEST['value']) != '') { |
24 | $start = (substr($_REQUEST['value'], 0, 1) == "'") ? 1 : 0; |
25 | $gis_data['gis_type'] = substr( |
26 | $_REQUEST['value'], $start, strpos($_REQUEST['value'], "(") - $start |
27 | ); |
28 | } |
29 | if ((! isset($gis_data['gis_type'])) |
30 | || (! in_array($gis_data['gis_type'], $gis_types)) |
31 | ) { |
32 | $gis_data['gis_type'] = $gis_types[0]; |
33 | } |
34 | } |
35 | $geom_type = $gis_data['gis_type']; |
36 |
37 | // Generate parameters from value passed. |
38 | $gis_obj = PMA_GIS_Factory::factory($geom_type); |
实际这个利用方法很简单,简单到其实就是获取$_REQUEST['gis_data']['gis_type']并拼接到include_once中,造成任意文件包含。
0x03 利用过程及POC
那我们来说说利用。这个漏洞为何没火,因为在我看来他需要两个条件:
1.登录到phpmyadmin
2.需要截断
相对比较鸡肋。但实际上这两个条件也不难满足,很多时候我们通过任意文件可能能够获得某些数据库的访问权限,我们通过这个漏洞就能成功提权。
首先我的测试环境为php 5.2.17 + phpmyadmin 4.0.3 (想想我为什么选这样的环境)
创建一个普通用户test,没有任何权限,登录后只能看到test和information_schema表:
构造好URL直接访问(pma的上层目录放着一个包含phpinfo()的图片马u1.gif):
全文:
https://www.leavesongs.com/PENETRATION/phpmyadmin-local-file-include-vul.html
相关文章推荐
- php魔术方法__set和__get,__isset,__unset的用法
- phpdoctor 安装,配置,生成文档
- PHP 获取表单数据与HTML嵌入PHP脚本
- php不经常用到的函数和类中的函数(一)
- PHP开发者应了解的24个超酷的PHP库(微框架)
- 求连续子数组最大和问题的两种解法_PHP实现
- there was no endpoint listening at net.pipe://localhost/PreviewProcessingService/ReportProcessing
- there was no endpoint listening at net.pipe://localhost/PreviewProcessingService/ReportProcessing
- there was no endpoint listening at net.pipe://localhost/PreviewProcessingService/ReportProcessing
- there was no endpoint listening at net.pipe://localhost/PreviewProcessingService/ReportProcessing
- 大家一起学习PHP(一)【基础知识1】
- PHP之Laravel框架使用问题汇总与解决方式
- [php] wamp 建立多站点
- ftplib源码剖析
- thinkphp中文验证码不能显示的问题
- php的CI框架相关数据库操作
- php 上传文件失败$_FILES tmp_name 为空
- Ubuntu下安装Naginx, PHP5(及PHP-FPM),MySQL
- 一)面向对象思想的核心概念
- PHP获取POST、GET数据