之前ChaMd5团队报出来的phpmyadmin的文件包含漏洞,今天就来分析复现一下。
分析
漏洞的输入点是 include $_REQUEST['target'];
出现了文件包含这种危险操作,那么有很大概率出现问题。
我们只要绕过57、58、59行的检测就可以成功控制包含文件。
第57行用正则匹配开头为index的路径,只要路径开头没有index即可。
第58行检索输入中是否有黑名单的字符,黑名单在第50行,可以看到 import.php和export.php,只要参数中没这两个php就行。
第59行要看Core类的方法checkPageValidity。
第452行的第三个if判断,检查了输入中的白名单,如果有这些php就直接返回true。
没什么用,继续看下面的操作。mb_substr截取字符串从开始的位置到?处的字符串,再次检索白名单。
虽然可以在url中加入?来通过这个判断,但是随后的include因为有?,所以就无法包含我们控制的文件。
之后,重点来了,在465行出现了一个url解码操作。由于这里解码之后又重复了一遍上面的截取操作,所以这里我们就可以让?编码两次来绕过白名单检测,之后返回到include的时候也能包含我们想要的文件。最后的payload如下:
1 | 127.0.0.1/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../tongfang.txt |
db_sql.php是白名单中的一个,然后用两次URl编码过的?截断,两次URL编码的?在php的urldecode后会变成?,从而绕过检测,之后include文件时,服务器会认为db_sql.php%3f是一个目录,然后包含最后的文件。
利用
- 利用创建新的表,在表的字段中放入Webshell,然后包含数据库文件
- 执行
SELECT '<?php phpinfo(); ?>'
,然后包含php的session文件
推荐用第二种方法更加隐蔽并且不需要猜测数据库文件路径,效果如下:
总结
总的来说这个漏洞需要在登录phpmyadmin之后才能利用,所以只要密码强度够,暂时就不会有太大危险,但还是推荐尽快升级。另外如果是在session中写了Webshell,用菜刀连的时候必须要有phpmyadmin的session才行……