in_array函数漏洞

  • 如题:(ctfshow web99)
  • image-20250405202932475
  • 这里rand(1,$i)是在从1$i之间随机选择一个数输出。
  • 关于in_array函数的机制:
    • 格式:bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),即首位参数为需查询的数值,第二个参数为目标数组,最后一个参数为是否为严格比较
    • 这里没有设置$strict即是否为严格比较的值,默认为FALSE,即非严格比较。如输入2.php,根据 PHP 类型转换规则 ,从字符串转换为数值时,'2.php' 会被转换为 2(因为它以数字开头,遇到非数字字符就停止转换)。然后该数据就会和$allow中的元素做查询,看是否有该元素存在。
    • 所以这里我们就可以利用2.php激活if语句,利用file_put_contents函数()。
    • 这里相当精妙:利用file_put_contents函数来绕过检查并且创造一个1.php文件。并且将$POST方式所传入的content变量所代表的数据代码内容,写入1.php文件。
  • 所以直接采用一句话木马,在1.php传入一个content=<?= @eval(?_REQUEST['a'])?>语句,让1.php可以执行一个$_REQUEST超全局变量接收命令并且将结果输出到前端网页端中。
  • 由于$_REQUEST超全局变量可以接收$_GET$_POST超全局变量,所以可以在导航栏中使用a=system("ls");指令对该服务器进行控制,并且抓取目标文件。

file_put_contents 函数机制利用

  • 基本机制:

  • 语法:int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ),filename即规定要写入数据的文件,data即要写入文件的数据。可以是字符串、数组或数据流。flags可选。规定如何打开/写入文件。可能的值:

    • FILE_USE_INCLUDE_PATH
    • FILE_APPEND
    • LOCK_EX

    context可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。

  • 重要规则:如果文件不存在,将创建一个文件,并且打开文件。