对文件上传的简单总结


不久前做完了大部分的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

这位师傅的这篇文章

其他

?条件竞争

?通过向服务器不断发送(同样的)webshell(让其不能短时间内及时处理)