CVE-2018-12613

2018 HCTF 里面考察了一个 CVE,也就是 phpmyadmin4.8.1 的远程文件读取漏洞,在此复现一下(插一嘴,啊哈哈哈哈我会 docker 啦)

phpmyadmin 是一套开源的、基于 Web 的 MySQL 数据库管理工具,在其 4.8.1 版本中存在一处文件包含逻辑,通过二次 url 编码可以绕过检查从而造成远程文件包含漏洞

漏洞原理:


一个攻击者可以在服务器上包含(查看和潜在执行)文件的漏洞被发现。该漏洞来自一部分代码,其中页面在phpMyAdmin中被重定向和加载,以及对白名单页面进行不正确的测试。攻击者必须经过身份验证

但在这些情况下除外:


我们首先是把源码从官网上整下来,其名为 phpmyadmin-4.8.1-all-languages.zip,网址:https://www.phpmyadmin.net/files/4.8.1/

docker:https://github.com/vulhub/vulhub/tree/master/phpmyadmin/CVE-2018-12613

属实难顶,因为穷,只能在云服务器上复现(Ubuntu 18.0),害,还给我疯狂警告 QAQ

我们先来看看源码,问题是出在 index.php 中,55 - 63 行:

61 行出现了 include,明显是一个文件包含漏洞

55、56 行判断 target 参数是否为空以及是否为字符串

57 行限制 target 参数首部不能为 index

58 行限制 target 参数不能出现在黑名单中

黑名单:

59 行也就是最后一个限制,是一个类的静态方法,我们找到并分析一下:

phpmtadmin 团队在这里的想法是即使 target 包含参数也可以正确包含文件,但是也就因此造成了这个漏洞

我们可以利用 465 行的 urldecode 函数来绕过白名单检测,将 ? 两次 url 编码为 %253f 即可绕过验证(Windows 没有将 % 作为文件名字符黑名单也算是该漏洞可以成功利用的一个关键)

我们构造 payload:?target=db_sql.php%253f/../../../../../../../../etc/passwd

可以看见 /etc/passwd 被成功读取,说明文件包含漏洞存在:

利用:我们可以构造 SQL 语句:select '<?php phpinfo()?>'; 执行,成功之后查看自己的 sessionid(cookie 中的 phpMyAdmin 的值),得到 ee58ba2ebb993a782ea58f3405307f3c

然后访问:?target=db_sql.php%253f/../../../../../../../../tmp/sess_ee58ba2ebb993a782ea58f3405307f3c


如果没做过设置,session文件默认是在/var/lib/php/sessions/目录下,文件名是sess_加上你的session字段。(没有权限) 而一般情况下,phpmyadmin的session文件会设置在/tmp目录下,需要在php.ini里把session.auto_start置为1,把session.save_path目录设置为/tmp window下的目录和中间件相关


可以发现 phpinfo 执行

参考:

https://www.jianshu.com/p/fb9c2ae16d09

http://sunu11.com/2018/07/25/22/

 

From 2020.05.11