什么是文件上传漏洞? 存在文件上传的地方,均有可能存在文件上传漏洞。 文件上传漏洞有哪些危害? 可以成为webshell,直接获取当前网站权限。 文件上传漏洞如何查找及判断? 文件上传漏洞有哪些需要注意的地方? 关于文件上传漏洞在实际应用中的说明?
1、文件上传思路
第一步:找中间件,看能不能配合解析漏洞,没有的话
第二步:找上传点,直接上传,没有的话
第三步:看能不能黑名单绕过,没有的话
第四步:看能不能白名单绕过,没有的话
第五步:看能不能内容绕过,没有的话
第六步:看能不能配合CMS进行上传绕过,没有的话
第七步:看有没有编辑器进行绕过,没有的话
第八步:配合新爆出的CVE漏洞,进行绕过,没有的话
2、上传流程
- 图片是否能正常上传
- 图片上传内容是否被感染(内容替换) 分为前端替换和后端替换,可以再bp抓包里面改。
- 上传的域名是否是目标服务器
- 如果不是那么判断图片服务器是否解析(php,asp,aspx,jsp,cfm.shtml等)
- 上传的目录是否支持解析(php,asp,aspx,jsp,cfm.shtml等)
- 判断是否给白名单验证
3、JS验证
- 第一种bp改包
第一步:
先把phpinfo.php
修改为phpinfo.jpg
然后上传抓包
第二步:抓包将phpinfo.jpg
改为phpinfo.php
,然后放包
看浏览器已经上传成功
- 修改源代码
第一步:
将if(mime!=".jpg")改为if(mime==".jpg")
第二步上传:
第三步上传成功:
- 其他方法
4、截断上传
第一步:首先上传一个phpinfo,php文件
第二步:打开代理进行抓包
第三步:将phpinfo.php
改为phpinfo.php%00.jpg
已经成功绕过了
5、黑白名单验证上传
文件上传黑名单验证
- 白名单验证:存在一个专门文件,记录服务器允许上传的文件名。
jpg,png,zip,rar,gif......
- 黑名单验证:存在一个专门文件,记录服务器不允许上传的文件名。
asp,php,jsp,aspx,cgi,war......
- 可以尝试php3,php4,php5,phtml或者使用服务器解析漏洞等
# 扩展名检测 <?php if(isset($_POST['submit'])){ $name = $_FILES['file']['name']; // 获取文件名 $ext = substr(strrchr($name,"."),1); //获取扩展名[strrchr()找到符号"."并返回从该位置到结尾的所有字符(字符串),substr(str,1)获得扩展名字符串] while($ext==xxx){} // 调用黑白名单进行循环对比,一旦命中则执行相关的放过/拦截操作! } ?>
6、二次上传
7、文件上传分析
8、mime类型绕过
MIME检测原理:
服务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法。
# 校验Content-type字段MIME类型 <?php if($_FILES['file']['type'] != 'image/jpeg'){ // 判断文件的MIME格式 echo "Sorry!文件上传格式错误 Error"; exit; } ?>
绕过MIME校验:利用burp抓包工具,将content-type
字段改为需要的MIME类型
9、解析漏洞
9.1、IIS5.X/IIS6.0文件解析漏洞
- 目录名中含有.asp字符串的(目录下)均按照asp文件进行解析;例如:index.asp/目录中的所有文件都会asp解析当出现xx.asp命名的文件名,访问目录下任意一个文件,均会送给asp.dll解析(执行asp脚本)
- 文件名中含有.asp;字符,即使时jpg格式文件,IIS也会按照asp对文件进行解析当文件名xx.asp;xx.jpg,IIS6会将文件送给asp.dll解析(按照asp脚本解析);请求时:IIS从左往右检查.号,查询到;或/号则(内存)截断;如此执行后,IIS认识的就是xx.asp
- 默认解析:.asa .cer .cdx IIS6 同时默认解析前面三个文件后缀,都会给asp.dll解析
- 修复方案:设置权限,限制用户创建、修改文件夹权限更新微软的补丁或者自定义修改IIS的检测规则,阻止上传非法的文件名后缀
9.2、IIS7.0/7.5
- 默认开启 Fast-CGI 状态,在一个服务器文件URL地址后面添加xx.php会将xx.jpg/xx.php解析为PHP文件
- 修复方法:修改php.ini文件,将cgi.fi: x_pathinfo设置为 0
- IIS7的解析漏洞主要是由于PHP的配置不当导致的Windows操作系统中,文件名不能以空格或“.”开头,也不能以空格或“.”结尾。当把一个文件命名为以空格或“.”开头或结尾时,会自动地去掉开头和结尾处的空格和“.”。利用此特性,也可能造成“文件解析漏洞”。
9.3、Nginx<=0.8.37(Nginx解析漏洞)
影响版本:0.5/0.6/<0.7.65/<0.8.37
- Fast-CGI开启状态下,存在如同IIS7一样的漏洞:URL地址后面添加xx.php会将xx.jpg/xx.php解析为PHP文件空字节:xx.jpg%00.php (部分版本中,Fast-CGI关闭下也会被执行)
- 修复方法:修改php.ini文件,将cgi.fix_pathinfo设置为 0 [关闭]再Nginx配置中设置:当类似xx.jpg/xx.php的URL访问时候,返回403;
if ( $fastcgi_script_name ~ ..*/.*php) { return 403 ; }
9.4、Apache解析漏洞
- Apache解析文件的规则时从右到左开始判断,如果后缀名为不可识别文件解析,则会继续向左判断,直至可以正确识别xxx.php.owf.zip 其中.owf和.zip文件后缀Apache不识别,直至判断.php才会按照PHP解析文件
- 修复方法:Apache配置中,禁止xx.php.xxx类似的文件执行
<Files ~ "/.(php.|php3.)"> Order Allow,Deny Deny from all </Files>
10、双文件上传
11、找已知上传漏洞
- 知道编辑器直接上百度搜索已知漏洞,看百度上怎么绕过,做借鉴。\
12、案例演示
- 常规文件上传地址的获取说明
- 不同格式的文件类型后门测试
- 配合解析漏洞下的文件类型后门测试
第一步打开环境
第二步启动环境
查看密码
第三步登录环境
登录后台页面,点击base_domain的配置,在“高级”中开启“启用 Web 服务测试页”选项:
第四步: 访问http://your-ip:7001/ws_utc/config.do,设置Work Home Dir为/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css
我将目录设置为ws_utc应用的静态文件css目录,访问这个目录是无需权限的,这一点很重要。
然后抓包
第五步: 然后访问http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名],即可执行webshell:
- 本地文件上传漏洞靶场环境搭建测试
第一步:打开环境
第一步:直接抓包,改成1.jpg
改成1.php
,然后上传成功
- 某CMS及CVE编号文件上传漏洞测试
13、upload-labs通关笔记
Pass-01
第一步:查看源码,看到只允许上传jpg,png,gif
第二步,上传1.jpg文件抓包改为1.php文件
第三步:上传成功
Pass-02
第一步:查看源码,很明显是一个mime上传
第二步:抓包改mime
第三步:上传成功
Pass-03
第一步:查看源码
第二步:抓包,尝试用.php5
进行绕过
第三步:上传成功,并且可以直接访问
Pass-04
第一步:查看源码
这种情况,我们可以尝试上传一个.htaccess配置文件,将4.png图片当作php代码进行解析,首先创建一个.htaccess文件,里面写上代码
Pass-05
第一步:查看源码
第二步: 这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。所以我们的绕过思路就很简单,在数据包中把后缀名改为.php. .说一下他的验证过程,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php. 由于他只是验证一次,所以不会在去掉我们的点,这时就可以上传成功,也可以解析成功。如下图:
第三步:查看上传是否成功
Pass-06
第一步:查看源码
第二步:经过尝试,在6.php
后面加一个空格可以进行绕过
第三步:尝试访问
Pass-07
第一步:查看源码
第二步:在后面7.php.
在文件后面加一点进行绕过
第三步:查看脚本是否上传成功
Pass-08
第一步:查看源码
第二步:经过分析源码发现,后面没有过滤::$data
,我的在后面加上::$data
进行过滤
第三步:查看是否上传成功
Pass-09
第一步:查看源码
第二步:直接根据源码9.php. .
后面直接多加一个点空格点
第三步:查看上传是否成功
Pass-10
第一步查看源码
第二步:经过抓包尝试,进行10.pphphp
进行绕过
第二步:查看是否上传成功
Pass-11
第一步:查看源码
第二步:抓包进行尝试,看到这里有路径,尝试用11.php%00.jpg
进行%00截断:
前提条件
- php版本低于5.3
- magic_quotes_gpc关闭
第三步:查看是否上传成功
Poss-12
第一步:查看源码
第二步: 和十一关不同的是这次的save_path是通过post传进来的,还是利用00截断,但这次需要在二进制中进行修改,因为post不会像get对%00进行自动解码。
第三步:查看上传是否成功:
13、文件上传之内容逻辑数组绕过
演示案例
- Upload-pass13-20关卡测试
- CVE-2017-12615-上传-Tomcat
- 中间件解析漏洞-配合文件上传测试
- IIS-上传-解析
- Apache-上传-解析-vulhub
- Nginx-上传-解析-vulhub
涉及资源
Smi1e 文件解析漏洞汇总
14、文件上传之解析漏洞编辑器安全
几种中间件解析漏洞简要演示
- IIS6/7简要说明-本地搭建
- Apache配置安全--vulhub
- Apache解析漏洞-低版本
- Apache换行解析-vulhub(CVE-2017-15715)
第一步:打开环境
第二步:打开网页,进行抓包,然后修改包里面的东西,把GET修改为PUT,后面加上shell.php,文件名字,上传冰蝎码
第三步:在浏览器访问冰蝎码,这里显示的是200,表示访问成功
第四步:利用冰蝎进行连接
- Nginx解析漏洞-vulhub
第一步:打开环境
第二步:打开网站上传图片码
第三步:直接访问图片带后缀,结果如下:http://192.168.192.130/uploadfiles/156005c5baf40ff51a327f1c34f2975b.jpg/.php
- Nginx文件名解析-vulhub
几种常见的WEB编辑器简要演示
- Fckcditor cxp利用
- ueditor漏洞利用
几种常见CMS文件上传简要演示
- 通达OA系统
参考资料:通达OA文件上传+文件包含漏洞 - 终落 - 博客园
贴近实际应用下的以上知识点演示
- 判断中间件平台,编辑器类型或CMS名称进行测试
涉及资源
https://www.jb51.net/softs/75619.html https://pan.baidu.com/share/init?surl=5gcdBuOFrN1F9xVN7Q7GS A 提取码:enqx
15、文件上传之WAF绕过及安全修复
上传参数解析:明确那些东西能修改?
- Content-Disposition: 一般可更改
- name:表单参数值,不能更改
- filename:文件名,可以更改
- Content-Type:文件MIME,视情况更改
常见的绕过方法
- 数据溢出-防匹配(xxx...)
- 符号变异-防匹配(' " ;)
- 数据截断-防匹配(%00;换行)
- 重复数据-防匹配(参数多次)
Payload过安全狗的各种绕过
大量垃圾数据缓冲溢出(Content-Disposition,filename 等)
filename=x.php
filename="x.php
filename='x.php
filename="a.jpg;.php";
filename="a.php%00.jpg"
filename="Content-Disposition: form-data; name="upload_file";x.php"
filename="x.jpg";filename="x.jpg";.....filename="x.php";
filename="xxx/x.jpg"
filename=
"
x
.
p
h
p
"
文件上传的修复方法:
后端验证:采用服务端验证模式
后缀检测:基于黑名单,白名单过滤
MIME检测:基于上传自带类型检测
内容监测:文件头检测
自带函数过滤:参考uploadlabs函数
自定义函数过滤:function check_file(){}
WAF防护产品:宝塔,云盾,安全公司等
案例演示:
上传数据包参数对应修改测试
Safedog+云服务器+uploadlabs 测试
Safedog+云服务器+uploadlabs_fuzz 测试
文件上传安全修复方案-函数自定义及 WAF
涉及资源:
https://github.com/fuzzdb-project/fuzzdb
https://github.com/TheKingOfDuck/fuzzDicts