对文件上传的简单总结
不久前做完了大部分的upload靶场的题目,向对此进行一下稍微的总结,方便以后照着看吧
(这里只是最简单的进行介绍,都是以upload靶场为基础)
客户端
?1 JS检查
?在前端js代码中添加允许条件(如添加 .php使 php文件可上传)或者用相关插件 ② ?bp抓包后修改 .jpg文件为 .php文件绕过服务端
检查后缀
黑名单
?1 上传特殊可解析后缀
?用 .php3 , .phtml等特殊的文件格式尝试绕过 PS:?过滤<? 和 php后缀,尝试用 <script language='php'>assert($_REQUEST['cmd'])</script>?2 上传 .htaccess
?先上传一个 .htaccess 文件(没有文件名)(内容为:SetHandler application/x-httpd-php),再上传图片马(此时文件都会被解析成php)?3 后缀大小写绕过
?例如将 .php 文件修改成 .PHP 或者 .PHp 等?4 空格绕过
??① 在后缀名中加"(空格)"绕过,如 filename = "info.php(空格)" ② ?此时可能会有中特殊情况,用到(点+空格+点)来进行绕过,如 "filename = info.php.(空格)."?5 点绕过
?在后缀名中加"."绕过,如 filename = "info.php."?6 ::$DATA绕过
?在后缀名中加"::$DATA"绕过,如 filename = "info.php::$DATA"?7 配合解析漏洞
(暂无)
?8 双后缀名绕过
?此时文件会把文件后缀替换为空,所以双写绕过,如 filename = "info.pphphp"白名单
?1 MIME绕过
??bp抓包后修改 content-type绕过?2 %00截断
?① 在路径用 %00 截断,如 save_path = ../upload/info.php%00 ② ?当 save_path 通过POST方法传入,与上一样,但要注意同时要在二进制文件当中进行修改(%00 不能再自动解码)?3 0x00截断
同上
?4 0x0a截断
同上
检查内容
?1 文件头检查
?2 突破getimagesize()
??直接上传图片马??3 突破exif_imagetype()
??直接上传图片马?4 突破move_uploaded_file()
?00截断?5 二次渲染
这个比较难概括,请参考
?https://xz.aliyun.com/t/2657#toc-13
这位师傅的这篇文章