0x01 多处命令执行漏洞
文件direct/polling/CommandsPolling.php
第一处命令执行:
当$command == "ping"时,$cmdParam和$saveFile进入getPingInfo函数
跟进文件command/CCmdsPolling.php
当$saveFile等于空时,继续跟进ping函数
注意看这里的$filename = "/tmp/" . self::getClientAddr()."ping".$ip.".txt";
继续跟进getClientAddr函数
这里直接获取ip,然后返回,无视此系统的GPC=on
最后$filename可控,进入exec中被执行
当然这里的ip也进入cmd,进入exec中被执行,此处已有人提交不在赘述
第二处命令执行
当$command == "traceroute"时,$cmdParam, $saveFile进入getTracerouteInfo函数
跟进getTracerouteInfo函数,文件command/CCmdsPolling.php
跟进traceroute函数:
注意看这里的$filename = "/tmp/" . self::getClientAddr()."ping".$ip.".txt";
继续跟进getClientAddr函数
这里直接获取ip,然后返回,无视此系统的GPC=on
最后$filename可控,进入exec中被执行
当然这里的ip也进入cmd,进入exec中被执行,此处已有人提交不在赘述
0x02 多处任意文件删除漏洞
第一处文件删除:
文件/task/webapi/update.php
可以看到$filename = $_GET["package"];
然后进过一些操作后并没有exit
最后$filename进入unlink,导致任意文件删除
当然这里也是存在命令执行的,在$shell->Execute这里
因为已经有人提交了,就不在赘述了
第二处和第三处文件删除:
文件direct/polling/CommandsPolling.php
$cmdParam, $saveFile参数分别进入getPingInfo和getTracerouteInfo函数
跟进getPingInfo和getTracerouteInfo函数
可见在getPingInfo函数中,然后当$saveFile为空时进入ping函数
然后在ping函数中:
$filename = "/tmp/" . self::getClientAddr()."ping".$ip.".txt";
继续看看getClientAddr函数中,直接从$_SERVER中获取ip地址,然后返回
所以这里就无视GPC了,且此系统时GPC=on的
最后导致ping函数中的$filename可控,最后$filename进入unlink函数中
$filename的值可用%00截断,导致任意文件删除
第三处和第二处原理一样
在traceroute函数中的$filename可控,最后$filename进入unlink函数中
$filename的值可用%00截断,导致任意文件删除
0x03 全局设计缺陷
为什么叫全局,因为这是一个安全产品,说有功能都应该是登陆后操作
但是这里在对对应功能操作是,根本没有验证登录状态
所以无需登录就可操作全局页面功能
此系统是设有全局登录验证函数的:
如direct/polling/progressbarPolling.php文件中
这里进行了登录状态验证,session中没有username即exit,看看GetSessionVariable函数
文件base/session.php
从session中取userName得内容
但是95%以上的地方都没有使用这样的验证
如device/device_export.php直接导出设备信息
distribute/vuldetial.php所以插件漏洞信息
policy/param_export.php策略信息导出
task/task_export.php任务信息导出
等等
命令执行证明:
当command=ping,filename为空,cmdParam不为空
1、在vps上放置shell.php,内容为:
2、利用这里的命令执行,下载shell.php文件到目标tmp目录下
3、然后利用这里的命令执行,执行下载后的/tmp/shell.php
4、成功反弹shell
当command=traceroute时同理
文件删除证明:
利用设计缺陷中的无需登录文件上传,上传一个文件上去
文件device/device_import.php
上传文件到tmp下:
成功上传:
发送请求:
即可删除文件/tmp/1
成功删除