如何构造畸形HTTP响应以触发类HTTP 500错误(已发200头场景)
这个场景确实挺棘手的——毕竟HTTP响应头一旦发送就没法修改,只能从响应体入手,通过破坏其合法性让客户端意识到请求实际失败了。下面几个实用的方法可以试试:
发送与声明的Content-Type完全不兼容的内容
比如你之前在响应头里设置了Content-Type: application/json,那直接往响应体里输出一堆无意义的乱码(比如@#$%^&*()_+=-),或者非JSON格式的文本(比如随便写一段“出错了但头已经发了”)。客户端的JSON解析器会直接抛出解析错误,大部分HTTP客户端都会把这种情况判定为无效响应,等同于服务器错误。如果是HTML类型的响应,就故意发送不完整的标签(比如只写<div>就停止输出),浏览器会识别为页面加载失败。故意违背Content-Length的约定
如果响应头里指定了Content-Length: 100,那你只输出50字节的内容就终止响应。客户端会检测到实际接收的字节数和头中声明的长度不匹配,触发“不完整响应”的错误,几乎所有HTTP客户端都会把这个归类为服务器端的问题。发送格式错误的Chunked编码内容(如果用了分块传输)
要是你用了Transfer-Encoding: chunked,那就故意构造不符合规范的分块数据。比如正常的分块格式是[十六进制长度]\r\n[内容]\r\n,最后用0\r\n\r\n结束。你可以把长度写成非十六进制的字符(比如x\r\nabc\r\n),或者长度和实际内容长度不匹配(比如写3\r\nabcd\r\n)。客户端在解析分块时会直接失败,从而判定整个响应无效。插入与HTTP协议版本不兼容的内容
比如你用HTTP/1.1发送响应,突然插入一段HTTP/2的帧格式数据。客户端的协议解析器无法识别这种内容,会直接将响应标记为错误。不过这个方法比较极端,不如前几种通用。
核心思路其实就是破坏响应体的格式完整性和合法性,让客户端的解析逻辑无法正常处理整个响应。虽然HTTP头是200,但客户端最终会根据响应的整体正确性来判断请求是否成功,畸形的响应体足以让它意识到实际发生了错误。
内容的提问来源于stack exchange,提问作者user5047085

