4、攻击流量差分攻击所谓的攻击流量差分攻击,是一种最常见的攻击绕过过段,其实也是一种思考问题的方式,突破防御,绕过的本质就是要寻找防御系统的差分点,对于PHP Webshell来说,外部传参流量就是一个很关键的差分点。
为了更好地说明这个沙箱,笔者这里引入两个概念,【静态可重入样本】以及【动态不可重复多模态样本】。
所谓【静态可重入样本】就是指大部分的传统的PHP Webshell样本,我们称之为“可重入单模态样本”,这类样本尽管可以利用php的大量tricky特性、使用各种编码、加密手段,代码形式可以极尽复杂,例如
--我是分隔符 m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m 结束--
但是,这种样本,究其根本,其本质都是“可重入的、单模态的”,就是说不管运行多少次,谁来运行(受害者 or 旁路离线引擎),其运行结果都是一样的。
从污点追踪理论的角度来说,这一阶段的沙箱,解决的是【显式污点传递问题】,即污点信息流的传递在样本代码中是显式的,只要模拟执行一遍即可100%模拟。
另一方面,对于【动态不可重复多模态样本】来说,这样样本的重点不在于利用了php的哪些tricky语法特性,而在于它的“不可重入性、多模态性”,我们下面用具体例子来解释。 4.1、动态依赖的分支跳转问题(根据输入的参数动态决定执行流和执行动作)
对这个样本来说,外部参数就像一个之路的地图,标识了一个“road chain”,只有严格遵守这个“road chain”运行到最后,才可以看到样本的真实攻击意图。而这对业内很多旁路检测引擎来说,都是一个很大的挑战,在指数级的分支中,一旦走错了一个分支,就会被攻击者实现绕过。 4.2、基于外部参数动态生成函数名
主要攻击以沙箱和动态AST引擎为代表的旁路离线检测技术,离线检测因为丢失了攻击现场的上下文信息,因此较难模拟实际的攻击行为。 4.3、不常见的外部参数传递方式对于业内常用的【污点追踪检测技术】,各家厂商基本都知道要把PHP常见的HTTP超参数标记为污点,例如GET/POST/COOKIE等。
但实际上,外部参数是一个泛概念,理论上来说,“一切外部可控的输入都是有害的,都需要被跟踪”。外部可控的输入源是一个信道的概念,原则上,只要是符合“外部可控、内容可控”这两个特点的方式,都属于外部可控输入。它们包括但不限于: