本篇文章记录了 2019强网杯线下赛中的3道Web题解,个人并未参加线下赛,仅复盘记录。题目下载:链接: https://pan.baidu.com/s/1mcHEJ1fmWtw4ZOMkEEcH4Q 密码: fl0c
laravel
先通过如下命令将 Web 网站搭起来,通过查看 composer.json 文件可知该网站采用了 Laravel 5.7 版本框架。如果有关注过 Laravel 的漏洞,应该知道该版本的 Laravel 存在一个远程代码执行漏洞,我们继续看代码部分。
1 | ➜ laravel-5.7 composer install |
框架的路由也不多,找到对应的控制器,发现明显是一个反序列化漏洞,估计就是利用反序列化进行代码执行了。
直接通过 CVE 就能找到相关漏洞分析文章,虽然作者删了原文,但是还是可以通过 google 快照找到 EXP 。
该漏洞主要是利用了 Illuminate\Foundation\Testing\PendingCommand 类的 run 方法来执行命令,具体漏洞的分析见下篇文章。我们可以构造 EXP 如下:
1 |
|
将上述文件放在 public 目录下生成 EXP 即可,执行 ls 命令结果如下:
yxtcms
题目说明:
已经删除可用的install , admin, UpdateController.class.php和SettingController.class.php文件夹和文件,相关思路请不要尝试。
题目提供了源码,可以发现该 cms 基于 thinkcmf 二次开发,而 thinkcmf 用的就是 ThinkPHP 。
thinkcmf 有两个大分支,一个基于 ThinkPHP3 ,另一个基于 ThinkPHP5 ,所以我们要先查一下该 ThinkPHP 的版本。如下图所示,可以发现是其版本是 3.2.3 ,而这个版本的 ThinkPHP 最出名的 RCE 就属缓存设计缺陷 getshell 了,漏洞成因和 ThinkPHP5 版本的基本一样,详细分析可以参考: ThinkPHP5漏洞分析之代码执行(八) 。
为了确定该漏洞没有被人为修复,我们可以看一下缓存设计文件的代码。具体代码如下图所示,可以发现 第19行 代码将缓存数据写入 PHP文件中,虽然开头有注释符,但我们可以使用换行符( %0a
)绕过。
从 ThinkPHP3.2.3 开发手册可知,可以通过 S 方法进行数据缓存。
我们全局搜索一下哪些方法调用了 S 函数,会发现 thinkcmf 中的动态更新配置函数 sp_set_dynamic_config 似乎比较好利用,因为其将传入的 $data 变量和系统配置变量数组合并,并将合并数据写入缓存中。
我们继续搜索何处调用了 sp_set_dynamic_config 函数,会发现除了题目删掉的 admin、install 目录外,还有四处调用了该函数。其中只有第二个可以直接访问,其它貌似都要登录。
所以我们根据 ThinkPHP3.2.3 的访问规则访问即可, payload 如下:
1 | curl -d 'authoCode=%0aphpinfo();//' 'http://0.0.0.0:8000/index.php?g=api&m=oauth&a=injectionAuthocode' |
这里的缓存文件名实际上就是缓存变量名的 md5 值,例如这题中 S("sp_dynamic_config",$configs)
对应的文件名就是 md5(“sp_dynamic_config”) 。
cscms
同样题目给了源码,提示说删了 admin 目录、 install.php ,于是上 CVE、CNVD、seebug 上搜了一下,没有发现有用的 RCE 漏洞。我们先从源码中搜集一些版本信息,可以看到该 CMS 用的是 CI 框架,版本为 3.1.3 , CMS 本身的版本为 4.1.75 。
1 | ➜ html grep -Rni 'version' |
我们可以上该 CMS 官网看一下更新日志,从中找寻漏洞点。如下图所示,可以看到该 CMS 存在 SSTI 漏洞,遂及将补丁下载下来分析。
补丁中主要有两个文件发生变化:
- cscms/app/helpers/common_helper.php:删除了get_file_mime方法
- cscms/app/core/CS_Input.php:增加了get、post、post_get、get_post四个方法
看样子,好像原先的 SSTI 漏洞是由于 GET、POST 引起的,因为这里并未发现对过滤规则的修改。其实这个 CMS 我第一眼看过去,就觉得和 海洋CMS、苹果CMS、DuomiCMS 有点像,而这几个 CMS 都存在模板标签注入导致代码执行的问题,那么我们尝试全局搜索一下 eval 函数。从搜索结果中,我们可以看出这个 CMS 的写法真的和前面提到的几个 CMS 很像,所谓的 SSTI 极有可能就是模板标签注入。
细看代码,我们会发现程序会将 {cscmsphp} 标签中包裹的代码当做 PHP 代码来执行。
于是随手试了一下,发现搜索处果然存在代码执行,就是不知道当时比赛的时候这个 dance 模块有没配置开放。
如果没有配置开放的话,还可以利用留言处注入 payload 。具体可以参考其他 writeup 。