CVE-2018-12613漏洞学习总结

前言:

在漏洞披漏之后,就对该漏洞进行了分析复现,本来打算投freebuf,谁知道被抢了先2333,贴图留念~~~
22-1

CVE-2018-12613:

2018年6月19日,phpMyAdmin在最新版本修复了一个严重级别的漏洞。攻击者必须拥有后台权限,phpMyAdmin4.8.0和4.8.1均受漏洞影响。

漏洞分析:

首先在如下图所示的index.php中存在一处包含指定文件的代码:

22-2

需要成功包含,必须满足if区间中的五个条件:target参数值不为空;target参数值为字符串;target参数值不以index开头;target参数值不在黑名单中;过checkPageValidity函数的检查。其中第四个条件的黑名单即51行中import.php与export.php;第五个条件需要查看该函数:

22-3

可以看到core类的checkPageValidity函数中又必须经过以下的五个判断:
1、$whitelist为空就引用申明的$goto_whitelist
2、$page如果没有定义或者$page不为字符串就返回false
3、$page如果存在在$whitelist中返回true
4、如果$_page存在在$whitelist中返回true
5、经过urldecode函数解码后的$_page存在在$whitelist中返回true
我们可以看到在index.php调用checkPageValidity函数时没有传入其他参数,因此会进入第一个判断,而$goto_whitelist如下所示:

22-4

它定义了很多可以被包含的文件名。然后第二个判断可以跳过;看第三个判断,可以看到$page参数是不在$whitelist中的,此处不满足;看第四个判断,这个判断是对$_page进行的,校验$_page是否在白名单中,而$_page是将$page值末尾加上’?’后从字符串第0位开始分割,取其中第一次出现?之前的内容,如下图所示:
target=sql.ph%3fp时:

22-5

因此此处可以用’$target=db_sql.php?/../../被包含文件’来满足条件,但是$target进入到index.php的include()中,被包含的文件无法打开,出现报错。(windows文件命名规则中规定了文件名不能出现特殊字符,linux为服务器的情况下,是可以使用?直接进行绕过)

22-6

第五个判断,先将$page进行urldecode解码,然后再进行?的分割,取值进行判断,只要解码后分割出来的值在$whitelist中即可满足条件。而在$target 里问号被二次编码为%253f, db_sql.php%253f也会被认为是一个目录,可以用../跨越,成功实现包含。因此命名规范里面没有将%放进去也是该漏洞能在windows下成功利用的一个关键点。

22-7

这样我们可以将?进行二次编码。如果传入target=db_sql.php%253f。在第四个判断中进行白名单校验时,为db_sql.php%3f,不满足,第五个判断的urldecode后,进行校验时为db_sql.php,符合条件,然后即可成功包含文件。

22-8

复现心得:

getshell方式

1、上传sql文件,然后进行包含。
2、开启webshell日志功能,查询webshell语句后,包含日志。
3、将webshell写入字段中,如果数据库在本地,可以直接通过查询数据库文件位置:select @@datadir;然后得到数据库文件存放路径,而字段内容则在数据库名/表名.frm中

说明图1:

22-9

说明图2:

22-10

4、通过phpsession文件包含,首先执行查找webshell的语句,然后在cookie中的phpmyadmin参数中可看到session文件名。
说明图1:

22-11

说明图2
22-12

getshell方式:
目前官方已修复漏洞,更新至最新版本可不受此漏洞影响。

-------------本文结束感谢您的阅读-------------
  • Post author: SuNu11
  • Post link: http://sunu11.com/2018/07/25/22/
  • Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.