bluecms审计
php代码审计
分类
- 原生态开发
- 框架类开发
- 组件类开发
- 前端类开发

原生开发-SQL注入
bluecms
一环境:
访问install目录出现空白页面,phpstudy设置允许目录访问,再删除install/compile目录下的php文件,再次访问即可安装成功(这里存在重新安装的漏洞,再访问install目录是可以重新配置数据库的)
继续数据库的配置,之后重新访问首页文件
二.漏洞:
如何快速在多个文件代码里面找脆弱:
- 看文件路径
- 看代码里面的变量
- 看变量前后的过滤
2.1 sql注入漏洞
正则搜索:
1 | |

参数过滤
- trim过滤空格,这里相当于变量$ad_id没过滤
单拿出来sql语句:
1 | |
自定义函数getone,查找声明和用例,发现它本质上还是原生的执行sql语句的代码,然后它也没有进行过滤的操作


在页面中输出结果是以html的形式出现的,结果是在源码中

就开始测(确定列数,回显位,用报错注入,布尔时间盲注啥的)


发现它对引号转义了

源码分析引号转义(common.inc.php):
在ad_js.php文件中发现还包含了文件common.inc.php,猜到是这个文件中做的转义

在blueCMS首页文件index.php中发现首页首先会加载common.inc.php,include/index.fun.php
1
2
3
4define("IN_BLUE",true);
require_once('include/common.inc.php');//require_once函数是同一个文件加载一次
require_once(BLUE_ROOT.'include/index.fun.php');所以他是一个多入口的模式,注意多入口的系统需要对每个入口文件单独做安全过滤,它们通常都会加载同一个文件来实现,在BlueCMS中这个文件就是common.inc.php
继续跟进去函数deep_addslashes

发现最后就是用的函数addslashes对参数进行过滤


2.2 宽字节注入
common.inc.php文件中加载了数据连接文件mysql.class.php

数据库连接里面发现编码是gbk,那就有宽字节注入的可能

发下后台登陆,验证账号密码的是函数check_admin

参数有单引号闭合,前面也分析了getone没进行过滤,login.php同样加载了过滤文件common.inc.php
1 | |

所以可以宽字节注入用管理员的身份登录
- 要注意直接在浏览器上回被编码,应该抓包后在bp中改

2.3 存储型XSS
分析
content进行filter_data过滤

跟进函数,只过滤了这几种,可以用标签绕过

利用
抓包,写入xss
1 | |

访问news.php目录

2.4 文件包含
分析源码
这里 pay参数无过滤,后面直接拼接index.php,有截断的可能,然后网站功能点是支付

相对路径是相对include/payment的!!!!!
这里注意:
绕过方法1:%00 截断
- 条件:magic_quotes_gpc = Off,PHP版本<5.3.4
绕过方法2:路径长度截断
- 条件:windows 下目录路径最大长度为256字节,超出部分将丢弃;linux 下目录最大长度为4096字节,超出长度将丢弃;PHP版本<5.2.8
我这里phpstudy不知道怎么的,安装不了5.2版本的,没有进行复现成功,学习一下思路

远程包含
上面包含本地php文件截断成功的话,可以再利用文件上传漏洞点getshell
- 寻找一个可以上传点,上传一个带木马的jpg文件,利用文件包含漏洞包含jpg文件,拿shell。
在上传头像的功能点处上传一句话

返回文件上传的路径
data/upload/face_pic/17483177255.jpg

之后再用文件包含就好了

还有一种思路,上传写这个代码的jpg,文件包含执行该代码,会在根目录下生成lost.php的马,内容为<?php @eval($_POST['lostwolf']);?> 菜刀连接拿shell
1 | |
2.5 任意文件读取写入
功能点:后台编辑功能

分析源码
可控参数$act,它用于选择操作,具体操作有list, edit 和do_edit
(list,列出指定目录下的文件
操作 edit用于读取指定目录下的$file,该参数可控,通过../可以实现目录穿越,这里就有任意文件读取漏洞
操作 do_edit 将$tpl_content写入到$tpl_name文件中,两个参数都可控)

edit操作中可疑参数$tql_name 他没有进行任处理就直接拼接
可能会有目录遍历访问任意文件的漏洞

do_edit操作中post接受的可疑参数$tpl_content进行了deep_stripslahes操作
$tpl_content后续还带入写入操作中
且$tpl_name还是过滤空格简单处理了,可以创建新的php文件

查看操作函数deep_addslashes,将参数进行stripslashes操作

stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。(上面也分析了common.inc.php过滤文件对post接收的数据进行了过滤)
所以现在这里的content就完全可控了,存在任意写入的漏洞
利用
1 .$tql_name
利用目录穿越读取任意文件

2 .$tql_content
任意文件写入,注意是post方式接受的
抓包修改数据包,注意操作是do_edit了


参考文章
https://www.freebuf.com/articles/web/284008.html
https://www.cnblogs.com/wkzb/p/12732078.html