文件上传骚姿势合集

Posted 爱吃仡坨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传骚姿势合集相关的知识,希望对你有一定的参考价值。

目录

黑名单规则绕过

绕过前端 js 检测方法

判断是否为前端检测还是后端服务器检测方法

绕过 contnet-type 检测上传

常见MIME类型

绕过黑名单上传

同解析后缀名

. htaccess 重写解析绕过上传

大小写绕过上传

空格绕过

利用 windows 系统特征绕过上传

::$DATA (NTFS 交换数据流)绕过上传

利用 windows 环境的叠加特征绕过上传

也可以使用phpinfo.php:$DATA 命令上传并创建空白文件

双写后缀名绕过

白名单规则绕过

目录可控%00 截断绕过上传

目录可控 POST 绕过上传

文件头检测绕过上传

文件头检测绕过上传方法二

图片检测函数绕过上传

绕过图片二次渲染上传

文件名可控绕过上传

%00截断

分号;截断

/、绕过

与中间件漏洞配合绕过

数组绕过上传

 总结

防御手段


黑名单规则绕过

绕过前端 js 检测方法

判断是否为前端检测还是后端服务器检测方法

前端绕过,我们可以通过浏览器中F12进入开发者模式修改前端代码
或者
上传一个jpeg等image格式的后缀,里面内容是恶意代码,通过BP抓包修改jpeg为.php后缀;达到绕过前端规则的目的

绕过 contnet-type 检测上传

对于一些上传模块,会对http类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败
因为服务器端是通过content-type判断类型,content-type在客户端可被修改。所以此文件上传也有可能被绕过风险

抓包修改content-type类型为后台允许的类型image/jpeg

 在repeater中,方便查看响应包及其上传后的大马路径

 通过在浏览器中输入大马所在路径,发现后台成功解析

常见MIME类型

超文本标记语言 .htmltext/html
普通文本 .txttext/plain
RTF 文本 .rtfapplication/rtf
GIF 图形 .gifimage/gif
PNG图形 .pngimage/png
JPEG 图形 .jpeg、.jpgimage/jpeg
au 声音文件 .auaudio/basic
MIDI 音乐文件 mid、.midiaudio/midi、audio/x-midi
RealAudio 音乐文件 .ra、.ramaudio/x-pn-realaudio
MPEG 文件 .mpg、.mpegvideo/mpeg
AVI 文件 .avivideo/x-msvideo
GZIP 文件 .gzapplication/x-gzip
TAR 文件 .tarapplication/x-tar

绕过黑名单上传

上传模块时,有时会写成黑名单过滤机制,后台服务器会将上传的文件后缀名与程序中黑名单(代码中会提示不允许php、asp等提示则判断为黑名单限制)进行检测,如果后缀名在黑名单列表内,则禁止上传改文件

上传黑名单以外的后缀名即可。
在 iis 里 asp 禁止上传了,可以上传 asa cer cdx 这些后缀,如在网站里允许.net执行,可以上传 ashx 代替 aspx。如果网站可以执行这些脚本,通过上传后门即可获取 webshell。
在不同的中间件中有特殊的情况,如果在 apache 可以开启 application/x-httpd-php
在 AddType application/x-httpd-php .php .phtml .php3
后缀名为 phtml 、php3 均被解析成 php 有的 apache 版本默认就会开启。
上传目标中间件可支持的环境的语言脚本即可,如.phtml、php3。

此时我们上传一个后缀为php3的shell文件,发现后台成功上传且解析(另外在windows下搭建环境的话需要php为5.2.x的版本)

同解析后缀名

. htaccess 重写解析绕过上传

在文件上传处,黑名单过滤了所有的能执行的后缀名,如果允许上传.htaccess
.htaccess文件的作用是 可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定 IP 地址的用户、只允许特定 IP 地址的用户、禁止目录列表,以及使用其他文件作为 index 文件等一些功能。
在 htaccess 里写入 SetHandler application/x-httpd-php 则可以文件重写成 php 文件。
要 htaccess 的规则生效 则需要在 apache 开启 rewrite 重写模块,因为 apache是多数都开启这个模块,所以规则一般都生效

 本地创建.htaccess文件并将如下内容加入其中(意为上传的png图片,并且通过处于相同目录下的htaccess文件会将png文件当做php执行脚本去解析)

