0
点赞
收藏
分享

微信扫一扫

[Web安全攻防]-(文件上传)

孟佳 2022-04-25 阅读 84
网络安全

什么是文件上传漏洞?
存在文件上传的地方,均有可能存在文件上传漏洞。
文件上传漏洞有哪些危害?
可以成为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

举报

相关推荐

0 条评论