文章目录
- 项目安装
- 安装docker
- 进入项目目录:
- 一键部署运行
- 靶场关卡
- 1、前端JS验证
- 如何判断是否为前端验证
- 解法1:抓包
- 解法2:禁用JS
- 2、.htaccess
- 解法
- 3、MIME类型
- 解法
- 4、文件头判断
- 5、黑名单过滤-过滤不严-单次过滤为空格
- 6、黑名单-过滤不严-系统大小写敏感属性
- 7、低版本GET-%00截断,GET中插入截断
- 00截断漏洞:
- 适用条件:
- 解法
- 8、低版本POST-%00截断,POST中插入截断
- 9、黑名单-过滤不严
- 10、逻辑不严-条件竞争
- 原理
- 漏洞利用:
- 11、二次渲染
- 二次渲染
- 绕过原理:
- 12、函数缺陷
- 原理
- 利用条件
- 漏洞利用
- 13、代码审计-数组绕过
文件上传靶场upload-labs-docker,共有13关,涵盖不同类型的上传漏洞,适合新手使用,可以使用docker直接部署
项目&参考地址:
https://github.com/sqlsec/upload-labs-docker
https://www.sqlsec.com/2020/10/upload.html
项目安装
安装docker
apt-get install docker # 安装docker
apt-get install docker-compose # 安装docker-compose
手动下载项目压缩包并放入服务器(git clone可能会比较慢)
进入项目目录:
cd upload-labs-docker
一键部署运行
docker-compose up -d
完成即可访问,端口30001~30013分别对应13个关卡(若要修改端口,在docker-compose.yml
文件中修改即可)
靶场关卡
1、前端JS验证
在文件上传时,网站程序是通过前端js代码去验证文件类型以控制上传的。
如何判断是否为前端验证
- 看源码
- 抓包监听,在文件上传时,如果还未抓到包,就已经提示文件类型不正确,则大概率为前端校验了。
解法1:抓包
将上传脚本文件改命为png再上传,后抓包修改文件名回脚本后缀(php)即可
解法2:禁用JS
因为是使用前端JS进行验证,所以可以禁用JS,直接进行上传。
2、.htaccess
htaccess文件是Apache服务中的一个配置文件,它负责相关目录下的网页配置。
AddType application/x-httpd-php .png
借助配置文件htaccess,让服务器将.png
类型的文件当作类型application/x-httpd-php
来解析执行(即php类型)
.htaccess
是修改解析配置的文件
中间件中,将配置文件重新写入,重新修改了解析规则,实现将图片解析为后门的结果。
解法
1、抓包,将文件名改为.htaccess
,文件内容改为AddType application/x-httpd-php .png
,上传
2、将脚本名改为.png
格式,上传,即可连接脚本。
3、MIME类型
通过MIME类型来校验文件类型。即发送数据包中的Content-Type
参数来检验。
所以可以通过抓包修改参数绕过。
解法
1、上传脚本时抓包修改Content-Type
为合法类型,如: image/png
2、将脚本名改为合法类型(.png),上传时修改文件名。
4、文件头判断
文件头开头的几个字节可表示文件类型,文件头校验即校验文件头内容,要绕过只需在文件头添加可通过类型字节并修改UA头中类型即可。
5、黑名单过滤-过滤不严-单次过滤为空格
如上代码第二行,仅将第一行定义的后缀过滤了一次,且是替换为空格,并没有递归过滤,这种过滤规则是不安全的
所以,只要将文件后缀改为pphphp
,即可在第一次过滤掉php,剩下的后缀仍为php
6、黑名单-过滤不严-系统大小写敏感属性
有些函数是大小写不敏感的,所以换大小写就可绕过,该种情况CTF题型考的多
该题中,str_replace() 函数替换字符串中的一些字符(区分大小写)。
所以将后缀改大小写即可绕过,若是windows系统,大小写不敏感,即可识别运行。
如果是windows操作系统,大小写不敏感,大写的文件后缀也识别运行。
Linux系统会区分大小写,要么全大写,要么全小写,大小写交替不识别。
7、低版本GET-%00截断,GET中插入截断
00截断漏洞:
https://blog.csdn.net/weixin_44840696/article/details/90581104
适用条件:
magic_quotes_gpc=off
- PHP版本小于5.3.4
在利用前会发包利用回显的版本判断是否可用。
现在基本都是php7版本以上,所以基本没有该漏洞了。
解法
修改路径为/?road=/var/www/html/upload/1.php%00
,名称为1.php%001.png
,会将文件保存地址拼接,而%00
会被URL编码为空字符,造成截断。
截断后,会生成1.php文件,上传成功。
8、低版本POST-%00截断,POST中插入截断
POST中内容不会自动解码,所以需要手工解码一次,即需要将%00手动解码为空字符,或在HEX中修改字符为00
如下,修改POST参数中上传路径,并手工解码即可上传成功。
9、黑名单-过滤不严
过滤不严,有的可执行后缀未过滤。
fuzz字典:fuzzdb-master\attack\file-upload
brpsuite抓包,使用intruder模块,将后缀设为变量,引入字典进行批量测试。
对比返回结果的长度可得结果。
由以上结果可知如php3
等后缀并未进行黑名单过滤,可绕过进行文件上传。
10、逻辑不严-条件竞争
该漏洞少
原理
先上传,接收文件,再进行判断处理,若不通过则删除文件。即文件在服务器存储过,逻辑不严谨。
条件竞争:在文件上传到服务器,还没有进行判断的时候访问到后门。
该漏洞是逻辑上的问题。
漏洞利用:
不断的发包上传访问,请求连接,
上传不断发包,请求不断发包
访问即创建代码文件出来。即访问了就自动触发将后门写入新文件的代码。
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
上传前设置好一直访问对应上传路径。(在burpsuite的intruder模块中设置为no payload,然后让他一直发,就会一直循环发包访问,将文件上传的包也批量发送。)
在黑盒测试中,需要先上传正常文件查看保存路径以及命名,如果命名为随机命名则不能使用该思路了
漏洞判断:黑盒中没办法判断,白盒中可以审计判断,黑盒中即使用该测试方法,测不出来就是没有该漏洞
11、二次渲染
二次渲染
有些网站会对上传的文件进行二次渲染,改变文件内容,上传的带有后门代码的图片/文件会被更改而无法使用
绕过原理:
先搞个正常图片,上传导出渲染后的图片
使用二进制软件对比保留部分,在保留部分添加后门代码
最后利用提示的文件包含执行图片后门代码
很多网站存在的,和文件包含结合。
意义:有时候上传了带有后门的文件(如图片),但是经过网站的二次渲染后,后门代码没了,没有保留,需要了解二次渲染才能让上传的文件中保留代码段。
12、函数缺陷
原理
文件上传使用的函数有缺陷。
move_uploaded_file($temp_file, $img_path)
当 $img_path
可控的时候,还会忽略掉 $img_path
后面的 /.
所以将文件名改为:shell.php/.
后加上/.
,即可绕过黑名单。
利用条件
- 用到
move_uploaded_file
函数 - 保存的文件名可控,可由自己指定文件名
漏洞利用
将文件名改为:shell.php/.
后加上/.
CTF常考。
13、代码审计-数组绕过
主要考察php代码审计,代码中的逻辑缺陷
现在的文件上传漏洞都不明显,一般比较容易发现的上传位置都没有上传漏洞,在一些难发现的上传点产生文件上传漏洞的概率较大。