文件上传漏洞解析

-- 情况绕过 --

前端检测绕过

  • 简介: 前端检测上传的文件的后缀名
  • 绕过:
    1. 先上传合法的文件, 再抓包修改为漏洞文件
    2. 修改相关检测的js代码
    3. 禁用js (火狐禁用js)
      地址栏输入about:config
      在搜索地址栏中输入javascript.enabled
      鼠标右键第一个,弹出菜单。再点击切换
      当一行的中的,值由trun变成false。时候说明已经关闭了。

后端检测文件类型

  • 检测content-type: 直接修改为合法MIME (对文件功能无影响)
类型 描述 典型示例
text 表明文件是普通文本,理论上是人类可读 text/plain
text/html
text/css, text/javascript
image 表明是某种图像。不包括视频,但是动态图(比如动态gif)也使用image类型 image/gif
image/png,
image/jpeg
image/bmp
image/webp
image/x-icon
image/vnd.microsoft.icon
audio 表明是某种音频文件 audio/midi
audio/mpeg,audio/webm,
audio/ogg,audio/wav
video 表明是某种视频文件 video/webmvideo/ogg
application 表明是某种二进制数据 application/octet-stream
application/pkcs12
application/vnd.mspowerpoint
application/xhtml+xml
application/xml,  
application/pdf
  • 检测文件头: 在文件二进制内容中加入相应文件头
类型 后缀 文件头(文件签名)
JPEG jpg FF D8 FF
PNG png 89 50 4E 47 0D 0A 1A 0A
GIF gif 47 49 46 38 37 61 (GIF87a) 或 47 49 46 38 39 61 (GIF89a)
XML xml 3C 3F 78 6D 6C
ZIP Archive zip 50 4B 03 04
RAR Archive rar 52 61 72 21
Windows Bitmap bmp 42 4D C0 01
TIFF tif 49 49 2A 00
HTML html 68 74 6D 6C 3E
MS Word/Excel doc/xls D0 CF 11 E0
RIFF webp 52 49 46 46

后端检测扩展名(黑名单)

  • 特殊解析后缀绕过尝试一些可平替的冷门格式 php平替: php3,php4,php5,phtml,pht,phps
  • 大小写绕过将文件后缀大小写
  • 点绕过windows文件名后缀后加点号会被自动删除, linux后缀后空白符后的点号会自动删除,但数据包中可以加上点号,上传后自动删除
  • 空格绕过文件名后缀后加空格会被自动删除,但数据包中可以加上空格,上传后自动删除
  • .htaccess解析绕过apache中.htaccess文件可以将同目录文件 名字中含指定字符串的 按照固定的方式解析, 可以先上传.htaccess再上传脚本文件
常用.htaccess设置

AddType application/x-httpd-php .png

<FilesMatch "1">
SetHandler application/x-httpd-php
</FilesMatch>
  • .user.ini解析绕过apache中.user.ini文件可以配置同目录文件的部分设置(除PHP_INI_SYSTEM模式的配置以外都可以在.user.ini中进行重写) 注:若没反应记得多刷新一下(经常这样), 该方法类似于[[文件包含]] (除了不能用伪协议, 相关绕过方法可参考)
常用.user.ini设置
1. auto_append_file=filename //一个相当于在每个php文件尾部加上 include('filename')
2. auto_prepend_file=filename //一个相当于文件内容开始加上 include('filename')
    filename实际为路径,可为绝对路径和相对路径
    上面两个则为利用文件包含漏洞执行代码
使用前提:服务器使用CGI/FastCGl模式,上传目录下要有可执行的php文件来执行include('filename')
    .user.ini只对他同一目录下的文件起作用
  • **::绕过文件名后加上DATA绕过(windowsphp)∗∗文件名后加上‘::DATA会将其后的数据当成文件流处理,不会检测后缀名, 上传到服务器的文件在Windows中会自动去掉::$DATA`
  • 后缀名嵌套(双后缀名绕过)若后端仅为有限次替换黑名单上后缀名为空后再传入,则嵌套后缀名如.pphphp
  • 配合解析漏洞配合相应中间件的解析漏洞
  • 伪装文件夹在数据包中在文件名后面加上/.将文件伪装成文件夹,最后保存时正常, 但检测到的后缀名为 后缀名/. (在/.后面再利用%00.<正常文件格式>可以绕过白名单)

后端检测扩展名(白名单)

  • %00截断(php版本小于5.3.29,关闭[[魔术引号]])
    • 原理:在保存文件时路径中%00后的字符会被忽略
    • 修改文件的上传地址,在地址后面加上想要的文件名加上%00,该方法能截断后端给文件命名的操作,%00后的路径名会被忽略——注:在get中用%00,在post等中要将%00解码 例子:如修改上传路径./upload为./upload/1.php%00966,并上传文件123.jpg 在后端则会将文件保存为./upload/1.php%00<后端想要赋予的文件名>.jpg, 最后将上传的文件123.jpg保存为文件1.php
    • 修改文件的上传名字,在文件脚本格式后面加上%00与另外一个正常格式,若后端只能检测在最后面的一个格式,则可以绕过
  • 配合文件包含通过文件包含会将所有类型文件当作php解析的特点, 以进行代码执行

图片二次渲染绕过

  • 简介: 许多服务会将上传的图片渲染后进行显示, 此时可能会改变写入图片马的代码部分缺失
  • 绕过: 比较新旧文件的内容,识别出相同(未被改变)的部分,将后门代码写到该部分 (待定)

条件竞争

  • 简介: 服务可能会将上传的文件先保存于可访问目录, 后再进行更改(改名,删除,换位置等), 更改后可能导致无法访问/位置未知
  • 绕过: 通过条件竞争(原理-文件被访问时无法对其进行更改, 会造成更改的代码堵塞), 上传文件后不断访问该文件, 使得木马执行后再被更改

文件目录位置无法访问

  • 前提: 上传的压缩文件自动解压
思路: 先上传一个zip,其中压缩了一个链接到/var/www/html的软链接test。然后,再上传一个zip,这次的zip中含有一个正常的文件夹test,里面有一句话木马的php文件。
第一次解压,会在tmp目录下产生一个软链接test。在第二次解压时,因为存在同名的文件(软链接test和正常文件夹test),此时解压程序会将test文件夹中的文件试图解压到已经存在的test中,而这个已经存在的test指向了/var/www/html,所以实际的解压位置就变成了/var/www/html
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