文件上传绕过总结——详细保姆篇

admin 2024年11月3日00:19:35文件上传绕过总结——详细保姆篇已关闭评论16 views字数 4709阅读15分41秒阅读模式

前端

js类绕过

  1. 页面直接修改js上传文件方法(按F12使用网页审计元素,把校验的上传文件后缀名文件删除,即可上传。)
  2. 抓包改包,在contnet-type将上传的文件后缀进行修改;(例如:a.jsp.jpg ——抓包修改为——a.jsp%00截断文件名)

https://www.runoob.com/http/http-content-type.html

  1. 复制页面,重新构建新页面,获取方法,并修改;

后端

一、黑名单绕过

基于黑名单验证思路:只针对黑名单中没有的后缀名,文件才能上传成功。

当后缀在黑名单中时,存在可供替代的后缀名绕过黑名单(可以burpsuite使用字典批量尝试)

语言

默认(服务器)可解析后缀

盲猜绕过可解析后缀

asp.net

【IIS】

asp,aspx,asa,asax,ascx,ashx,

asmx,cer,aSp,aSpx,aSa,aSax,

aScx,aShx,aSmx,cEr

php

.php.html.htm【apache】

php,php5,php4,php3,php2,

pHp,pHp5,pHp4,pHp3,pHp2,

html,htm,phtml,pht,Html,Htm,

pHtml

jsp  

*.jsp,*.jspx【tomcat

jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,

jSpx,jSpa,jSw,jSv,jSpf,jHtml

  1. Tomcat添加可解析后缀名:

路径: apache-tomcat-x.x.x\conf\web.xml

文件: web.xml

修改位置: <url-pattern>*.*</url-pattern>

    <servlet-mapping>

        <servlet-name>jsp</servlet-name>

        <url-pattern>*.jsp</url-pattern>

        <url-pattern>*.jspx</url-pattern>

    </servlet-mapping>

  1. Apache添加可解析后缀名:

路径:Apache24\conf\httpd.conf

文件:httpd.conf

修改位置:AddType application/x-httpd-php .php .html .htm

在htaccess 里写入 SetHandler application/x-httpd-php 则可以文件重写成 php 文 件。要htaccess 的规则生效 则需要在apache开启rewrite重写模块,一般多数都是自动开启的。

如果需要手动开启方式:

路径:Apache24\conf\httpd.conf

文件:httpd.conf

位置1:如下代码

<Directory "${SRVROOT}/htdocs">

    Options Indexes FollowSymLinks

    AllowOverride None (将None改为ALL)

    Require all granted

</Directory>

位置2: 去掉注释

#LoadModule rewrite_module modules/mod_rewrite.so

Windows 系统下,文件后缀名最后一个点会被自动去除。

Linux 系统下,文件后缀名最后一个点不会被自动去除。

使用方法:利用 BurpSuite 工具截断 HTTP 请求,上传文件后缀名加 . 绕过上传。

Windows系统下,对于文件名中空格【demo.php(空格)】会被作为空处理,程序中的检测代码却不能自动删除空格,从而绕过黑名单。

通过BurpSuite截断 HTTP 请求之后,在对应的文件后缀名处添加空格。

  • (win)点绕过和空格绕过结合

例如:

    a.php[空格](点)[空格]

    a.php .

    a.php(点)[空格](点)

Windows下:

a.php(点)+空格+(点)

deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为1.php.

利用Windows自动去除最后一个点,导致成功上传1.php;

背景原因:(windows特性)

在window系统下,如果上传的文件名为a.php::$DATA,它会在服务器上生成一个a.php的文件,其中内容和所上传内容相同,并被解析。

利用示例:

通过BurpSuite截断 HTTP 请求之后,在对应的文件后缀名处添加::$DATA。

特别说明:

在windows下,无法直接测试::$DATA,因为windows不允许后缀名中存在特殊字符;

nginx 0.83 截断字符                         1.jpg%00php

apahce 1x 或者2x                           当apache 遇见不认识的后缀名,会从后向前解析例如1.php.rar 不认识rar就向 前解析,直到知道它认识的后缀名。

phpcgi 漏洞(nginx iis7 或者以上)    上传图片后1.jpg。访问1.jpg/1.php 也会解析成 php。 Apache HTTPD 换行解析漏洞(CVE-2017-15715)        apache 通过mod_php 来运行脚本,其2.4.0-2.4.29 中存在apache换行解析漏洞, 在解析php时xxx.php\x0A将被按照PHP后缀进行解析,导致绕过一些服务器的 安全策略。

如:a.php——>a.pphphp

过滤掉php后,会重新拼接为新的php

防御措施:

使用递归循环过滤,不使用一次过滤

$_POST['save_name']文件是可控

攻击方法:

1.上传文件,文件马采用%00 截断,抓包解码例如moon.php%00.php 截断后 moon.php 或者使用/.

