首页 运维 安全 利用php7新特性绕过查杀正则

利用php7新特性绕过查杀正则

Mar 04, 2020 am 10:45 AM
php7

利用php7新特性绕过查杀正则

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

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

D盾规则库(最新):20191227

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

前置实验

某盾

首先以下代码

5f3c12408810786a7bb1e5786039be8.png

162fdadd8cddbbda72865af2da3acaa.png

直接误报了。

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

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

某d0g

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

bd54f5d656cb5afb3cee6ba29289fa6.png

就会让其误报。

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

PHP7.0.x

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

返回值类型申明

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

例如:

6ee65e418c8a599aa1614c3ccd729cc.png

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

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

例如:

2d820c9d27c48f053bdf060120c8290.png

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

dd6dcc1fc46d7d19d83215869a8010b.png

发现没有被检测到。

330fde65eb0dbf439b9c59f6bf470a7.png

可以使用。

null合并运算符

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

简单来说:

ccf12cdd4f866425c0a631d1a952f70.png

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

就像以下代码就可以绕过某d0g

bcdda91540aaf9ab5c7c5902a20949b.png

再利用函数调用一下

d685659156f6ec2be755995a867bb19.png

3567ace09f7579c35a7b0433b89d8d1.png

可以发现已经过了D盾

测试一下可用性

829358de94ac57cdbd459ee50d3221a.png

接下来看看7.1的特性吧

php7.1.x

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

可为空(Nullable)类型

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

比7.1的特性多了个 `?`函数返回值若不是给定类型,则为空。

使用同样的代码:

45c88f712da97c55b073b7869af0c7f.png

不出意外

3694798226bb9eae6a1fbe0ffb0f7ec.png

过了D盾

短数组语法

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

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

ca7cd2efc5e24d033135a7f9f814847.png

这样,就把数组的值分别赋给了` $c`,`$d`.`$c='a';$d='b';`

这样,就可以用这个少用的特性,来绕过静态查杀

首先写一个最简单的:

5b8a5c37b32f923b3b950725066d00b.png

然后就过了某d0g。自行测试。

之后就可以配合函数。就像这样:

264ee8ea3a9b45a481f2bfdee889890.png

查杀一下

911ad049e7ef3c19c1835d1be7d1350.png

测试可用性

2e15901c494993c09f63e9cc8fdb02e.png

list()现在支持键名

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

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

eg:

5e9db718f63d9960ca8fedb6747d1b9.png

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

79e1180d7ce825c46cfd9527089abcf.png

试试D盾

c084c74d8d75922dfe8f7596646d6c7.png

报了一级

再次借助自定义函数。

8c82c53f4450e7e90daef2d91d7830b.png

baafe8f4f65bfe9e227fbc5b37db7c1.png

成功过D,测试可用性。

766d29da2fd322cc7b700f3d8bff859.png

支持为负的字符串偏移量

官方说明

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

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

eg:

df6ba7b98b212e2b2ed2940bc5769b8.png

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

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

b5db44d73a1a06e7aeb61eda176ab67.png

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

结尾

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

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

更多相关文章,请关注php中文网web服务器安全栏目!

以上是利用php7新特性绕过查杀正则的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

php7.0怎么安装mongo扩展 php7.0怎么安装mongo扩展 Nov 21, 2022 am 10:25 AM

php7.0安装mongo扩展的方法:1、创建mongodb用户组和用户;2、下载mongodb源码包,并将源码包放到“/usr/local/src/”目录下;3、进入“src/”目录;4、解压源码包;5、创建mongodb文件目录;6、将文件复制到“mongodb/”目录;7、创建mongodb配置文件并修改配置即可。

php7检测tcp端口不好用怎么解决 php7检测tcp端口不好用怎么解决 Mar 22, 2023 am 09:30 AM

在php5中,我们可以使用fsockopen()函数来检测TCP端口。这个函数可以用来打开一个网络连接和进行一些网络通信。但是在php7中,fsockopen()函数可能会遇到一些问题,例如无法打开端口、无法连接到服务器等。为了解决这个问题,我们可以使用socket_create()函数和socket_connect()函数来检测TCP端口。

php7.0安装了插件还是显示未安装怎么办 php7.0安装了插件还是显示未安装怎么办 Apr 02, 2024 pm 07:39 PM

解决 PHP 7.0 中插件未显示已安装问题的方法:检查插件配置并启用插件。重新启动 PHP 以应用配置更改。检查插件文件权限,确保其正确。安装丢失的依赖项,以确保插件正常运行。如果其他步骤均失败,则重建 PHP。其他可能原因包括插件版本不兼容、加载错误版本或 PHP 配置问题。

php7.0怎么安装部署 php7.0怎么安装部署 Nov 30, 2022 am 09:56 AM

php7.0安装部署的方法:1、到PHP官网下载与本机系统对应的安装版本;2、将下载的zip文件解压到指定目录;3、打开命令行窗口,在“E:\php7”目录下运行“php -v”命令即可。

PHP 服务器环境常见问题指南:快速解决常见难题 PHP 服务器环境常见问题指南:快速解决常见难题 Apr 09, 2024 pm 01:33 PM

PHP服务器环境常见的解决方法包括:确保已安装正确的PHP版本和已复制相关文件到模块目录。临时或永久禁用SELinux。检查并配置PHP.ini,确保已添加必要的扩展和进行正确设置。启动或重启PHP-FPM服务。检查DNS设置是否存在解析问题。

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

在Docker环境中使用PECL安装扩展时为什么会报错?如何解决? 在Docker环境中使用PECL安装扩展时为什么会报错?如何解决? Apr 01, 2025 pm 03:06 PM

在Docker环境中使用PECL安装扩展时报错的原因及解决方法在使用Docker环境时,我们常常会遇到一些令人头疼的问�...

php8和php7哪个好 php8和php7哪个好 Nov 16, 2023 pm 03:09 PM

PHP8相较于PHP7在性能、新特性和语法改进、类型系统、错误处理和扩展等方面都有一些优势和改进。然而,选择使用哪个版本要根据具体的需求和项目情况来决定。详细介绍:1、性能提升,PHP8引入了Just-in-Time(JIT)编译器,可以提高代码的执行速度;2、新特性和语法改进,PHP8支持命名参数和可选参数的声明,使得函数调用更加灵活;引入了匿名类、属性的类型声明等等。

See all articles