同样的参数值,为什么Get型提交和Post型提交,达到的效果不同?

同样的参数值,为什么Get型提交和Post型提交,达到的效果不同?

疑问来源

以sqli中的关卡为例:同样利用宽字节注入原理进行SQL注入,相同的注入语句,Get型提交就成功(图1),Post型直接提交就失败(图2),抓包后在写就能成功(图3)。

图1:

image-20230224154229068

图2:

image-20230224154430970

图3:image-20230224160434666

Get、Post提交后,客户端和服务器的编码解码过程

1、Get型请求提交时,参数在URL中,客户端(浏览器)会对URL的内容进行URL编码处理,处理后交给服务器,服务器拿到后进行URL解码,然后再交给应用程序处理。

2、Post型请求提交时,参数在请求内容中,客户端会对内容进行编码(诸多情况也都是URL编码),处理后交给服务器,服务器根据Content-Type头部信息解码请求体中的数据。例如:如果 Content-Type 是 application/x-www-form-urlencoded,则服务器将使用 URL 解码对数据进行解码。如果 Content-Type 是 multipart/form-data,则服务器将使用一些特殊的解码技术解码数据。服务器解码成功后将其交给应用程序处理。

二者的差异

​ 即使二者提交后,编码解码的方式相同,客户端进行URL编码,服务器进行URL解码,但是也有差异,因为二者的数据传输形式和场景不同,所以会导致对数据的编码处理可能也会不同。

​ 举个例子:同样的包含逗号的参数值,如果在URL中(get型提交),逗号就不需要进行URL编码,因为它被认为是一种分隔符;但如果在请求内容里(post型提交),逗号是需要进行URL编码的,因为要保证数据传输的正确性和一致性。

​ 因此不同提交方式下,经过客户端URL编码后提交给服务器的内容可能是不一样的,那么服务器拿到后,进行解码,解码的结果也就会不一样,解完码再提交给应用程序处理就会产生不同的结果。

原始数据:?id=-1%df' union select 1,2,3--+

get型提交经过URL编码的结果:?id=-1%df%27%20union%20select%201,2,3--+
服务器解码结果:?id=-1ß' union select 1,2,3-- 

post型提交经过URL编码的结果:%3Fid%3D-1%25df%27+union+select+1%2C2%2C3--%2B
服务器解码结果:?id=-1%df' union select 1,2,3--+

​ 所以,如果想让Post提交达到和Get型提交相同的效果,我们就需要进行抓包处理,抓包这步是在客户端发给服务器的过程中拦截,此时浏览器已经编码完了,所以我们需要抓包,更改掉编码后的结果,这样服务器再去解码的时候,就可以达到我们想要的效果。

posted @ 2023-02-24 16:39  6小1  阅读(94)  评论(0)    收藏  举报