bluecms_v_1.6sp1代码审计
cms概况
bluecms v1.6 sp1是一个比较古老的cms,目录结构也比较简单。网站主要防护在/include/common.inc.php文件中,对$_GET、$_POST、$_COOKIES、$_REQUEST
使用deep_addslashes()
函数过滤一遍,漏了$_SERVER
,deep_addslashes函数是使用addslashes函数对输入值中的预定义字符做转义
代码审计
将代码放入seay源代码审计系统中自动审计,先对扫描出来疑似存在漏洞的地方审计一遍,然后在对重点功能或文件进行审计。
1、重装漏洞
在搭建实验环境的时候,但安装进行到最后一步时却网页空白显示,但实际上又确实是安装好了网站也可以正常 访问(搭建环境时记得修改php.ini文件调低其报错敏感程度,不然会报一些无关重要的错误)。
这时重新访问安转文件,依旧可以进入安转步骤
搭建完成 ,能够正常使用
访问安转文件,可以进入安转界面进行重装
一般cms安装完成后,都会生成一个类似install.lock的文件,用以检测cms已经安转好了。
这里安转完成是会在data目录生成一个 install.lock文件,但进入安装程序后检测是否有这个文件判断是否安装过了
这里安转好后却没有生成install.lock文件
测试发现原因是由于index.php文件开头和结尾都包含了/include/common.inc.php文件,而inc文件调用了smarty类文件,这里造成了重复调用,require错误,不会继续执行代码。也就不会生成install.lock文件,解决办法是将require 改成require_once,如果已经被包含,则不会再次包含。
2、SQL注入 漏洞
跟进getone函数
除了common.inc.php中deep_addslashes函数会转义预定义字符外再无任何过滤,直接执行并返回结果。而且这里由于没有因引号包裹,deep_addslashes函数不起作用,可以直接利用。
注意这里注入结果不会显示在页面上,通过查看网页源代码可以看到
查所有表名
数据库在连接时采用gbk编码格式,而且deep_addslashes会转义输入的参数值,因此可以使用宽字节注入
这里一共有两处可以注入,一处是网站用户登录,另一处是网站用户注册处。
网站用户登录页面用户名引号前输入%df与转义后的\
合称gbk字符運
。直接在登录框输入%df’是不行的,因为%df本来就是特殊字符,直接这样写其中的%号会经过一次url编码
输出注入语句看一下
同样网站管理员登录处也存在同样的问题
跟进check_admin函数
使用宽字节注入达到万能密码登录的目的
因为deep_addslashes函数没有对$_SERVER
进行过滤,可以可以找到有X-Forwarded-For
或CLIENT-IP
的地方,伪造ip进行SQL注入
找到与ip有关的SQL语句
guest_book.php留言处发现ip会写入数据库
跟进$online_ip
跟进getip()函数
可以伪造X-Forwarded-For
或CLIENT-IP
实现注入
结果显示在留言处
还有一处注入是在网站新闻留言处,与上面类似
但要注意,这里的xf构造
X-Forwarded-For: 127.0.0.1','1'),('', '1', '1', '1', '6', (select concat(admin_name,0x3e,pwd) from blue_admin), '1656396250', '127.0.0.1', '1')#
这样构造就相当于一次性插入了两条留言,绕过了对留言内容的检测
**注意:**插入的数据要与前面一条一致(用户id之类的)不然会报错,或者显示不了
- 后台多处sql注入
后台对数据库的操作要比前台多,大多数是由于数据库设置gbk编码造成的宽字节注入以及一些未过滤无引号保护直接拼接造成的。这里不一一列举了
3、XSS漏洞
上面这里可以构造sql注入,原理是在写入数据库中的语句中插入注入语句,其实是替代了留言内容写入数据库,并把结果显示在页面留言处。如果把注入语句换成XSS语句,就可以造成存储型XSS,也就绕过了程序对留言的html实体编码防御XSS的措施。
伪造XF信息,插入XSS语句
成功弹窗
和上面一样这儿还是利用的XF中ip伪造
成功弹窗
1、用户注册邮箱过滤不全导致存储型XSS
同样这里user_name参数也是可以利用的,但是有长度限制,email则没有长度限制。这里个参数仅仅是经过转义预定义字符和trim函数去除首尾的空白和预定义字符。
这两个参数可以注入也可以写入XSS,但要注意浏览器提交会自动编码,所以最好抓包后修改
登录aaaa用户即可弹框
2、发布新闻处存储型XSS
新闻内容,采用filter_data过滤
跟进filter_data函数
这里漏掉了img标签,可以使用img标签。也可以大小写混写直接绕过
还有一处是编辑新闻中的文章概要处,这里只是限制了长度,没有过滤
直接在网站首页弹框
4、文件包含
user.php中用户选择支付方式是选择对应的文件夹进行包含
这里需要截断路径
$_POST['pay']
前后加了文件,可以使用../
进行目录遍历,后面的/index.php
如果php
版本低于5.3.4
且magic_quotes_gpc=off
则可以使用%00
截断,导致任意文件包含。还可以使用.号路径长度截断,Windows
下目录最大长度为256
字节,Linux
下目录最大长度为4096
字节
实测点号.
截断phpstudy中 php5.2可以成功
成功包含
5、ssrf漏洞
看到有人分析bluecms时提到了uesr.php有一处SSRF漏洞,这儿来分析一下
在网站用户修改资料这里,可以自定义上传图片的路径
这里的代码逻辑是不允许包含http://
或者https://
应该用!==
,但是他用了!=
,根据php弱类型strpos()
返回值为0是和false相等的,故能够绕过造成SSRF漏洞
==
比较两边的值是否相等,会自动转换类型; ===
则会严格比较类型是否相同,如果类型不相同,直接返回false。 例如:'123' === 123 // => false
!=
与 ==
相对,!==
与 ===
相对。同理:
0 != false // => false
0 !== false // => true
但是这里只支持本站相对路径其实cms源代码就是只支持本站相对路径,没有类似file_get_contents
的函数处理
6、任意文件删除漏洞
- user.php 网站用户更新个人资料处
参数face_pic3
外部可控,可删除任意文件,需使得face_pic1
为空。
cms文件夹中新建aaa.php文件
成功删除
- 提交编辑后的分类信息处任意文件删除
参数lit_pic
可控,可以删除任意文件
7、总结
这是一个比较古老的cms,可以说是满目疮痍,更靶场一样。上述漏洞主要是前台的。后台同样存在类似或者没有写到的漏洞。由于自己技术有限,就到这。