漏洞原理---文件上传漏洞

# 文件上传漏洞

# 漏洞成因:

  • 后端存在文件上传的功能,并且没有对上传的文件内容,大小,类型做严格的安全限制。导致攻击者可以使用恶意文件直接威胁服务器

# 挖掘点:

  • 上传头像
  • 上传文档
  • 发表文章,发表评论中的插入图片

# 漏洞危害:

  • 未限制文件内容或者类型
    • 网站被 getshell
    • 服务器被提权
  • 未限制文件大小
    • 服务器拒绝服务攻击

# 利用思路

# 1、Nginx 服务 (通常运行在 Linux 上,如果运行在 Windows 上,也可以使用 windows 特性绕过)
  • 文件名解析逻辑漏洞
    • 前提条件
      • nginx 0.8.41-1.4.3 或 1.5.0-1.5.7
      • 上传: webshell.jpg空格 ,访问: webshell.jpg.php 00 这里使用 HEX 编辑,不能使用空格
  • 00 截断:
    • 前提条件
      • 版本 0.5、0.6、0.7<=0.7.65,0.8<=0.8.37
    • 上传: webshell.jpg空格 ,访问: webshell.jpg.php 00 这里使用 HEX 编辑,不能使用空格
  • 解析漏洞:
    • 前提条件:
      • PHP 配置 cgi.fix_pathinfo 开启
      • 上传: webshell.jpg 图片马,访问 webshell,jpg/.php
# 2、IIS 服务 (IIS 服务部署在 windows 上,可以利用 windows 特性和 IIS 对应的解析漏洞绕过)
  • 利用 windows 特性绕过
    • 文件后面加空格 (%20) 会被忽略
      • webshell.php%20
    • 文件后面加点会被忽略
      • webshell.php.
    • 文件后面加 ::$DATA::其他::$DATA 后的文件会识别为文件流
      • webshell.php::$DATA::其他
    • 会自动删除冒号后面的内容
      • webshell.php:.jpg
