WEB 漏洞-文件上传之后端黑白名单绕过
前言
文件上传常见验证
后缀名,类型,文件头等
后缀名:黑名单,白名单
黑名单:明确不允许上传的格式后缀
asp php jsp cgi war…
缺陷:在定义不完整的时候,可以使用其他格式达到绕过效果
白名单:明确可以上传的格式后缀
jpg png zip rar gif
相对于黑名单,验证会更安全一些
文件类型:MIME 信息(检测类型,不严谨,可以进行伪造)
Content-Type为MIME信息,通过这个信息来猜测你的文件是什么格式的,什么后缀(验证方式之一)
有时候我们可以通过改变其值,实现欺骗操作,从而成功绕过。
文件头:内容头信息(检测内容,不严谨,可以进行伪造)
对应详解:
简要上传表单代码分析解释
$_FILES函数详解:
演示案例(基于代码分析)
uploadlabs 关卡分析
Pass-01(白名单)
方式一
- 尝试上传php文件发现上传不了,对代码进行分析,发现验证代码时用前端js编写的
- 这时候我们上传一个图片格式(内有后门代码),直接打开bp进行抓包操作,修改filename后缀,发现成功上传!
方式二
- 通过f12将网页代码复制下来发现验证代码时用前端js编写的
- 这时候我们在自己本地新建一个文件(存放我们的第一关,防止误删其他重要代码),在代码中我们将验证部分删掉,同时加上对应的提交位置
- 进行上传操作,在对应文件看到php文件,成功上传!
Pass-02(MIME 信息验证)(白名单)
- 我们先上传PHP文件,发现提示:文件类型不正确,请重新上传!
- 通过分析代码,我们知道验证的地方是Content-Type这个地方,进行修改后成功将文件上传!
Pass-03(黑名单)(特殊解析后缀)
- 我们先上传PHP文件,发现提示:不允许上传.asp,.aspx,.php,.jsp后缀文件!
- 基础:trim函数详解 strrchr() 函数详解
- 通过分析代码,我们知道过滤方式为截图这些,我们首先要把代码读懂,发现这里限制条件并没有包括过滤php5后缀(Apache能够解析php5,但前提是apache的httpd.conf中有如下配置代码, AddType application/x-httpd-php .php .phtml .phps .php5 .pht .php3 .txt)
- 尝试修改下后缀名为php5,上传成功!
Pass-04(黑名单)(.htaccess解析)
- 查看代码,我们对其进行分析,发现其过滤的文件后缀更多,但是没有过滤 .htaccess
- 创建并上传.htaccess文件,文件内容为下面,然后上传带有shana的文件名(自定义),就会被解析成php
<FilesMatch "shana">
SetHandler application/x-httpd-php
</FilesMatch>
- 成功上传.htaccess文件和xshana.jpg文件
- 成功访问,解析php代码成功!
Pass-05(黑名单)(大小写绕过)
- 查看代码,我们对其进行分析,相对于前面少了这行代码
$file_ext = strtolower($file_ext); //转换为小写
- 过滤很充分,也过滤了.htaccess和.ini,但是没有将文件后缀名转换为小写,故大写绕过即可
Pass-06(黑名单)(空格绕过)
- 查看代码,我们对其进行分析,相对于前面少了这行代码
$file_ext = trim($file_ext); //收尾去空
- 我们可以在文件名后缀最后面加上空格,来绕过黑名单的过滤。到服务器后,会强制将空格去除,从而在服务器上是正常的文件!
Pass-07(黑名单)(点绕过)
- 查看代码,我们对其进行分析,相对于前面少了这行代码
$file_name = deldot($file_name);//删除文件名末尾的点
- 少了对点的过滤,因此直接在文件名后缀后面加上.即可实现上次
- 上传到对应网站后,系统会强制将点去掉,所以在那边我们看到的文件是正常的格式(最后没有一个点)
Pass-08(白名单)(::DATA 绕过)
- ::DATA
php在 windows中如果文件名 + " : :DATA"之前的文件名,它的目的就是不检查后缀名(Windows文件流特性)
- 查看代码,我们对其进行分析,相对于前面少了这行代码
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
- 我们直接上传a.php,然后抓包进行修改(如下图),实现绕过!
Pass-09(黑名单)
- 基础知识
deldot函数 - 查看代码,我们发现和之前的没有太大区别,这时候我们从代码进行入手,对代码进行分析
获取对应文件名->设立黑名单数组->首位去空->删除末尾的点->截取.后面的字符(包括点)->转换成小写->去除字符串::$DATA->首位去空 - 主要思路:我们可以通过在末尾加点、空格来实现上传脚本的操作!在这里我们使用bp进行抓包,对其进行修改。
变化过程:
1234.php.空格 . ——>1234.php.空格. ——>1234.php.空格——>1234.php.——>1234.php(window特性)
Pass-10(黑名单)
- 查看代码,我们发现其中有句语句是将黑名单中后缀改成空格的语句,但这里只执行一次,我们以此为突破口
- 主要思路:上传php文件,使用bp进行抓包,对其进行修改。将后缀改成pphphp即可
Pass-11(白名单)(%00截断)
- 基础知识
substrstrrpos - %00和0x00的区别
前者用于地址方面的(get和post提交数据的位置进行修改)(修改位置有所不同,详情看第11和12关),后者是用于文件命名(在filename位置进行修改) - 查看代码,进行对应分析
- 使用bp进行抓包发现这两个地方好像有点关联,我们尝试在后面加上x,1.jpg都不行,我们尝试使用截断 …/upload/1.jpg%00 (get会自动解码),发现能够成功上传!
- 分析
Pass-12(白名单)
- 跟Pass-11的方法类似,不过这个是post提交,POST不会像GET那样对%00进行自动解码,post内容修改为下面画框的位置。因此,我们需要在burp中选中%00右击->url ->urldecode->go 即可。
最后感谢小迪师傅的视频!!
笔记来源视频:点击这里