当某站点存在上传功能点,且未作过滤或过滤不严格时就会造成文件上传的漏洞,这会导致攻击者可以直接getshell

目录

基本攻击流程

白盒

白盒测试 直接审计代码  根据其中的过滤方法构造相应的攻击方式 尝试绕过

黑盒

黑盒测试
1.首先上传正常文件 抓取数据包 方便之后重放包测试
2.先修改文件格式后缀 上传看回显 判断过滤是白名单还是黑名单
3.确定过滤文件格式后 多步测试判断绕过方式 具体绕过方式下文

轻量级的检测绕过攻击

js检测后缀名

js检测后缀名,这种过滤方式属于在前端限制了上传文件的类型,后端一般不再做过滤
            
绕过方式:正常上传符合格式的文件,通过抓包,修改前端发送给后端的数据,达到绕过前端js过滤的目的,可修改文件格式、文件内容等。

服务器对请求包类型检测

属于后端检测,这种过滤方式一般是对前端发送过来的文件格式与白名单或者黑名单中的格式做对比

绕过方式:在抓到前端发送给后端的数据包后,通过在后缀名添加混淆的字符来跳过后端的检测

文件内容幻术头检测

属于文件内容检测,这种方式是对文件中的类型头检测,不符合类型的即丢弃
        
绕过方式:先上传一个正常的文件,抓包获取数据包,保留文件的类型头,对文件格式名以及字节内容进行修改

中量级检测绕过攻击

黑名单绕过

黑名单定义了一些不可执行的敏感文件,通常是对文件取文件格式进行判断,从而生成日期名的文件或者是源文件名的文件

利用系统识别字符绕过

windows系统中。某些文件名后面跟的字符是无效的 例如::$data/. ./系统不识别字符/
因此,可以通过在文件名后添加相关字符 逃出黑名单 从而达到绕过过滤进行文件上传‘
​
ps:特殊字符一般也会被过滤掉,因此需要通过复写 混写等方式来绕过过滤
​
示例:
        ::$data: 文件修改名为 test.php.php::$da::$datata
                 以小数点为截断 使php和::$data为空后后缀为==>  .php::$data
            因为该格式不在过滤名单内 所以正常上传文件  由于windows系统默认不执行data
            所以生成的文件实际上为 test.php  成功绕过上传
                    
        . .: 文件名修改为test.php. .
              文件过滤为先去除文件名前后的小数点 ==>  test.php.
              再从后往前取第一个小数点 做分割 后面的为文件格式==>  ''
              因为小数点后不存在数据  所以不在过滤格式内 成功绕过
              由于windows系统无视文件名后的小数点  所以实际文件为==>test.php 成功绕过上传

文件名大小写绕过

最简单的就是大小写混写,完整版本的中间件会成功解析,例如过滤php,可以使用Php/PHp/pHP绕过

特殊文件名绕过

例如使用系统不可识别的特殊字符绕过,例如php(0x81~0xff),绕过了黑名单,且系统不识别,在保存的时候会忽略该字符,从而保存为可执行的文件

0x00截断绕过

上传文件时正常上传,抓包手动添加一个save_path变量,并且设置为上传所保存的路径  
修改正常文件的内容,在正常保存后,通过截断丢弃掉保存的文件名
                       
示例  save_path=./upload/test.php(%00),这里的截断最好使用十六进制
      上传正常保存的文件名为 xxxxx.jpg
      实际保存的文件名为test.php(%00)xxxxx.jpg
      因为截断会丢弃后面的内容 实际保存的文件为test.php 成功绕过

.hatccess文件攻击

.htaccess文件是Apache的正常分装执行文件一般不会过滤,当没有过滤的时候编辑正常的文件直接上传
​
示例
​
.htaccess内容:
​
<FilesMatch "test">                //双引号内为指定字符串内容
SetHandler application/x-httpd-php   //将带有指定字符串的文件做php文件执行
</FilesMatch>
​
在上传该文件后上传正常的文件,抓包修改名字为test格式不变内容修改成相应可执行文件的代码
因为带test字段的文件会被当做php文件执行,所以文件内容里面的代码也会正常执行达到绕过目的

白名单绕过

0x00截断绕过(同上)

上传文件时正常上传,抓包手动添加一个save_path变量,并且设置为上传所保存的路径  
修改正常文件的内容,在正常保存后,通过截断丢弃掉保存的文件名
                       
示例  save_path=./upload/test.php(%00),这里的截断最好使用十六进制
      上传正常保存的文件名为 xxxxx.jpg
      实际保存的文件名为test.php(%00)xxxxx.jpg
      因为截断会丢弃后面的内容 实际保存的文件为test.php 成功绕过

Apache解析漏洞

Apache解析漏洞时对于不识别的格式 会往前找对应的格式进行执行 
​
如test.php.xxx  会被当成test.php执行
​
如果有黑名单且中间件为apache,那么在绕过黑名单的时候,可以通过保存为这种文件名或者直接保存为可执行的文件,达到绕过

IIS解析漏洞

IIS6.0解析漏洞

ASP漏洞一
在asp/asa/cer/cdx结尾的目录下该目录的所有文件都会以asp文件格式解析
​
例如test.asp目录下的1.jpg会被当做asp文件解析执行
ASP漏洞二
文件名中只要含有asp/asa/cer/cdx都会优先按照asp文件解析执行

IIS7.0/7.5解析漏洞

类似Nginx漏洞,对任意文件只要在文件名后添加‘/任意文件名.php’就会被当做php文件执行
            
示例  url/upload/1.jpg/xxx.php

Nginx解析漏洞

对任意文件只要在文件名后添加‘/任意文件名.php’就会被当做php文件执行
            
示例  url/upload/1.jpg/xxx.php

多文件上传

某些黑名单过滤规则为先生成文件再对文件的格式/文件内容/幻术头检测,检测不通过则删除生成的文件
​
所以通过直接上传一个php文件,内容为访问即生成一个文件,重复放包 
只要有一次在被删除前访问到,即可保留实际想要上传的文件
        
示例
    上传正常文件,通过正常文件的回显获取到上传文件保存的路径
    上传一个php文件 内容为<?php file_put_contents("文件名","文件内容");?>
    不上传抓包 
    手动访问上传文件保存路径并且抓包,修改目标为即将上传的php文件
    两个包都设置较大的重放次数尽量同时放包
    最后实际保存的文件为php文件中所写格式的内容文件
    从而达到绕过上传所需文件

管理员错误配置导致其他格式文件以脚本方式执行

类似.htaccess文件   

PHP文件包含漏洞

将木马文件包含进正常符合上传格式文件中从而达到绕过上传
​
先上传一个木马显示文件 用于测试木马
木马内容显示文件:
​
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?>
​
通过cmd将木马文件包含进正常文件 
cmd进入命令行cd进两个文件所在的目录,执行 copy /b 木马文件名 正常文件名  合成的新文件名

Put协议上传

put协议:当我们访问站点的某个资源时资源存在则替换不存在则创建
put攻击条件
        1.IIS服务器在web服务扩展中开启webdav
2.网站有写入权限
3.guest和iis有