一、检测原理:
对于文件上传,如果只在Web前端进行检测,显然是防护不足的,服务器也需要进行检测
服务器端通过函数pathinfo()获取文件后缀,将后缀转换成小写,看看是不是要求上传的文件格式
二、绕过方法
1、后缀名检测与绕过
后缀名检测的绕过方法也有很多,常见的有:
1. 黑名单--大小写绕过
2. 黑名单--名单列表绕过
3. 黑名单--Windows特性(末尾的点【.】)绕过
4. 黑名单--Windows特性(空格【 】)绕过
5. 黑名单--Windows特性(::$DATA)绕过
6. 白名单(需要结合文件包含漏洞或者Web服务器解析漏洞)
7. .htaccess文件攻击--匹配文件内容
8. .htaccess文件攻击--配皮文件名中的关键字
9. .htaccess文件攻击--匹配文件名
10. Apache解析漏洞
黑名单--大小写绕过
1、登录:http://ip/upfile/2/upload1.html
2、在操作机上准备要上传的文件(脚本文件),比如新建1.php文件
3、点击“选择文件”按钮,选中要上传的文件
4、点击“submit”按钮,文件上传失败,不允许的后缀名
5、尝试利用大小写绕过,将脚本文件1.php更改为1.pHp,再次选择脚本文件
6、点击“submit”按钮,上传文件,脚本文件成功上传
7、访问http://ip/upfile/2/upload/1.pHp,上传的脚本文件成功解析
名单列表绕过
原理:有些中间件允许解析其他文件后缀名,如asp、cer、这类的或在httpd.conf中配置以下代码,则能解析php、php3、phtml文件。所以当php后缀名被拦截,则可以用php3、phtml试试
前面4个步骤一样的,参考前面的步骤
5、尝试利用大小写绕过,将脚本文件1.php更改为1.pHp,再次选择脚本文件
6、点击“submit”按钮,上传文件,依然失败,不允许的后缀名
7、尝试寻找黑名单列表之外可允许上传的文件后缀名进行绕过,将脚本文件1.php更改为1.php3或者1.phtml,再次选择脚本文件
8、点击“submit”按钮,继续上传文件,脚本文件成功上传
9、访问http://ip/upfile/2/upload/1.php3,上传的脚本文件成功解析
Windows特性(末尾的点【.】)绕过
前面的4个步骤还是一样的,参考第一个
5、尝试利用大小写绕过,将脚本文件info.php更改为info.pHp,以及尝试寻找黑名单列表之外可允许上传的文件后缀名进行绕过,将脚本文件info.php更改为info.php3或者info.phtml,再次选择脚本文件上传,依然失败,此文件不允许上传
6、打开桌面的的“Burp”文件夹,双击“BURP.cmd”启动Burp Suite抓包工具,进行抓包,设置代理什么的参考前面的文章
7、点击“submit”按钮,再次上传文件,Bp成功抓取数据包
8、利用Windows特性,给文件名加“.”绕过服务端后缀名的检测,将数据包中的后缀名info.php改为info.php.
9、点击“Forward”,转发数据包,切换到浏览器,脚本文件成功上传
10、关闭浏览器代理、访问http://ip/upfile/2/upload/info.php.(访问http://ip/upfile/2/upload/info.php也可以),上传的脚本文件成功解析
Windows特性(空格【 】)绕过
前面的4个步骤是一样的,
5、尝试利用大小写绕过,将脚本文件info.php更改为info.pHp,以及尝试寻找黑名单列表之外可允许上传的文件后缀名进行绕过,将脚本文件info.php更改为info.php3或者info.phtml,再次选择脚本文件上传,依然失败,此文件不允许上传
6、打开桌面的的“Burp”文件夹,双击“BURP.cmd”启动Burp Suite抓包工具,进行抓包,设置代理什么的参考前面的文章
7、点击“submit”按钮,再次上传文件,Bp成功抓取数据包
8、利用Windows特性,给文件名加“.”绕过服务端后缀名的检测,将数据包中的后缀名info.php改为info.php.
9、点击“Forward”,转发数据包,切换到浏览器,依然上传失败,后缀名不允许“.”出现
10、关闭浏览器代理,重新选择脚本文件
11、再次打开浏览器代理,点击“submit”按钮,上传文件并抓取数据包
12、利用Windows特性,给文件名加“(空格)”绕过服务端后缀名的检测,将数据包中的后缀名info.php改为info.php
13、点击“Forward”,转发数据包,切换到浏览器,脚本文件成功上传
14、关闭浏览器代理,访问http://ip/upfile/2/upload/info.php (访问http://ip/upfile/2/upload/info.php也可以),上传的脚本文件成功解析
Windows特性(::$DATA)绕过
前面的步骤是一样的
我们试大小写、名单列表,利用windows特性,在后缀名加. 或者空格都不行,我们尝试利用另外一个特性
还是需要用到Bp抓包改包,步骤跟上面差不多一样的,下面只列出几个不一样的步骤
1、利用Windows特性,给文件名加“(::$DATA)”绕过服务端后缀名的检测,将数据包中的后缀名info.php改为info.php
2、点击“Forward”,转发数据包,切换到浏览器,脚本文件成功上传
3、关闭浏览器代理
4、访问http://ip/upfile/2/upload/info.php::$DATA,解析失败,未找到上传的文件,因为Windows的特性会自动去掉“::$DATA”,info.php::$DATA文件会变为info.php
5、访问http://ip/upfile/2/upload/info.php,上传的脚本文件成功解析
.htaccess文件攻击
原理:
.htaccess文件是Apache服务器中的分布式配置文件(IIS中不存在该文件),该配置文件会覆盖Apache服务器的全局配置,作用于当前目录及其子目录。在httpd.conf配置文件中,AllowOverride参数就是指明Apache服务器是否去找.htacess文件作为配置文件,如果设置为none,那么服务器将忽略.htacess文件;如果设置为All,那么将启用.htaccess文件,所有在.htaccess文件里的指令都将被重写,即允许.htaccess文件覆盖掉Apache的配置。
如果一个Web应用允许上传.htaccess文件,且.htaccess文件启用,那就意味着攻击者可以更改Apache的配置,这是十分危险。
.htaccess文件攻击有三种方式:
- 当.htaccess文件内容如下,会将内容符合php语法规则的文件当作php文件解析
- 匹配文件名中的关键字(比如:当文件名[info.php.png] 中包含关键字[.php],并且.htaccess文件内容如下,info.php.png中的代码会被执行)
- 匹配文件名,当.htaccess文件内容如下,可以将匹配到的文件名的文件中的代码执行
1、登录地址:http://ip/upfile/2/upload6.html
2、在操作机上准备要上传的文件(脚本文件),比如新建info.php文件
3、点击“选择文件”按钮,选中要上传的文件
4、点击“submit”按钮,文件上传失败,此文件不允许上传
5、尝试大小写绕过、Windows特性,依然失败,此文件不允许上传
6、新建.htaccess文件
7、选择.htaccess文件,点击“submit”按钮,上传.htaccess文件,成功上传
8、将脚本文件info.php修改后缀名为可允许上传得info.jpg,再选择文件
9、点击“submit”按钮,再次上传文件,成功上传
10、访问http://ip/upfile/2/upload/info.jpg,上传的脚本文件成功解析
为了不让这篇文章篇幅过长,其他内容接下一篇文章