html5表单提交json数据库,CSRF漏洞中以form形式用POST方法提交json数据的POC

本文详细介绍了在进行CSRF测试时如何构造POST数据来避免特定问题。通过利用JSON格式的特性,成功摆脱了在form提交中出现的等号问题。同时,文章探讨了PHP发起的CSRF请求为何会失败,因为PHP作为后端语言无法携带用户cookie,导致CSRF验证失败。作者通过学习和实践,理解了浏览器发出请求与后端语言发起请求在CSRF场景中的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

0x01 写在前面

今天遇到的,查了很多资料,发现这种形式的基本上没看到,圈子里某个师傅发了一个国外的链接,

参考了一下,最后成功构造poc。

0x02 POC

form提交post数据很简单,如下:

This i a CSRF test!

但是这种方式存在缺陷,如下图:

cc0f485c0b8d099f6478d93c10384202.png

始终有个“=”摆脱不了,但是用下面这种方式成功摆脱:

This i a CSRF test!

69f22c3c4d0de94795d7669ea20b59b6.png

这里的技巧主要在于name和value的值共同构成了json格式的值,利用了双引号的闭合,学到了,以后有很多测试都可以用着这方式测试,所以记下来。

0x03 题外话

本来一开始利用form怎么都构造不成,后来放弃,然后使用php中的curl功能来写:<?php

$data = array("attributes" =>

array("name"=> "test2@test.com",

"userName" => "测试2",

"password" => "e10adc3949ba59abbe56e057f20f883e",

"role" => "user",

"status" => "enabled",

"phone" => ""

));

$data_string = json_encode($data);

$ch = curl_init('http://xxx.com/db/adds');

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");

curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(

'Content-Type: application/json',

'Content-Length: ' . strlen($data_string))

);

$result = curl_exec($ch);

echo $data_string;

?>

b2e57ef3f4cdac11dae2aca21987320c.png

抓包处理的时候发现依旧不行,并没有执行CSRF。(并不存在referer和token的前提)

具体原因现在依旧不清楚,于是求租,然后有大师傅解释:你如果用PHP写CSRF的POC是会失败的。CSRF本质是浏览器发出请求后会自带cookie. PHP是后端语言,

也就是请求不是浏览器发出去的。而后端服务器无法获取当前用户的cookie,

所以发出的POST请求没有cookie,CSRF就成功不了

所以有些懵逼。

然后又询问了一下大师傅,终于明白。

我上面的Php代码,POST请求是由php发出的,php代码运行后,返回一个数据页面给浏览器,然后浏览器在呈现给用户,此时由于是后端语言php发出的请求,后端服务器没法获得当前用户的cookie,所以没办法csrf。

而p牛的那个例子,POST请求是由js发出

b8b315b9efceaef49dd0e49526b55ba1.png

也就是浏览器发出,所以可以获得当前用户的cookie。

不得不说,小技巧里面的知识可不小~还需努力啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值