HackerGame2023 HTTP 集邮册 wp

前言:在打hg2023时这题只写出了第一部分,故在比赛结束后学习记录一下

题目描述

1.1第一小问

该部分是通过发送http请求报文获得5种状态码,较为简单

1:202 202表示请求接受成功,直接发送默认的报文即可

GET / HTTP/1.1\r\n
Host: example.com\r\n\r\n

2: 404

想要获得404,需要我们请求一个不存在的文件,随便填个文件地址即可

GET / index.php HTTP/1.1\r\n
Host: example.com\r\n\r\n

这样就可以获得404了

3:400

触发400的方式是请求报文的格式错误

ddddd / HTTP/1.1\r\n
Host: example.com\r\n\r\n

所以随便打点什么东西即可

4:505

触发505的条件是http请求的版本号发生了错误,想要获得只需修改版本号即可

GET / HTTP/1.1.1.1.1\r\n
Host: example.com\r\n\r\n

比如这样

4:405

触发405的条件是请求方法不被允许,随便给一个请求方式即可,比如post

POST / HTTP/1.1\r\n
Host: example.com\r\n\r\n

这样就获得第一小问的flag

2.2第二小问

该部分是获得无状态码

通过搜索我们知道HTTP/0.9时是不使用状态码的,http协议在0.9版本时只能支持get请求,直接后面跟url,没有

别的东西,规范如下

GET / \r\n

当然你也可以在get后跟上你的url。在http0.9版本中,服务器域名直接和请求文件地址放在一起组成url,不像后

来的http版本那样需要写在Host

这样就获得了第二个flag

2.3 第三小问

第三小问要求我们获得总共12个状态码,先前已经获得了5个了,现在去获得剩下的那七个

剩下的这些状态码就不是很常见了

100:代表服务器希望客户端继续请求或者忽略

想要触发这个状态码需要在请求的首部字段中加上 Expect: 100-continue来向服务器询问是否可以继续处理请

求,如果服务器同意则会返回100-Continue

故请求如下

GET / HTTP/1.1\r\n
Host: example.com\r\n
Expect: 100-continue\r\n\r\n

需要注意的是,在此处的换行符必须手动添加,对于http请求来说,起始行的结束和每一个首部字段的分隔都需要

用换行符,两个连续的换行符即\r\n代表headers的结束,剩下的部分进入body,

206: 该状态码代表服务器只返回了部分数据内容

想要服务器只返回部分内容,在请求的时候只请求部分即可

在首部字段加上Range: bytes=1-8\r\n\r\n即可

这段的意思是只请求字节1到字节8的内容故请求报文如下

GET / HTTP/1.1\r\n
Host: example.com\r\n
Range: bytes=1-8\r\n\r\n

416: 和206相似,都是传输部分的数据,只不过触发206的请求是合法范文的请求,416的请求是在非法的范围内

请求

GET / HTTP/1.1\r\n
Host: example.com\r\n
Range: bytes=114514-8\r\n\r\n

这样即可

304: 该状态码表示内容未被修改,不需要重新发送

想要触发此状态码,需要使用If-Modified-Since头部字段,用于在发送HTTP请求时,把浏览器端缓存页面的最后

修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。

如果时间一致,那么返回HTTP状态码304(不返回文件内容),客户端接到之后,就直接把本地缓存文件显示浏

览器中。故此题的请求如下

GET / HTTP/1.1\r\n
Host: example.com\r\n
If-Modified-Since: Tue, 15 Aug 2023 17:03:04 GMT\r\n\r\n

412: 用于判断请求内容的版本是否与服务器端相同

触发需要使用头部字段If-Match:后面加版本好,如果不匹配则会412,匹配成功则会成功返回结果,200.

故请求如下

GET / HTTP/1.1\r\n
Host: example.com\r\n
If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"\r\n\r\n

后面跟的是用于识别版本的哈希

413: 该状态码触发条件是文件长度过长

所以只需要Content-lenGth:长一点即可

请求如下

GET / HTTP/1.1\r\n
Host: example.com\r\n
Content-length: 1145141919810\r\n\r\n

412: 当url过长时会触发412

想要触发此状态码需要的url确实很长

GET /aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HTTP/1.1\r\n
Host: example.com\r\n\r\n

这样不够长,还得再多加十几行左右才能触发,为了阅读体验就不全部显示出来了

至此本题所有的flag就成功获得了,完结撒花

posted @ 2023-11-06 01:07  折翼的小鸟先生  阅读(37)  评论(0编辑  收藏  举报