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就成功获得了,完结撒花