利用php7新特性绕过查杀正则
最近在研究webshell免杀,抽出心得的一个新颖的点。原因是突然想到既然php7.1不能利用可变函数的assert,那就利用php7的新特性来绕过查杀正则,最终绕过某盾和“某d0g”。
实验环境在7.1.9,所有马儿在php7以下的环境均不能使用。
D盾规则库(最新):20191227
某d0g因为可能会因为用其产品测试,导致侵权行为,为了防止被举报所以就不放图了。
前置实验
某盾
首先以下代码
直接误报了。
因此,直接传参到eval里面是不现实的。
所以接下来我们要利用函数,配合php新特性来绕过它。
某d0g
而对于某d0g,只要以下代码
就会让其误报。
因此在写免杀马的时候,post中的变量,不要出现在eval中的字符串中。就像上面`b`一样,尽管他在`eval`中是以变量的形式出现的。有了这个基础就可以进入正题了。
PHP7.0.x
[php手册-php7.0.x新特性]( https://www.php.net/manual/zh/migration70.new-features.php)
返回值类型申明
php7增加了返回值类型声明的支持,在定义函数时增加一个 `:类型`便可以了。
例如:
就是函数返回值类型要为int。否则会强制转换或者显示语法错误。
如果未更新此特性的查杀软件,就会不认识此函数,导致被绕过。
例如:
可以用查杀软件测试一下。
发现没有被检测到。
可以使用。
null合并运算符
由于日常使用中存在大量同时使用三元表达式和 `isset()`的情况, 添加了null合并运算符 (*??*) 这个语法糖。如果变量存在且值不为**`NULL`**, 它就会返回自身的值,否则返回它的第二个操作数
简单来说:
如果运用 `??`符号,查杀软件不会理解着个处理过程 ,可能就会导致绕过。
就像以下代码就可以绕过某d0g
再利用函数调用一下
可以发现已经过了D盾
测试一下可用性
接下来看看7.1的特性吧
php7.1.x
[php手册-php7.0.x新特性]( https://www.php.net/manual/zh/migration71.new-features.php )
可为空(Nullable)类型
参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。
比7.1的特性多了个 `?`函数返回值若不是给定类型,则为空。
使用同样的代码:
不出意外
过了D盾
短数组语法
短数组语法([])现在作为list()语法的一个备选项,可以用于将数组的值赋给一些变量(包括在foreach中)。
这里选用中括号 `[]类型`的列表来演示。
这样,就把数组的值分别赋给了` $c`,`$d`.`$c='a';$d='b';`
这样,就可以用这个少用的特性,来绕过静态查杀
首先写一个最简单的:
然后就过了某d0g。自行测试。
之后就可以配合函数。就像这样:
查杀一下
测试可用性
list()现在支持键名
官方说明:现在list()和它的新的[]语法支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)
这个很绕,看一下例子也许就会明白了。
eg:
稍微改改就能过某d0g(自行测试):
试试D盾
报了一级
再次借助自定义函数。
成功过D,测试可用性。
支持为负的字符串偏移量
官方说明
现在所有支持偏移量的字符串操作函数 都支持接受负数作为偏移量,包括通过[]或{}操作字符串下标。在这种情况下,一个负数的偏移量理解为一个从字符串结尾开始的偏移量。
这个在小于7.1版本中,负的偏移量返回空字串。
eg:
7.1.x中返回 `s`,但是以前的版本中 返回 ` string(0) "" `
思路:我们可以这个拆分字符串,使规则识别不出来。最后再配合php的可变变量:
这样就可以过某d0g了。但是对于D盾来说,会识别拼接字符,和可变变量。报一级`可疑文件`,不得不说这点做的确实很好。
结尾
其实还有很多特性,就像`通过define()定义常量数组`,也都可以举一反三去绕过。而且不止自定义函数,还可以配合类,可变变量等,来绕过静态查杀。
还可以利用 `太空船操作符(组合比较符)`,`整数除法函数 intdiv()`等来绕过动态查杀。
更多相关文章,请关注php中文网web服务器安全栏目!
以上是利用php7新特性绕过查杀正则的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

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

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

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

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

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

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

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

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