<FilesMatch 'png'>
 SetHandler application/x-httpd-php
</FilesMatch>

之后将编辑好的.htaccess文件上传到后台

 接下来上传内置好PHPinfo函数的图片,看是否后台能解析

大小写绕过上传

后台若是没有对上传的后缀名的大小写进行严格判断,导致可以更改后缀大小写可以被绕过。如 PHP、 Php、 phP、pHp
通过查看黑名单,发现phP没有禁止,我们尝试上传

空格绕过

如果文件名后缀没有过滤空格的话,我们可以抓包通过空格进行绕过

利用 windows 系统特征绕过上传

在win系统中,系统对文件名后缀有点的,比如.php.会把最后的点忽略系统最终解析为.php;因此针对于windows系统可以尝试后缀加点进行绕过

::$DATA (NTFS 交换数据流)绕过上传

如果后缀名没有对::$DATA 进行判断,利用 windows 系统 NTFS 特征可以绕过上传。
::$DATA   # 其中一个冒号表示创建文件,两个冒号表示写入文件内容

利用 windows 环境的叠加特征绕过上传

在 windwos 中如果上传文件名 shell.php:.jpg 的时候,会在目录下生产空白的
文件名 shell.php
再利用 php 和 windows 环境的叠加属性,
以下符号在正则匹配时相等
双引号" 等于 点号.
大于符号> 等于 问号?
小于符号< 等于 星号*
文件名.<或文件名.<<<或文件名.>>>或文件名.>><空文件名

先上传一个jpg文件,内置phpinfo函数

 抓包修改后缀为ggbond.php:.jpg后发包,此时服务器已经创建了ggbond.php空白文件

接下来继续在repeater模块中操作
请求包中修改文件名为ggbond.>>>其中三个大于号表示匹配后面三个后缀并将内容写入到匹配的文件中

也可以使用phpinfo.php:$DATA 命令上传并创建空白文件

 之后如何写入内容,同上

双写后缀名绕过

有的代码会把黑名单后缀名替换成空 $file_name = str_ireplace($deny_ext,"", $file_name);(str_ireplace则为此作用)
比如a.php会被后台将php替换为空,此时我们可以使用双写绕过
例如pphphp等绕过限制

白名单规则绕过

上面都是黑名单绕过姿势,如果黑名单上传检测后,没有限定后缀名,绕过的方法很多;
接下来就开始针对于白名单规则的一个绕过姿态,相对于黑名单而言,白名单较为安全,但是有可控的参数目录,也存在被绕过的风险

目录可控%00 截断绕过上传

PHP版本<5.3.4
关闭magic_quotes _gpc(magic_quotes _gpc=OFF)

代码中使用白名单限制上传的文件后缀名,只允许指定的图片格式。但是$_GET['save_path']服务器接受客户端的值,这个值可被客户端修改。所以会留下
安全问题。

 在URL请求行中构造payload
../upload/ggbond.php%00
当ggbond.php%00和maggbond.jpg拼接之后在后端会被最终识别为ggbond.php(%00后面内容会被截断不会读取)

目录可控 POST 绕过上传

上面是 GET 请求的,可以直接在 url 输入%00 即可截断,但是在 post 下直接注入%00 是不行的,需要把%00 解码变成空白符,截断才有效。才能把目录截断成文件名。
第十二关代码同样是白名单限制后缀名,$_POST['save_path']是接收客户端提交的值,客户端可任意修改。所以会产生安全漏洞。

 在请求体中对1构造的payload的%00进行编码绕过

 成功上传

文件头检测绕过上传

有的文件上传,上传时候会检测头文件,不同的文件,头文件也不尽相同。常见的文件上传图片头检测 它检测图片是两个字节的长度,如果不是图片的格式,会禁止上传。
常见的文件头

  • JPEG (jpg),文件头:FFD8FF
  •  PNG (png),文件头:89504E47
  •  GIF (gif),文件头:47494638
  •  TIFF (tif),文件头:49492A00
  •  Windows Bitmap (bmp),文件头:424D

 将内置函数放入动图gif中(下面copy命令在windows的DOS命令行中执行生成)