2.与中间的漏洞配合使用 例如 iis6.0 上传1.php;1.jpg apache 上传1.php.a 也 能解析文件 a.asp;1.jpg 解析成asp

注意: %00 截断 需要gpc 关闭 抓包 解码 提交即可 截断文件名 php版本小于 5.3.4

二、白名单绕过

  • MIME绕过(类似于js法2)

MIME绕过,又叫HTTP请求头中的Content-Type属性绕过

每个MIME类型由两部分组成,前面是数据的大类别,例如声音 audio、图象 Image等,后面定义具体的种类。

MIME拦截代码样例:

@Controller

@RequestMapping(value = "/users", method = RequestMethod.POST, consumes="image/*")

@ResponseBody

public List<User> addUser(@RequestBody User userl) {  

    return List<User> users;

}

//consumes:指定处理请求的提交内容类型(Content-Type),例如application/json、text/html;等。如果不是指定的类型不响应;

//上面这个方法【仅处理】请求Content-Type为【image/*】类型的请求。

MIME利用示例:

通过抓包的形式,修改Content-Type类型,将类型指定为:image/*

Content-Type类型位于HTTP Request 中,要以网站为中心,request表示获取数据,response表示返回数据;

  1. %00截断(后端要求目录可控)

00截断的核心:

当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃。

例如1.php%00.1.jpg 变成 1.php(GET参数直接是%00即可,但POST需要把%00 decode 才可以

这种情况常出现在ASP程序中,PHP 版本<5.3.4时也会有这个情况,JSP中也会出现。

- php版本要小于5.3.4;    5.3.4及以上已经修复该问题

- magic_quotes_gpc需要为OFF状态,否则会把%00转换成其他的字符

文件上传绕过之00截断

【%00和0x00】区别:

它们最终的结果都是一样的,都代表着chr(0),即空字符,只不过使用的位置不同,0x00代表16进制的空字符00,需要在HEX中改为00,进行截断,而**%00是URL解码之前的字符**,它被解码成16进制ASCII码之后实际上也是0x00,所以它们最终都对应的是空字符,这里%00可以用在URL中如xx.php?filename=test.php%00.txt,也可以直接插在Burp包中的路径中,如path=shell.jsp%00.txt

0x00截断

0x00是十六进制表示方法,表示ASCII码为0的字符,在一些函数处理时,会把这个字符当作结束符。

0x00可以用在对文件名的绕过上,具体原理:系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。也就是说系统是按二进制或十六进制读取文件,遇到ASCII码为0的位置就停止,而这个ASCII码为0的位置在十六进制中是00。

总之就是利用ASCII码为0这个特殊字符,让系统认为字符串已经结束。

0x0a截断

0x0a是十六进制表示方法,表示ASCII码为/n的换行字符,具体为换行至下一行行首起始位置

方法一:

a)先将一句话木马写入txt文件,改文件后缀为png格式(白名单中存在的后缀名);

b)用010打开,将正确Png文件头放入,保存即可。

c)上传,用bp抓包,然后修改文件后缀为.php格式,放包

d)用蚁剑连接

方法二:

a)准备一个要上传的图片;一个一句话木马.php

b)执行命令:

copy CSDN.png/b+1.php/a phpinfo.png

c)上传图片!

方法三:

burpsuite 上传的数据包头加上GIF89a(数据头)

getimagesize 是获取图片的大小,如果头文件不是图片会报错直接可以用图片马 绕过检测。

通常一个session建立是会被session锁定机制进行锁住,防止多个并发请求同时修改session数据,这个漏洞的原理是利用了PHP_SESSION_UPLOAD_PROGRESS 特性,当 PHP 处理文件上传请求时,会短暂解锁会话文件,允许并发请求访问,攻击者利用这个窗口,发送包含恶意 PHP_SESSION_UPLOAD_PROGRESS 字段的请求来达到任意命令执行的目的

Burpsuite抓包后intuder爆破(提高线程使得删除文件时间延长,便于访问的时候文件还存在),改包

三、数组上传绕过

支持数组上传或者数组命名。

构造上传表单,设置数组上传。

四、二次图片渲染绕过

二次渲染:为了压缩图片对图片进行二次渲染,会删除图片中的恶意代码。在源码中使用imagecreatefromgif函数对图片进行二次生成

注意:gif图片在二次渲染后,与原图片差别不会太大。 所以二次渲染攻击最好用git图片马。

方法:

  1. 制作图片马
  2. 原图片上传,下载渲染后的图片进行对比(010/ winhex——》工具——》比较——》搜索相同;展示区,蓝色部分是没有发生变化的),找相同处,在相同的地方覆盖字符串,填写一句 话后门,或者恶意指令

五、文件头绕过

1.图片马

2.php文件改后缀白名单,010打开修改16进制头文件格式,抓包改回后缀

3.burp抓包直接在文件前面添加文件头

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月3日00:19:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   文件上传绕过总结——详细保姆篇https://cn-sec.com/archives/3348121.html