个人学习参考用笔记
目录
前言
文件上传需要配合文件包含漏洞
一、文件上传
定义
指程序对文件的上传未作全面的限制,导致用户可以上传一些超越用户权限的一些文件,可以是木马,shell脚本,病毒等。
危害
可以通过文件上传漏洞上传webshell后门
查找及判断
- 黑盒:使用扫描工具扫描打开网站。
- 黑盒:测试会员中心(登录后作为用户上传资源),测试后台。
- 白盒:直接撸源代码。
分类
- 常规类:扫描获取、会员中心、后台系统、各种途径
- CMS类:CMS源码
- 编辑器类:ckeditor、fckeditor、xxxxeditor
- 其他CVE:代码审计、第三方应用
案例:
- 解析漏洞+图片中加入源码
- 上传脚本尝试绕过检测
- 文件上传靶场https://github.com/c0ny1/upload-labs
二、验证与绕过
文件上传验证方式:
后缀名(直接):黑名单、白名单
文件类型(间接):MIME信息
文件头(间接):内容头信息
前端防护
JS防护
通过前端js代码过滤文件后缀
后端防护
黑名单:
明确不让上传的格式后缀,如asp、php、jsp等不让上传
【尝试用php5 Phtml】
白名单:
明确可以上传的格式后缀,如只允许上传jpg、png、zip等
【相比黑名单更安全一些】
(一)黑名单
1.特殊解析后缀
对应lesson2
采用phtml,php3,php4, php5, pht的这种格式绕过通关大小写的方式绕过,但是前提是要在配置文件里面有这样的一句话:
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
2…htaccess解析
对应lesson3 只适用于apache
先上传一个.htaccess文件:
<FilesMatch "gg.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
意思是讲gg.jpg以php格式执行,之后再上传一个含有代码的jpg文件即可
3.大小写绕过
对应lesson5 只适用于windows
过滤代码中没有转换为小写的代码
上传“.Php”文件即可绕过
4.空格绕过
对应lesson6
过滤代码中没有去空格的代码
上传“.php ”文件即可绕过(在windows中文件后缀会自动去空格 但数据包中不会 上传到服务器后服务器会自动去除空格)
5.点绕过
对应lesson7
同理空格绕过,即上传“.php.” 服务器也会自动删除.
6.::$$DATA绕过
对应lesson8 只能应用于windows
同理5、6,上传“.::$$php” 这些方法都是基于windows命名规则
7.一次过滤
对应lesson9、10
如果过滤方法是一次过滤,而非循环过滤或递归过滤
.php会被过滤
.pphphp被过滤后变成.php
(二)白名单
1.MIME绕过
对应lesson2
发送符合要求的.jpg文件,在抓包软件中将后缀改为.php
或
直接发送.php文件,然后在浏览器中修改MIME类型(Contene-Type)为jpg
2.%00截断
对应lesson11、12 针对地址
【应用条件:
php版本小于5.3.4
php的magic_quotes_gpc为OFF状态】
关键代码:
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
%00作用:截断,后面数据都被注释掉
在抓包软件中,正常数据为
POST /uploadlabs/Pass-11/injdex.php?save_path=../upload
服务器都到的savepath为…/upload/2342432.jpg,即正常上传的图片文件
如果改为
POST /uploadlabs/Pass-11/injdex.php?save_path=../upload/1.php%00
则服务器的savepath为…/upload/1.php%004324232.jpg,图片名被截断,成功上传php文件
注:POST不会自动解码有时候需要把它进行url编码变成%25%30%30
3.0x00截断
针对文件名
(三)内容及其他
1.文件头检测
对于lesson13、14、15
gif文件头一般‘GIF89a’,png的文件头为塒‘NG’。
getimagesize,exif_imagetype等函数只能对图片起作用
【用文件包含漏洞执行上传的图片马】
2.二次渲染:
对于lesson16
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸,保存,删除 要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片(标准化)并放到网站对应的标签进行显示。
先上传一张图片马然后下载,将下载的图片马和原先的图片进行对比,发现没有被渲染的位置插入PHP代码最后在上传,再下载观察PHP代码是否被渲染。(针对jpg,png,gif的修改方式均不同
3.条件竞争:
对于lesson17
成功上传了php文件但后端在短时间内将其删除了,所以我们要抢到在它删除之前访问文件,(就如我们打开文件的时候去尝试删除它,会提示文件文件已打开无法删除)这样从而防止文件被删除。
我们可以上传一个有.php文件,后端会先将其放置在临时存放路径,然后才检验上传文件是否和要求的文件一致,如果不符合就会删除文件。那如果我们在从文件上传成功到开始检验文件后缀的这一段时间,我们进行访问该文件,那么就会导致防护被绕过,那就是相当于重命名这一过程就会被绕过。
网站开发者开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
三、漏洞
(一)中间件解析漏洞
tomcat文件解析漏洞
例:CVE-2017-12615
https://vulhub.org/#/environments/tomcat/CVE-2017-12615/
nginx解析漏洞
例:https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/
IIS6/7.X
apache解析漏洞
例:https://vulhub.org/#/environments/httpd/apache_parsing_vulnerability/
(二)编辑器漏洞
网站有些会有编辑器界面 如遇到可考虑编辑器漏洞
较老 碰到可去 https://navisec.it/编辑器漏洞手册/ 查询
通过目录扫描来寻找
例:
Fckeditor exp利用
ueditor 漏洞利用
(三)CMS文件上传
案例:通达OA https://www.cnblogs.com/twlr/p/12989951.html
四、WAF绕过
WAF检测机制:
- 检查文件内容 如检查图片中有没有php代码 应对后面WAF专题讲
- 检查文件名 filename
WAF绕过思路:
- 让WAF检测不出filename中的文件后缀,即防匹配
- 绕过的同时,还要保证上传的文件可以被执行(如上传‘.ph p’,能绕过但是无法执行’)
正常上传数据包中参数:
- Content-Disposition #一般可更改
- name #表单参数值,不能更改
- filename #文件名,可以更改
- Content-Type #文件MIME,视情况更改
正常数据包如下
Content-Disposition: from-data;name: "uploadfile";filename : "x.jpg"
Content-Type: image/jpeg;
常见绕过方法:
下面方法仅提供思路,防护方法也在进步
1数据溢出
在Content-Disposition和 name中间写入大量垃圾数据从而绕过
Content-Disposition: from-data;dgauysgdkauysgduaywdgayuwd此处为大量垃圾数据 结尾要有分号uaywdawgdiuyagwdukyGuayagwdiuyfytiftyf;name: "uploadfile";filename : "x.php"
Content-Type: image/jpeg;
2改变符号
filename只保留第一个双引号,WAF找不到后面的双引号,无法识别,但php能上传(猜测安全狗是寻找”前面的内容识别,因此保留后面的双引号不行)
Content-Disposition: from-data;name: "uploadfile";filename : "x.php
Content-Type: image/jpeg;
或
Content-Disposition: from-data;name: "uploadfile";filename : "x"x.php
Content-Type: image/jpeg;
3截断
1.%00截断
filename改为:“x.php%00x.jpg”
安全狗认为是jpg文件,但服务器%00后面的内容被截断,执行的是php文件(现在好像不行了,上传之后还是jpg文件
2.分号截断
filename改为:“x.jpg;.php”
安全狗识别到第一个分号就识别结束了
3.换行
文件后缀换行输入,安全狗识别到“x.p/nh/np”但服务器正常执行php
Content-Disposition: from-data;name: "uploadfile";filename : "x.p
h
p"
Content-Type: image/jpeg;
4重复参数
写很多个filename,看WAF识别的是哪个(看WAF代码是不是单次验证)
Content-Disposition: from-data;name: "uploadfile";filename : "x.php";filename : "x.php";filename : "x.php";filename : "x.php";filename : "x.php";filename : "x.php";filename : "x.php";filename : "x.php";filename : "x.php";filename : "x.php"
Content-Type: image/jpeg;
或把原有数据包的数据放进filename,将原有正常数据作为干扰项,类似白名单
Content-Disposition: from-data;name: "uploadfile";filename : "Content-Disposition: from-data;name: "uploadfile"x.php"
Content-Type: image/jpeg;
fuzzy字典
burp工具,先本机测试,直接fuzz目标会被封ip
https://github.com/fuzzdb-project/fuzzdb
https://github.com/TheKingOfDuck/fuzzDicts
https://github.com/TuuuNya/fuzz_dict
https://github.com/jas502n/fuzz-wooyun-org