copy 3.gif/b+phpinfo.php dt.gif

查看恶意gif文件是否成功创建

 上传恶意gif文件并且复制上传后的gif文件路径

 在文件包含漏洞处对其上传恶意文件进一步读取

成功解析

文件头检测绕过上传方法二

直接上传phpinfo文件,在抓取的数据包中手工写入符合需求的文件头

 接着通过文件包含漏洞成功解析phpinfo动态脚本

图片检测函数绕过上传

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

方法可直接用上面上传gif恶意文件方法绕过,下面我再通过jpg文件型图片马进行演示

接着通过文件包含漏洞解析成功

 uploadlabs第十五关时候phpstudy需要开启exif服务,如下图;之后绕过方法同上

绕过图片二次渲染上传

有些图片上传,会对上传的图片进行二次渲染后在保存,体积可能会更小,图片会模糊一些,但是符合网站的需求。例如新闻图片封面等可能需要二次渲染,因为原图片占用的体积更大。访问的人数太多时候会占用很大带宽。二次渲染后的图片内容会减少,如果里面包含后门代码,可能会被省略。导致上传的图片马,恶意代码被清除。

 首先判断图片是否允许上传git文件;gif 图片在二次渲染后,与原图片差别不会太大。一般针对于二次渲染攻击最好用gif图片马


将原图片上传,下载渲染后的图片进行对比(原图会动,渲染后的新图片不会动了),找相同处,覆盖字符串,填写一句话后门,或者恶意指令

 成功解析上传的二次渲染gif文件

文件名可控绕过上传

文件上传时,文件名的可被客户端修改控制,会导致漏洞产生。

%00截断

%00截断需要gpc关闭
php 版本小于 5.3.4
nginx0.83

 成功上传

分号;截断

;截断需要1在IIS6.0环境中才能绕过

/、绕过

杠点绕过,无版本限制条件

与中间件漏洞配合绕过

apache 1.x/2.x 遇到不认识的后缀名会先从后向前解析,具体分析如下
phpinfo.php.a  与apache中间件漏洞配合可以上传,但是是否能解析需要看相应中间件版本
phpinfo.php.a 会被中间件从右向左解析为a.php

数组绕过上传

有的文件上传,如果支持数组上传或者数组命名。如果逻辑写的有问题会造成安全隐患,导致不可预期的上传。这种上传攻击,它是属于攻击者白盒审计后发现的漏洞居多。

 总结

判断是否为黑白名单,如果是白名单 寻找可控参数。如果是黑名单禁止上传,可以用有危害的后缀名批量提交测试,查找未加入黑名单的执行脚本。

防御手段

  1. 通过服务器后端对上传的⽂件进⾏过滤,防⽌本地⽂件上传限制被绕过

  2. 及时查看最新公布漏洞通告,如果服务器中涉及相关组件,要及时更新补丁包

  3. 对⽂件上传的⽬录进⾏控制,设置为不可执⾏ 。只要保证web容器⽆法解析该⽬录下⾯的⽂件,即使攻击者上传了脚本⽂件,服务器不对其进⾏解析,⽊⻢ 等也不会⽣效。

  4. 对上传⽂件类型进⾏判断。可以结合使⽤MIME Type、后缀检查等⽅式。在⽂件类型检查中,尽量使⽤⽩名单⽅式,⿊名单和前端都属于不可靠的。

  5. 使⽤随机数改写⽂件名和⽂件路径 。⽂件上传如果要执⾏代码,则需要⽤户能够访问到这个⽂件。在某些环境中,⽤户可以进⾏病毒⽊⻢等有害⽂件上传,但如果应⽤随机数改写了⽂件名和路径,攻击者在不知道程序源码情况下不了解随机数等规则,即不知道⽂件名称就不能访问。还有像shell.php.rar.rar 和crossdomain.xml 这种⽂件,都将因为重命名⽽⽆法攻击。

  6. 单独设置⽂件服务器的域名,⼀般信息搜集过程中都会进⾏的⼀项就是旁站和C端的收集,如果⽂件服务器和主站等在同⼀域名下,浏览器同源策略的关系,有可能攻击者通过⼀个点进⾏整体环境服务器的渗透。在单独设置⽂件服务器之后,⼀系列客户端攻击将失效,⽐如上传 crossdomain.xml、上传包含javascript 的 XSS 利⽤等问题将得到解决。

