html-form元素
1、text/plain形式
2、application/x-www-form-urlencoded
3、不同的input类型
- 包括多选按钮在内的各种input,以及textarea,提交时都是基于name和value这样的参数单元,value是字符串。多选按钮被选中多个,相当于多组的name和value。从服务端接收来看,参数只有两种:name唯一和name不唯一,不区分前端组件类型
- 对于任意的输入来说,必须设置name属性,表单提交才会包含该参数。如果submit和button设置了name属性,也会作为一组输入
- value未设置时,提交时会采用其默认值。单选按钮和多选按钮的默认值是on。submit的默认值是"提交查询"
- 如果是单选框或者多选框类型,即使设置了name属性,但只有选中,表单才会提交该组参数
4、multipart/form-data
(1)文件上传
- method必须是post
- enctype必须是multipart/form-data
- input的type为file,点击后选择文件
- 对同一form下的各组name和value都不会进行编码处理
(2)请求报文格式
POST /dvwa/vulnerabilities/upload/ HTTP/1.1
Host: 192.168.0.18
Cookie: PHPSESSID=dg5uk8opkv5ve1a74vv86spqh6; security=low
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;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, br
Referer: https://192.168.0.18/dvwa/vulnerabilities/upload/
Content-Type: multipart/form-data; boundary=---------------------------4384282613834
Content-Length: 422
Upgrade-Insecure-Requests: 1
Connection: close
-----------------------------4384282613834
Content-Disposition: form-data; name="MAX_FILE_SIZE"
100000
-----------------------------4384282613834
Content-Disposition: form-data; name="uploaded"; filename="新建文本文档.txt"
Content-Type: text/plain
abc时间
-----------------------------4384282613834
Content-Disposition: form-data; name="Upload"
Upload
-----------------------------4384282613834--
- 文件上传时,请求中content-type字段会追加boundary属性,以27个-作为前缀,然后是一个13个数字组成的随机字符串。
- boundary属性在请求体部中,作为分隔符使用。n组参数,对应n+1组boundary属性值。末尾额外追加--\r\n字符串
- 相邻boundary之间作为一个参数单元
- 各部分之间也是使用\r\n分隔
- 第一行是基本信息,以Content-Disposition: form-data;作为前缀,然后是name属性,以及可能的filename属性
- 第二行是空行
- 第三行开始是value属性,或者文件上传所对应的文件内容,简单理解为二进制数据。如果是文本文件,那么直接就是文本字符串;如果是图片等二进制文件,burp中显示时会乱码
- boundary属性中的随机字符是相对随机生成的,相邻上传同一文件也会使用不同的随机字符串值。当然,也可以前后使用相同的字符串值,或者自定义长度的字符串值。需要注意的是,boundary属性是作为分隔符使用,所以定义时不能与参数单元的值发生冲突
(3)file组件
如果file组件没有选择上传的文件,那么form提交时,仍然会保留该参数进行提交,此时filename和内容都为空字符串