深信服VPN RCE分析

0x00 前言

该漏洞是去年20年hw的时候爆的,最近正好在学习php代码审计就翻出来看看

0x01 分析

漏洞文件位置:/tool/log/c.php

深信服EDR RCE分析 - 图1

可以看到在第67和78行的地方定义了两个匿名函数$strip_slashes$show_input

$show_form 函数中直接引入了上面两个匿名函数

然后在第91行可以看到 extract 函数

深信服EDR RCE分析 - 图2

extract 函数会将数组中的key当作变量名,value当作变量值 ,容易造成变量覆盖

举个例子 :

  1. <?php
  2. $flag = 'xxxx';
  3. extract($_GET);

原先代码中flag的数值是xxx

extract将get获取的参数和数值作为数组的key和value,如果我们传入了?flag=bbbb 数组就会变成如下

  1. 'flag'=>'bbbb'

这时候flag会作为参数名覆盖之前的flag参数,所以最后flag值为bbbb

再来看这里的代码

$show_form 接受的参数 $params 直接传给了extract函数,那么如果$params可控那么我们就可以RCE了

深信服EDR RCE分析 - 图3

搜索 $show_form ,我直接好家伙。。。

$show_form$params直接从 $_REQUEST中获取

深信服EDR RCE分析 - 图4

那我们可以直接覆盖 strip_slashes 实现RCE

/tool/log/c.php?strip_slashes=system&host=id

深信服EDR RCE分析 - 图5

通过对函数的覆盖导致原来的

$strip_slashes($host) 在我们控制参数的情况下

变为了

system(id)

0x02 总结

看下来蛮奇妙的,不知道为啥开发定义的时候非要用匿名函数,然后也没有进行任何过滤,感觉大厂不应该写出这样的代码,估计这套EDR还有很多漏洞后面再去康康去