WAF会维护一个规则库记录webshell常用的函数、方法、结构,当匹配上对应特征时便发出警告、直接封禁或隔离。但是安全厂商们为了提升用户体验,一般会以可用性为首要目标,其次才是安全性,这是一个硬伤也是绕过的基础

由于正常业务功能的需要,WAF通常并不会全盘枪毙语言中可以执行代码的结构或函数(比如eval),而是判断敏感函数是否处于某种木马后门常用且业务功能不常用的结构中,绕过即是找出既能达到目的又让WAF误以为无害的结构(即漏报)。相应的,如果可以知道WAF对于程序猿们提出的误报作出了哪些妥协,也可以从中获得一些绕过的灵感

为了找出能让WAF漏报的结构,一是尝试混淆可以执行代码的结构或函数,二是混淆传入的参数。而混淆具体该怎么做,便需要结合不同编程语言自身特性分析,总体方向有:

  • 字符串变换(拼接、编码、取反、加密)

  • 函数特性

  • 类特性

  • 迷之注释

  • 变量污染

PHP

PHP有着极其灵活的语言结构,这为涉世未深的开发们提供了极大的便利,而易用与安全似乎自古就是死对头。。。

以下几种结构/函数可将字符串作为代码执行:

# PHP4|5|7
eval ( string $code ) : mixed

# PHP4|5
assert ( mixed $assertion [, string $description ] ) : bool
# PHP7.1
assert ( mixed $assertion [, Throwable $exception ] ) : bool

# PHP4|5利用/e修饰符
preg_replace/preg_filter ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
mb_ereg_replace ( string $pattern , string $replacement , string $string [, string $option = "msr" ] ) : string

# 文件包含
include
include_once
require
require_once
file_get_contents ( string $filename [, bool $use_include_path = FALSE [, resource $context [, int $offset = 0 [, int $maxlen ]]]] ) : string

以下几种变换可用来加混淆:

  • .(句点)隔离拼接字符串

  • 简单拼接可衍生出拼接$GPC、调用时传值拼接(比如Cookie)、利用数组下标取值、远程加载核心shell

点击收藏 | 1 关注 | 1
登录 后跟帖