烟雨行舟之easySNS极简社区_V1.6代码审计

漏洞说明:easySNS极简社区1.6版存在任意远程文件本地化漏洞,在进行远程文件下载的过程中没有进行黑名单校验,导致可以下载任意远程文件进行本地化。

 

 

代码审计过程:

根据漏洞可能触发的函数名,全局搜索getImage,getPic,下载等等关键字,通过搜索下载找到函数位置。/app/common.func.php

烟雨行舟之easySNS极简社区_V1.6代码审计

通过getImage函数进行远程图片本地化:

烟雨行舟之easySNS极简社区_V1.6代码审计

上述代码中获取到远程文件地址,判断是否为空,为空直接返回,不为空就判断是否登录并且获取个人的uid。然后如果没有传递保持地址参数,就使用系统构造的地址。之后就是关于文件名的处理了,通过远程文件地址来获取扩展名,可以看到此处之前有校验扩展名为gif和jpg,但是代码处于注释状态,这应该就是漏洞产生的原因。之后就是构造文件名,下载文件。

代码中通过两个方式下载远程文件:curl_init和readfile

烟雨行舟之easySNS极简社区_V1.6代码审计

知道文件下载的函数,就要溯源获取调用函数的位置,全局搜索函数:

烟雨行舟之easySNS极简社区_V1.6代码审计

只有同文件下的第21行有调用,跟进函数查看具体内容。

烟雨行舟之easySNS极简社区_V1.6代码审计

通过函数getImageLocal进行调用。

在这个函数中要关注一下正则表达式是如何匹配远程图片地址的,方便编写payload。在第19行会进行地址格式校验,限定了只能使用http或者https。理论上此处还会存在SSRF漏洞,但是由于curl_init方式没有调用函数,而且限制了url只能是http或https,所以没办法使用file协议,gopher协议等等。

继续溯源代码,查看调用函数getImageLocal的位置:

烟雨行舟之easySNS极简社区_V1.6代码审计

存在两处调用,在发帖的位置,一个新增贴,一个修改贴,此处只看新增帖子。

烟雨行舟之easySNS极简社区_V1.6代码审计

通过topicadd方法新增一个帖子,首先判断是否登录,然后判断发帖时间是否在间隔之内,然后在283行获取用户输入的数据,重要的是第284行关于系统配置的判断,此处需要后台开启远程文件本地化的配置。否则无法进行本地化。

烟雨行舟之easySNS极简社区_V1.6代码审计

Webconfig获取系统配置项,如果存在缓存则获取缓存数据,如果不存在通过查询数据库获取。所以要利用这个漏洞需要后台开启远程图片本地化的配置。

烟雨行舟之easySNS极简社区_V1.6代码审计

后台开启远程图片本地化之后上面第284行校验通过,进入getImageLocal函数,进行远程图片本地化。

漏洞利用:

在vps上放置一个远程的恶意脚本test.php,内容如下:

烟雨行舟之easySNS极简社区_V1.6代码审计

通过readfile下载test.php是脚本解析过后的内容,所以可以把恶意代码编码一下。

之后在发帖位置输入如下内容:

烟雨行舟之easySNS极简社区_V1.6代码审计

发布之后就会出现利用漏洞下载远程文件。

烟雨行舟之easySNS极简社区_V1.6代码审计

通过查看帖子可以看到漏洞文件地址:如果无法查看的话可能需要猜猜8位随机数,比较困难。

烟雨行舟之easySNS极简社区_V1.6代码审计

然后可以在文件系统中看到这个恶意文件:

烟雨行舟之easySNS极简社区_V1.6代码审计

访问一下:存在的问题是前台看到的和实际地址有出入,需要自己拼接一下。

烟雨行舟之easySNS极简社区_V1.6代码审计