【攻防世界】CTF web新手02 POST&GET
【攻防世界】CTF web新手02 POST&GET
HTTP协议常用的请求有两种,POST和GET。POST是向服务器上传数据,GET是从服务器下载数据,两者最大的区别就是GET请求没有请求主体(Request Body)。GET请求直接将请求的参数跟在url的后面,向我们平时看到的 " /?id=xxxx&password=xxxx "就是GET请求的参数,服务器解析了url以后会将数据发送到我们的浏览器上。而POST请求则需要将上传的数据下载请求主体中。这样有一个好处是相比GET请求,POST请求具有更高的安全性,可上传的数据没有长度的限制。
举两个简单的例子
GET请求:POST请求
在上面的两张图中最大的不同就是POST请求中,在头部的下面有一个空行,再下面有数据b=2。
这个b=2就是请求主体(Request Body)
我们以【攻防世界】web新手题为例,如何模拟浏览器提交HTTP请求
-
方法1
使用火狐浏览器自带插件Hackbar
GET请求不需要有过多的操作,直接在url后面加上题目要求的数据即可由于POST请求无法在url中体现出来,所以我们需要借助工具。
打开hackbar,输入url,点击Enable Post Data,在输入框中输入参数
点击 RUN,我们就得到了flag注:Hackbar现在已经不能使用,提示说需要lisence,我们可以下载Hackbar Quantum完成这个题目,也可以使用fiddler等抓包软件,下面是使用fiddler来实现post请求
-
方法2
使用fiddler
同样的,GET请求直接在url后面跟上我们的数据即可
然后我们用fiddler抓一下这个GET包把GET包的头部复制粘贴,作为POST包的头部
但是这毕竟是GET方法的头部,GET和POST在头部上还是有一点区别的。
由于POST要在请求主体中输入我们上传的数据,所以我们还要声明一下数据格式
POST请求有四种数据格式-
[ application/x-www-form-urlencoded ]
这是post请求最常见也是默认的数据提交格式。它要求数据名称(name)和数据值 (value) 之间以等号相连,与另一组name/value值之间用&相连。
比如 a=1&b=2&c=3 -
[ application/json ]
application/json格式的请求头是指用来告诉服务端post过去的消息主体是序列化后的 JSON 字符串。
比如
{
“a”:“1”,
“b”:“2”,
“c”:“3”
} -
[ text/xml ]
-
[ multipart/form-data ]
所以我们需要在POST头部加上数据格式的声明
-
Content-Type: application/x-www-form-urlencoded
点击Execute,一个构造的POST请求包就发送出去了
来看响应包,得到了flag