1.1. 前言

这一章我们来讲文件上传漏洞,文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。用它获得服务器权限最快最直接。但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识。

1.2. 文件上传检验思路:

  • 上传一个正常的图片检验上传点是否可用,是程序员自己写的上传点,还是编辑器的上传功能。
  • 上传图片马,修改后缀为php,检验是前端检验还是后端检验,是内容检验还是后缀检验。把后缀随便改一个检验是黑名单还是白名单。
  • 判断服务器是什么类型,web服务器程序,是什么类型,版本号多少,利用系统,语言或者中间件的解析漏洞。

1.3. 黑名单绕过

1.3.1. 可解析后缀

其实很多语言都这样,有多个可以解析后缀。当目标站点采用黑名单时,往往包含不全。

语言 可解析后缀
asp/aspx asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr
php php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml
jsp jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

1.3.2.  利用系统特证

  • Windows下文件名结尾加入.,空格,<>,>>>,0x81-0xff等字符,最终生成的文件均被windows忽略。
  • Windows下ADS流特性,导致上传文件xxx.php::$DATA = xxx.php
  • Windows下文件名不区分大小写,Linux下文件名区分大小写。

1.3.3. 利用.htaccess文件

在apache中.htaccess可以重写apache配置(对当前目录下的所有文件和文件夹有效),该方式主要来绕过黑名单。

例如.htaccess写入代码:

该文件夹下的所有shell.xxx 都可以解析为php文件

<FilesMatch "shell"> 
SetHandler application/x-httpd-php 
</FilesMatch>

但利用前提是apache启用了.htaccess文件。

1.4. 中间件的解析漏洞

1.4.1. iis

可参考文章中间件安全-IIS篇

  • 1.IIS6.0文件解析漏洞xx.asp;.jpg(;后面的内容被忽略)

  • 2.IIS6.0目录解析 xx.asp/1.jpg (目录名为xx.asp里面的所有文件都可以解析为asp文件)

  • 3.IIS 7.0畸形解析 xxx.jpg/x.asp(上传xx.jpg访问xx.jpg/x.asp即可解析成asp文件)

1.4.2. apache

中间件安全-apache篇

  • 1.换行解析漏洞
  • 2.未知后缀 test.php.xxx(apache当右边的后缀无法识别(不在 mime.tyoes 内),则继续向左识别,直到可识别后缀 )

1.4.3. nginx

中间件安全-nginx篇

  • 访问连接加/xxx.php test.jpg/xxx.php
  • 畸形解析漏洞 test.jpg%00xxx.php
  • CVE-2013-4547 test.jpg(非编码空格)\0x.php

1.4.4. tomcat

tomcat用于上传绕过的有三种,限制在windows操作系统下。

xxx.jsp/
xxx.jsp%20
xxx.jsp::$DATA

1.5. 00截断漏洞

00截断一般有%00截断和0X00截断,两者都是一样的,只是不同表示而已

参考文章:00截断原理分析

1.5.1. %00截断

在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束

所以当我们构建这样的payload:

在上传的时候系统就会默认帮我们把%00后面的东西给去除。

https://mp.csdn.net/upfiles/?filename=test.php%00.jpg

1.5.2.  0X00截断

0x开头表示16进制,0在十六进制中是00, 0x00就是%00解码成的16进制

img

这里在php的后面添加了一个空格和字母a,其实a写不写都可以,这里加a是为了显示空格的位置。空格是为了占位,方便修改00。然后打开hex,(空格的16进制为0x20)修改16进制内容,把20改成00:

img

img

这样我们就可以绕过上传限制了。

1.5.3. php下的00截断

利用条件:

php版本小于5.3.4
php的magic_quotes_gpc为OFF状态

1.6. 文件上传绕过WAF检测

可认真看这几篇文章,菜鸡就不班门弄斧了,只做一些这些的总结: 我的WafBypass之道(upload篇)

文件上传突破waf总结

1.6.1. waf会检测哪里?

请求的url
Boundary边界
MIME类型
文件扩展名
文件内容

1.6.2. 一. 检测文件扩展名

1. 寻找黑名单之外的扩展名

在前面我已经总结过了各大语言的一些可解析后缀,实战中进行测试即可

2.构造畸形的数据包

(1) 删掉content-type

(2)构造多个filename

例如:

Content-Disposition: form-data; name="upload_file"; filename="preview.jpg"
Content-Disposition: form-data; name="upload_file"; filename="preview.jpg"
Content-Disposition: form-data; name="upload_file"; filename="preview.jpg"

或者进行换行:

Content-Disposition: form-data; name="upload_file"; 
filename="preview.jpg";filename="preview.jpg";
Content-Disposition: form-data; name="upload_file"; filename="pre
view.jpg";

(3)把filename参数变畸形

正常的包:

Content-Disposition: form-data; name="upload_file"; filename="preview.jpg";

在后面在多添加一个“即可绕过

Content-Disposition: form-data; name="upload_file"; filename="preview.jpg"";

经过上面可以看出很多容器并不严谨,我们可以多进行测试,参试是否能够绕过WAF

1.6.3. 二.垃圾数据填充

Content-Disposition

waf如果对Content-Disposition长度处理的不够好的话可能会导致绕过,例如:

在Content-Disposition: form-data; name="upload_file"后面填充垃圾数据。

文件名

  • 基于构造长文件名

  • 如果web程序会将filename除了扩展名的那段重命名的话,那么还可以构造更多的点、符号等等。

  • 特殊的长文件名:

    文件名使用非字母数字,比如中文等最大程度的拉长,不行的话再结合一下其他的特性进行测试:

    shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg
    

1.6.4. 三.内容检测

  • 图片马
  • 文件包含
  • 替换被检测的内容
  • 先上传一些小功能的脚本,比如写文件,cmdshell等等

1.6.5. 参考文章

文件上传突破waf总结

我的WafBypass之道(upload篇)

构造优质上传漏洞fuzz字典

results matching ""

    No results matching ""