背景: 最近测试时发现了fastjson反序列化漏洞,但数据包有些不同。 漏洞是被动插件探测到的,如果仅仅手动测可能这次就会漏了。

正常请求如下: ![[Pasted image 20240619164840.png]]

手测时正常测试过程如下: 可能会把payload放在platformCode 或 将请求改为post并将payload放在请求体中

  1. 放在platformCode参数中时,发现可以成功请求,但是没有触发dnslog ![[Pasted image 20240619165329.png]]
  2. 将请求改为post并将payload放在请求体中, 都无法触发 ![[Pasted image 20240619165732.png]]![[Pasted image 20240619165755.png]]

只有以下情况时才会触发dnslog ![[Pasted image 20240619170121.png]]

疑问: 不理解这个数据包在服务端如何被处理的,以前没有注意过也没有尝试发送过这样的请求

搜索资料发现: 不少人讨论get请求能不能带body的问题,有的觉得可以有的觉得不行,有的认为最好别带。 有人说其在工作中从来没有见同事用get带body,自己做爬虫也没见到有网站用get带body的 说明这种还是少数情况。 但根据http协议来看,没有明确规定get请求不能传输实体,也就是说get是可以有body的,只是不推荐这么用。

为什么不推荐: 带有请求体的get请求信息存在未定义的语义,发送带有body的get请求将会导致某些现有实现拒绝该请求。也就是这种方式有安全风险。

什么情况下可以发这样的包: 使用浏览器发送时设置的body会被忽略,只有使用发包程序发送,并且服务端处理的情况下,这种数据包才会正确响应。

结论:

  1. http 协议没有为get请求的body 赋定义,也就是即不要求也不禁止get请求带 body。
  2. 大多数http实现从技术上都支持get请求带 body,少数会禁止。

最后: 在服务端处理的情况下,测试时可以将payload作为 body 也放在get请求中去尝试,避免遗漏。

updatedupdated2024-06-212024-06-21