Finger
拎着烈酒背着孤独踟蹰的代码狗

1. 初步分析

1.1 源码下载

提示有源码下载sgbmwww.rar,先打包回来。

1.2 功能简述

前台功能比较简单,就一个留言处+上传。提示是”寻找后台之旅”,一开始我以为就是XSS打管理员后台什么的,方向什么的完全错了。下面简单分析分析。

2. 具体分析

2.1 留言处

 

  • 第五行有一个文件包含,需要%00截断就可以读取任意文件。不过NULL字符被全局转移
  • name与message字段先经过了filter()处理,然后经过htmlspecialchars()处理。这样看来,漏洞很有可能发生在$_FORM表单。
  • 数据序列化之后直接插入数据库,jsonencode()是自己编写的函数,很有可能出问题

2.2 全局处理

上面是对name以及message字段进行处理的函数,然后进行了htmlspecialchars()。本人对XSS了解尚浅,并不能发现其中的奥妙

上面是另外一个全局处理的部分,它将GET、POST、REQUEST三个变量的数据进行addslashes()操作。然后全部放到$_M[‘form’]中。

2.4 文件上传

  • 程序封装了一个文件上传类,上传的时候调用了如下代码
  • 构造函数

这里使用了全局变量$_M,这个全局变量在后面会发挥很大的作用。set_upfile()主要是设置保存路径以及是否重命名的设置。1表示重命名,0表示不重命名。

  • 核心函数upload()与set_savename()
  1. 与文件上传的数组有两个,一个是$_M,另外一个$_FILES[$form]。$_M[“formname”]是可控的,我们可以在这里做点文章。
  2. 判断文件上传的后缀名之后就将$filear[“tmp_name”]复制到上传目录下,过程中没有经过is_uploaded_file()判断是否是上传文件。
  3. 文件重命名相关函数为set_savename()。这里只要$is_name === 0,就不会生成随机文件名。而且$filear[“name”]以及$filear[“is_rename”]都是我们可控的。

3. 具体操作

3.1 文件上传漏洞导致敏感文件信息泄露。

提交上面的表单,就可以将/etc/apache2/apache2.conf的文件copy到upload/apache2.conf

从里面获取到后台地址为:http://www.example.com:8080/。不知道是什么原因,我没法访问,于是我只能直接把那个目录复制过去!哎~~~可能是我太菜了

3.2 jsondecode()解析导致代码执行getshell

浏览后台的时候发现,发现后台显示的是name|message|filename。在入库之前,使用了自己写的jsonencode(),出库之后很有可能用的就是jsondecode()。下面是jsondecode()的源码。

上面比较敏感的函数就是eval()就是将反序列化之后的字符串执行一次,变成数组!这里很有可能存在代码执行的漏洞。这里最重要的就是闭合双引号!大概的形式就是

我在测试的时候,第一次上传这样的代码是不行的,我用burp再上传了一次结果就可以了。纯粹地运气好,下面分析一下具体原因,问题出现在重命名那里

这里的处理比较复杂,如果重命名 -> 那么就判断是否已经存在文件 -> 如果存在就给文件进行编号。出现问题的代码如下:

它的操作大概就是将文件名的后缀过滤掉,然后在文件名的地方进行编号,最后添上后缀!就是在添上后缀这里出错了,$this->ext一直没有被过滤,如果文件后缀中存在双引号,那么到了这一步同样会拥有双引号。具体的payload如下:

 

这篇文章有人发言喽~

  1. I Don’t even want to go outside to try and find something – which would be impossible anyway. 10 degrees this am.Not much warmer here, but can’t stay inside all day…keep moving and it feels waml&re#8230;werl maybe. –s

    Charleigh

    2016/12/28

    @Ta
    #1

发表评论