# 3、Apache 服务 (通常运行在 windows 上,如果运行在 Windows 上,也可以使用 windows 特性绕过)
  • .htaccess 文件绕过

    • .htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置,通过 .htaccess 可以帮我们实现:网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许 / 阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
    • .htaccess 文件的主要功能包括使用密码保护文件夹,禁止或允许用户使用 IP 地址访问,禁止目录浏览,将用户自动重定向到另一个页面或目录,创建和使用自定义错误页面,改变具有特定扩展名的文件的使用方式,或者通过指定文件扩展名或特定文件作为主页。
    • .htaccess(mod_rewrite) 中的 apache 的重写模块,这个模块允许重定向发生。
    • 前提条件:
      • mod_rewrite 模块开启
      • AllowOverride ALL
    • 先上传 .htaccess 文件,再上传 jpg 图片文件
      • AddType application/x-httpd-php .jpg
    • .htaccess 文件内容:
  • # 虽然好用,但是会误伤其他正常文件,容易被发现
    <IfModule mime_module>
    AddHandler php5-script .gif          #在当前目录下,只针对gif文件会解析成Php代码执行
    SetHandler application/x-httpd-php    #在当前目录下,所有文件都会被解析成php代码执行
    </IfModule>
    
    # 精确控制能被解析成php代码的文件,不容易被发现
    <FilesMatch "evil.gif">
    SetHandler application/x-httpd-php   #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
    AddHandler php5-script .gif          #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
    </FilesMatch>
    
    # 同1没太大区别
    <IfModule mime_module>
    AddType application/x-httpd-php .gif
    </IfModule>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338



    - 利用方式:上传覆盖`.htaccess`文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。
    - 0A换行绕过
    - 前提条件:
    - Apache版本号为2.4.0-2.4.29
    - 服务器必须为Linux
    - 获取文件名时不能用`$_FILES['file']['name']`,因为它会自动把换行去掉
    - 使用:Burp抓包,在文件名后面增加字母`a`,在HEX编辑模式下,修改a的61为`0a`
    - 访问文件使用:`**webshell.php%0a**`
    - 多后缀上传
    - 前提条件:Apache版本为1.x-2.x
    - 上传多个后缀,如`webshell.php.qwe.swe`
    - SSI命令执行漏洞
    - 前提条件:目标服务器开启了SSI与CGI协议
    - 上传`webshell.shtml`文件,即可执行`whoami`命令

    #### 利用思路-通用方法

    - 00截断(运行环境存在漏洞,并不是代码上存在的漏洞)
    - 前提条件:
    - PHP版本<5.3.4
    - `magic_quotes_gpc=Off`
    - 在Burp中抓上传包修改文件名为`webshell.php1`,在HEX编辑窗口,将1改为`00`;URL当中的00阶段需要使用`%00`

    - 陌生后缀绕过

    - 可以将陌生后缀保存为常用字典,在测试时使用burp进行爆破
    - PHP站点:`php,php5,php4,php3,php2,html,htm,phtml,phar,pht,shtml`
    - ASP站点:`asp,aspx,asa,asax,ascx,ashx,asmx,cer,cdx`
    - JSP站点:`jsp,jspa,jspx,jsw,jsv,jspf,jtml`

    - 大小写绕过

    - 后端在设置的时候没有设置统一的大小写设置
    - 先获取文件名,将文件名转为字符串,调用字符串当中转小写的方法,把文件名转为小写,然后再判断这个小写的字符串在不在黑名单中

    - 双写后缀绕过

    - `webshell.pphphp`剔除`php`后就是`webshell.php`
    - `webshell.p.phphp`剔除`.php`后就是`webshell.php`
    - CTFHub关键代码 `$name = str_ireplace($blacklist, "", $name);`
    - `str_ireplace(find,replace,string,count)`替换字符串中的一些字符(不区分大小写)
    - `replace:` 必需。规定替换
    - `find:`中的值的值。
    - `string:`必需。规定被搜索的字符串。
    - `count:`可选。一个变量,对替换数进行计数。

    - MIME类型绕过

    - 上传`webshell.php`,只修改`Content-Type`为图片类型,如`image/jpeg`

    - 后端只检测`Content-Type`,则只修改`Content-Type`即可绕过,无需修改后缀

    - 将一句话木马压缩进图片中(尽可能小的图片)
    命令:`copy 1.jpg/b+2.php 3.php`

    - ```
    ie 火狐
    id 后缀名 php识别出的文件类型
    0 gif image/gif
    1 jpg image/jpeg
    2 png image/png
    3 bmp image/bmp
    4 psd application/octet-stream
    5 ico image/x-icon
    6 rar application/octet-stream
    7 zip application/zip
    8 7z application/octet-stream
    9 exe application/octet-stream
    10 avi video/avi
    11 rmvb application/vnd.rn-realmedia-vbr
    12 3gp application/octet-stream
    13 flv application/octet-stream
    14 mp3 audio/mpeg
    15 wav audio/wav
    16 krc application/octet-stream
    17 lrc application/octet-stream
    18 txt text/plain
    19 doc application/msword
    20 xls application/vnd.ms-excel
    21 ppt application/vnd.ms-powerpoint
    22 pdf application/pdf
    23 chm application/octet-stream
    24 mdb application/msaccess
    25 sql application/octet-stream
    26 con application/octet-stream
    27 log text/plain
    28 dat application/octet-stream
    29 ini application/octet-stream
    30 php application/octet-stream
    31 html text/html
    32 htm text/html
    33 ttf application/octet-stream
    34 fon application/octet-stream
    35 js application/x-javascript
    36 xml text/xml
    37 dll application/octet-stream
    38 dll application/octet-stream
    id 后缀名 php识别出的文件类型
    0 gif image/gif
    1 jpg image/pjpeg
    2 png image/x-png
    3 bmp image/bmp
    4 psd application/octet-stream
    5 ico image/x-icon
    6 rar application/octet-stream
    7 zip application/x-zip-compressed
    8 7z application/octet-stream
    9 exe application/octet-stream
    10 avi video/avi
    11 rmvb application/vnd.rn-realmedia-vbr
    12 3gp application/octet-stream
    13 flv application/octet-stream
    14 mp3 audio/mpeg
    15 wav audio/wav
    16 krc application/octet-stream
    17 lrc application/octet-stream
    18 txt text/plain
    19 doc application/msword
    20 xls application/vnd.ms-excel
    21 ppt application/vnd.ms-powerpoint
    22 pdf application/pdf
    23 chm application/octet-stream
    24 mdb application/msaccess
    25 sql text/plain
    26 con application/octet-stream
    27 log text/plain
    28 dat text/plain
    29 ini application/octet-stream
    30 php application/octet-stream
    31 html text/html
    32 htm text/html
    33 ttf application/octet-stream
    34 fon application/octet-stream
    35 js text/html
    36 xml text/xml
    37 dll application/octet-stream
    38 class application/java

    * application/octet-stream //应用程序
    323 text/h323
    acx application/internet-property-stream
    ai application/postscript
    aif audio/x-aiff
    aifc audio/x-aiff
    aiff audio/x-aiff
    asf video/x-ms-asf
    asr video/x-ms-asf
    asx video/x-ms-asf
    au audio/basic
    avi video/x-msvideo
    axs application/olescript
    bas text/plain
    bcpio application/x-bcpio
    bin application/octet-stream
    bmp image/bmp
    c text/plain
    cat application/vnd.ms-pkiseccat
    cdf application/x-cdf
    cer application/x-x509-ca-cert
    class application/octet-stream
    clp application/x-msclip
    cmx image/x-cmx
    cod image/cis-cod
    cpio application/x-cpio
    crd application/x-mscardfile
    crl application/pkix-crl
    crt application/x-x509-ca-cert
    csh application/x-csh
    css text/css
    dcr application/x-director
    der application/x-x509-ca-cert
    dir application/x-director
    dll application/x-msdownload
    dms application/octet-stream
    doc application/msword
    dot application/msword
    dvi application/x-dvi
    dxr application/x-director
    eps application/postscript
    etx text/x-setext
    evy application/envoy
    exe application/octet-stream
    fif application/fractals
    flr x-world/x-vrml
    gif image/gif
    gtar application/x-gtar
    gz application/x-gzip
    h text/plain
    hdf application/x-hdf
    hlp application/winhlp
    hqx application/mac-binhex40
    hta application/hta
    htc text/x-component
    htm text/html
    html text/html
    htt text/webviewhtml
    ico image/x-icon
    ief image/ief
    iii application/x-iphone
    ins application/x-internet-signup
    isp application/x-internet-signup
    jfif image/pipeg
    jpe image/jpeg
    jpeg image/jpeg
    jpg image/jpeg
    jpg image/pjpeg
    js application/x-javascript
    latex application/x-latex
    lha application/octet-stream
    lsf video/x-la-asf
    lsx video/x-la-asf
    lzh application/octet-stream
    m13 application/x-msmediaview
    m14 application/x-msmediaview
    m3u audio/x-mpegurl
    man application/x-troff-man
    mdb application/x-msaccess
    me application/x-troff-me
    mht message/rfc822
    mhtml message/rfc822
    mid audio/mid
    mny application/x-msmoney
    mov video/quicktime
    movie video/x-sgi-movie
    mp2 video/mpeg
    mp3 audio/mpeg
    mpa video/mpeg
    mpe video/mpeg
    mpeg video/mpeg
    mpg video/mpeg
    mpp application/vnd.ms-project
    mpv2 video/mpeg
    ms application/x-troff-ms
    mvb application/x-msmediaview
    nws message/rfc822
    oda application/oda
    p10 application/pkcs10
    p12 application/x-pkcs12
    p7b application/x-pkcs7-certificates
    p7c application/x-pkcs7-mime
    p7m application/x-pkcs7-mime
    p7r application/x-pkcs7-certreqresp
    p7s application/x-pkcs7-signature
    pbm image/x-portable-bitmap
    pdf application/pdf
    pfx application/x-pkcs12
    pgm image/x-portable-graymap
    pko application/ynd.ms-pkipko
    pma application/x-perfmon
    pmc application/x-perfmon
    pml application/x-perfmon
    pmr application/x-perfmon
    pmw application/x-perfmon
    png image/x-png
    pnm image/x-portable-anymap
    pot, application/vnd.ms-powerpoint
    ppm image/x-portable-pixmap
    pps application/vnd.ms-powerpoint
    ppt application/vnd.ms-powerpoint
    prf application/pics-rules
    ps application/postscript
    pub application/x-mspublisher
    qt video/quicktime
    ra audio/x-pn-realaudio
    ram audio/x-pn-realaudio
    ras image/x-cmu-raster
    rgb image/x-rgb
    rmi audio/mid
    roff application/x-troff
    rtf application/rtf
    rtx text/richtext
    scd application/x-msschedule
    sct text/scriptlet
    setpay application/set-payment-initiation
    setreg application/set-registration-initiation
    sh application/x-sh
    shar application/x-shar
    sit application/x-stuffit
    snd audio/basic
    spc application/x-pkcs7-certificates
    spl application/futuresplash
    src application/x-wais-source
    sst application/vnd.ms-pkicertstore
    stl application/vnd.ms-pkistl
    stm text/html
    sv4cpio application/x-sv4cpio
    sv4crc application/x-sv4crc
    t application/x-troff
    tar application/x-tar
    tcl application/x-tcl
    tex application/x-tex
    texi application/x-texinfo
    texinfo application/x-texinfo
    tgz application/x-compressed
    tif image/tiff
    tiff image/tiff
    tr application/x-troff
    trm application/x-msterminal
    tsv text/tab-separated-values
    txt text/plain
    uls text/iuls
    ustar application/x-ustar
    vcf text/x-vcard
    vrml x-world/x-vrml
    wav audio/x-wav
    wcm application/vnd.ms-works
    wdb application/vnd.ms-works
    wks application/vnd.ms-works
    wmf application/x-msmetafile
    wps application/vnd.ms-works
    wri application/x-mswrite
    wrl x-world/x-vrml
    wrz x-world/x-vrml
    xaf x-world/x-vrml
    xbm image/x-xbitmap
    xla application/vnd.ms-excel
    xlc application/vnd.ms-excel
    xlm application/vnd.ms-excel
    xls application/vnd.ms-excel
    xlt application/vnd.ms-excel
    xlw application/vnd.ms-excel
    xof x-world/x-vrml
    xpm image/x-xpixmap
    xwd image/x-xwindowdump
    z application/x-compress
    zip application/zip -firefox
    application/x-zip-compressed -IE

    php上传压缩文件(rar,7z,zip)
    php上传可执行文件(exe)
    php上传视频文件,音乐文件,歌词文件(avi,rmvb,3gp,flv,mp3,wav,krc,lrc)
    php上传文本文件和文档文件(word->doc,excel->xls,幻灯片->ppt,pdf,chm)
    php上传数据库文件(access文件,sql文件,con文件,日志文件log, dat文件)
    php上传网页文件,脚本文件,字体文件(ini,php,html,htm,字体文件:ttf,fon, js ,xml)
    php上传其他文件(class类文件,dll动态加载库文件)
  • 上传图片马

    • 上传图片马后利用文件包含点执行图片马
      • 一般来说,如果先找到文件包含漏洞,才考虑使用图片马
  • 条件竞争

    • 通常情况下,条件竞争漏洞不推荐使用,高并发请求容易对服务器造成影响
    • 先获取上传文件,在保存文件到目录下,判断是否是 php 文件,如果是,删除。只有在在保存文件到目录下,判断是否是 php 文件这种逻辑情况下才能使用条件竞争
  • JavaScript 校验

    • 禁用 js 前端验证

# 漏洞修复 - 加固与防御

  • 使用最新版中间件

    • 及时更新中间件版本,防止使用漏洞版本
  • 正确配置中间件

    • 错误中间件配置会导致解析漏洞
  • 对保存上传文件的文件夹限制权限

    • 配置中间件,不解析上传文件夹中的文件
  • 使用白名单和 MIME 类型限制上传

    • 在确保以上的情况下,使用白名单和 MIME 结合检测文件类型和内容,着重检查文件名称中的特殊字符串
  • 增加安全设备,网站防火墙

    • 为了安全保证,最好是加上防火墙和防护设备
  • 限制文件大小

    • 假设服务器有 4G 内存,直接上传 5G 内容,导致服务器内存爆满,从而造成拒绝服务攻击
  • OSS

    • 将所有的静态资源托管到 OSS 平台上,这样只需要在加载资源时,防范文件包含漏洞即可
      不暴露上传后的文件的保存路径

漏洞原理---文件上传漏洞
https://rofgd.github.io/2022/10/14/漏洞原理---文件上传漏洞/
作者
ReadPond
发布于
2022年10月14日
许可协议