郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
WEB安全之:文件上传
郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。
WEB安全之:文件上传
1 文件上传过程
1.1 浏览器打开上传页面
-
# 客户端上传表单 upload.html <html> <head></head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="100000"> <label for="file">Filename:</label> <input type="file" name="file" id="file"/> <br/> <input type="submit" name="submit" value="Submit"/> </form> </body> </html> <!-- enctype:属性规定在发送到服务器之前应该如何对表单数据进行编码。 --> <!-- multipart/form-data:在 Web 表单文件上传时使用。 -->
1.2 用户提交上传请求
-
对于 multipart/form-fata 类型的表单,浏览器上传的实体内容中的每个表单字段元素的数据之间,用字段分割线进行分割,每两个分割界线间的内容成为一个分区,每个分区的内容可以被看做两部分,一部分是对表单元字段元素进行描述的描述头,另一部分是表单元字段元素的主体内容。
-
# 抓包分析 POST /upload.php HTTP/1.1 # 响应头部 Host: 192.168.100.129 User-Agent: Mozilla/5.0 (iPad; CPU OS 10_15_5 (Erg.nzendes Update) like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/15E148 Safari/605.1.15 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=---------------------------9317842496954838981816999048 Content-Length: 6221 Origin: http://192.168.100.129 Connection: keep-alive Referer: http://192.168.100.129/upload.html Upgrade-Insecure-Requests: 1 DNT: 1 Sec-GPC: 1 #空行\r\n -----------------------------9317842496954838981816999048 Content-Disposition: form-data; name="MAX_FILE_SIZE" # 描述头 100000 # 主体内容 -----------------------------9317842496954838981816999048 Content-Disposition: form-data; name="file"; filename="logo.svg" # 描述头 Content-Type: image/svg+xml # 描述头 # 空行\r\n <svg xmlns="http://www.w3.org/2000/svg" width="589.827" height="361.238" viewBox="0 0 442.37 270.929">...</svg> # 主体内容 -----------------------------9317842496954838981816999048 Content-Disposition: form-data; name="submit" # 描述头 # 空行\r\n Submit # 主体内容 -----------------------------9317842496954838981816999048--
1.3 WEB 程序处理
WEB 程序处理用户提交的数据并将读取到的文件保存为临时文件
-
# 服务器处理请求脚本 <?php if ($_FILES["file"]["error"] >