5iSNS内容付费系统组合漏洞getshell

  • 发表于
  • Vulndb

5iSNS内容付费系统

系统涵盖文库、帖子等功能。知识付费结合社交网络,更快更好的适应互联网发展趋势。知识付费意味着人们对高质量知识内容的渴求,也是对知识的尊重,有迫切需要的人自然会乐于付费。社交网络开始服务知识付费是大势所趋。在互联网惯性下,内容、社交、付费,三者合一,站长将在此基础上享受更多红利。

5iSNS漏洞说明

是一个组合漏洞利用的过程,步骤

  1. 先文件上传的漏洞上传压缩包
  2. 然后通过sql注入漏洞拿到数据库中存放的压缩包信息
  3. 再利用压缩包信息去构造payload触发解压缩操作
  4. 最终实现getshell

sql注入漏洞

其实乍一看他的数据库连接函数,都带有pdo的字样,但是跟进去具体瞧一瞧才发现其实还是用了很多的原生处理,如转义等操作,并没有完全做到预编译。

最初的入口漏洞代码位于5isns/basephp/func/db.func.php第241行

这里对应的其实就是最简单的select功能,这里需要重点关注$cond这个参数,这其实就是我们用户传入的键值对。跟进到find_one函数中去,代码位于5isns/basephp/class/db_pdo_mysql.class.php第156行

这里开始就有点类似于那种pdo的样子,占位传输,我们仅需跟进到db_cond_to_sqladd函数,代码位于5isns/basephp/func/db.func.php第295行

从第一个foreach开始取get或者post中的键名和对应的值,但是这里的is_array($v)引起了我的警觉,假设我们的传入一个参数例如id[test]=1,那么来看看会发生什么

5iSNS内容付费系统组合漏洞getshell

从图中可以看到这里的id作为键,test和1作为array,那么其中的test其实就是value中的键,因此会进入到程序中的最后一个循环,这里重新梳理下程序流程

重新梳理下,如果我们输入id[test]=1,那么最终$k1就会等于test,$v1就会等于1,最终拼接的语句就为idtest\'1',那么这里我们就能直接控制test这个变量,需要注意的是在这类注入漏洞中不能使用等于号,因此这里注入漏洞可以使用in语句或者like语句来替代等于号的功能。

文件上传

由于前台用户是无限制注册的,因此这里在上传压缩包的时候虽然需要用户权限,但是等同于无限制,另外在上传文档的时候由于需要后台管理员审核,因此在前台上传文档后是看不到任何相关信息,但是压缩包和文档的相关信息其实都已经存在数据库里了,这里通过sql注入漏洞都可以拿到。

5iSNS内容付费系统组合漏洞getshell

这里的$allowtype为attach,也就是上传的压缩包是会写入到attach目录下,为后面埋下伏笔。。

漏洞组合

由于最终目标是getshell,但是通过sql注入拿到管理员账号和密码,登录进后台发现并没有能够getshell的漏洞,因此挖掘重点就在怎么解压缩先前这个压缩包,如果能够解压缩那么就能够获得压缩包中的shell文件,达到getshell的目的。所以接下来开始搜索跟解压缩相关的函数。
解压缩的通用代码位于5isns/basephp/func/xn_zip.func.php第36行

这里的功能其实就是解压缩,下面开始搜索调用该函数的相关代码,在一处前台无需用户权限的代码里看到了调用,漏洞代码位于5isns/app/index/controller/doc.php

这里的param参数跟进去看其实等同于$_REQUEST获取变量的方式,因此下面需要思考如何进入到最终的unzip函数。

第一个限制条件$time-intval($time1)>60这个主要是过期判断,因此每次都带上time参数就能够覆盖先前的time1变量。

第二个限制条件file_exists($tmpurl),这里回溯就会发现这里的$tmpurl是由$_FILES['file']参数获得,这也是用户可以控制的参数,只要保证每次传入的文件名不一样即可进入到if条件中。

第三个限制条件move_uploaded_file($data['file']['tmp_name'], $tmpurl)会将我们当前上传的文件由tmp目录写入到docview目录下。这里就有个问题,那就是我们先前在上传文件那一步上传文档的最终物理路径并不是docview目录,因此如果想要直接解压缩先前上传的文档,目前来看由于物理路径的不一致,这条路并不能走通。

最终进入到了else条件下,第四个限制条件也是最关键的条件,这里解压缩的文件名是通过数据库查取得到,查取条件就是我们传入的sha1值,看到这里其实就有点柳暗花明了。这里在数据库当中一个sha1值就会对应一个savename,最后也就是对这个savename进行解压缩。那么这个sha1值和savename就是根据先前在文件上传那步定义的,配合上sql注入漏洞,我们就可以到数据库中去取这个sha1值和savename。

取完进入到最终的unzip函数,这里文件名是docview目录下的,也就是说先前在文件上传那步涉及的压缩包在这里并不能被解压缩,他只是提供了一个能够解压缩的文件名。因此在这一步我们就必须通过$_FILES['file']来将savename的同名文件上传到docview目录下。然后通过传入对应的sha1值来解压缩这个同名文件,最终获得压缩文件中的shell。

5iSNS payload

作者:ADog via