文件上传漏洞
本地js限制
仅通过客户端的JavaScript代码对文件类型进行检测,服务端不进行检测
绕过:
修改需要上传的木马的文件名为.jpg等允许上传的格式
上传,使用burp拦截,修改文件名
为nosafe.php,
然后放包,便将我们的木马成功上传到了服务器
服务端仅对文件的MIME进行检查
服务端仅检测客户端返回header的content-type的数据,符合格式要求即可
绕过
对上传进行拦截
修改content-type为符合格式要求
服务端黑名单检查
服务端通过设置黑名单对用户提交的文件类型进行检查,在黑名单里面的进行拒绝
文件别名绕过
许多文件有其别名,即使使用别名也可在服务器上执行
一般后缀 | 可用后缀 |
---|---|
asp/aspx | asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr |
php | php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml |
jsp | jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml |
尝试使用不同的大小写进行绕过,windows系统对文件后缀的大小写不敏感,linux敏感。
利用windows+php的一些特性进行绕过
尝试在后缀名末尾添加空格
尝试在后缀名末尾添加
.
,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过。在php+windows的情况下:如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持”::$DATA”之前的文件名
burp 修改文件名为info.php::$DATA,实际上保存的文件的文件名为info.php
主动构造文件后缀,使程序获得我们想让其获得的文件后缀,从而实现绕过对后缀的检测
info.php. .
, 程序首先去除点号,变为info.php.空格
,然后截取文件后缀为.空格
,这个没在黑名单里,于是乎通过。然后程序直接利用现有文件名进行保存,保存为info.php.空格
。
去除敏感词文件名绕过
当文件名中出现php等字样时直接删除php,但此过程只执行一次,于是乎构造文件名
info.pphphp
,可以实现绕过。
.htaccess 配置文件上传
.htaccess 是php的配置文件,可以控制默写文件类型以php类型的文件执行
当黑名单里没有.htacess时可以上传我们的.htaccess文件,指定我们的文件以php形式执行
方法一、.htaccess内容为
<FilesMatch "文件名">
SetHandler application/x-httpd-php
</FilesMatch>
按情况修改文件名
方法二、.htaccess内容为
AddType application/x-httpd-php .jpg
服务端白名单检查
%00截断
当文件命名为info.php%00.jpg 时,保存文件的时候会从%00处截断,仅保留%00前面的字符。
针对一般的白名单检查,检查文件的后缀名时截取.jpg,判断通过,然后保存时保存的是info.php。
需要了解的是,对于一般的文件上传,我们应该详细了解当我们上传图片的过程,浏览器像服务端提交的所有东西,例如是不是存在路径信息等。当我们提交的有路径信息而且服务端也是直接将文件名与路径进行拼接保存文件,那么此时我们可以直接通过修改路径,
例如提交的是./upload/,而文件的保存路径是 ./upload/info.jpg 时,我们提交 ./upload/info.php%00,可以控制保存的路径为 ./upload/info.php。
对于服务端对我们的文件名进行随机化是也应该想到这种方法。
POST方法与GET方法提交 %00 的区别
GET方法,会对%00进行自动编码,相当于使其保留原有的意思
POST不会对%00进行自动编码,直接通过传入%00字符,并不会有截断的意思,我们需要在二进制中进行更改。
图片马上传
利用场景
当服务器端直接对文件的内容进行二进制检测的时候要用到这种方法,该方法应该与文件包含漏洞相结合,否则无法直接使用。
服务器常用检测方法:
- 使用文件的前两个字节来判断文件类型。
- 使用 getimagesize 函数来获取文件类型。
- 使用 php_exif 模块来判断文件类型。
- 二次渲染,即使用用户上传的图片生成新图片。
图片马制作
命令行合并文件制作
/b 表示二进制格式,/a表示ASCII码格式。合并到了webshell.jpg中。
条件竞争
条件竞争漏洞属于服务器端的逻辑漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。
eg1:上传文件时,首先对文件进行了存储,之后才对文件进行审核
漏洞利用
使用burp 的 intruder进行不断的上传,
同时使用python 代码对我们的上传的文件进行不断的访问。
达到某一次的成功访问
尝试上传
<?php fputs(fopen("info.php", "w"), "<?php phpinfo(); ?>"); ?>
当成功访问了我们上传的文件时,将写入服务器一个文件。
burp的配置 结合 CTF 详解条件竞争漏洞
此处只做简单总结,具体的方法还要更具具体的测试,和代码的审计,其中有些会存在一些逻辑漏洞,如在进行字符串拆分成数组的时候,是不是可以直接传入输入数组,思维需要放的宽一点。
要仔细的对浏览器和服务器进行交互的所有数据进行认真的阅读,尝试从中发现服务器端的处理逻辑。