IT前沿长姿势,Linux Bash 提示符的一些骚操作


当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个 Bash 提示符:


[user@$host ~]$


你知道命令行提示符其实是可以自己设置添加许多非常有用的信息的吗?在这篇文章中我就会教你如何自定义自己的 Bash 命令行提示符,想看的话就接着看吧~


如何设置 Bash 提示符


Bash 提示符是通过环境变量 PS1 (提示符字符串 1Prompt String 1) 来设置的,它用于交互式 shell 提示符。当然如果你需要更多的输入才能完成一个 Bash 命令时,PS2 环境变量就是用来设置多行提示符的:


[dneary@dhcp-41-137 ~]$ export PS1="[Linux Rulez]$ "

[Linux Rulez] export PS2="... "

[Linux Rulez] if true; then

... echo "Success!"

... fi

Success!


在哪里设置 PS1 的值?


PS1 就是一个普通的环境变量,系统默认值设置在 /etc/bashrc 中,在我的系统中,默认提示符通过以下命令来设置的:


[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "


它判断 PS1 是否是系统的默认值 \s-\v$ ,如果是的话则将值设置为 [\u@\h \W]\$。(LCTT 译注:注意命令中用 \ 做了转义。)


但如果你想要自定义提示符,不应该修改 /etc/bashrc ,而是应该在你的主目录下将自定义命令加到 .bashrc 文件中。


上面提到的 \u、\h、\W、\s 和 \v 是什么意思?


在 man bash 中的 PROMPTING 章节中,你能够找到所有 PS1 和 PS2 相关的特殊字符的描述,以下是一些比较常用的:


  • \u:用户名

  • \h:短主机名

  • \W:当前你所在的目录的名称(basename),~ 表示你的主目录

  • \s:Shell 名字(bash 或者 sh,取决于你的 Shell 的名字是什么)

  • \v:Shell 的版本号


还有哪些特殊的字符串可以用在提示符当中


除了上面这些,还有很多有用的字符串可以用在提示符当中:


  • \d:将日期扩展成 “Tue Jun 27” 这种格式

  • \D{fmt}:允许自定义日期格式——可通过 man strftime 来获得更多信息

  • \D{%c}:获得本地化的日期和时间

  • \n:换行(参考下面的多行提示符)

  • \w:显示当前工作目录的完整路径

  • \H:当前工作机器的完整主机名


除了以上这些,你还可以在 Bash 的 man 页面的 PROMPTING 部分找到更多的特殊字符和它的用处。


多行提示符


如果你的提示符过长(比如说你想包括 \H 、\w 或完整的日期时间时 ),想将提示符切成两行,可以使用 \n 将提示符切断成两行显示,比如下面的多行的例子会在第一行显示日期、时间和当前工作目录,第二行显示用户名和主机名:


PS1="\D{%c} \w\n[\u@\H]$ "


还能再好玩点吗?


人们偶尔也想将提示符变成彩色的。虽然我觉得彩色提示符让人分心、易怒,但是也许你很喜欢。如果我们想将日期变成红色的,目录变成青蓝色,用户名搞一个黄色背景,你可以这样做:


PS1="\[\e[31m\]\D{%c}\[\e[0m\]

     \[\e[36m\]\w\[\e[0m\]\n[\[\e[1;43m\]\u\[\e[0m\]@\H]$ "



所以你最喜欢的自定义提示符是什么样子的呢?有没有让你抓狂的自定义提示符呢?请在评论里聊聊吧~



以上是关于文件上传骚姿势合集的主要内容,如果未能解决你的问题,请参考以下文章

web安全文件上传CMS&编辑器&中间件&CTF

前端之web上传文件的方式

Jmeter骚操作—文件上传下载

代码安全之上传文件

前端大文件分片上传(Vue)

web服务端安全---文件上传漏洞