CSRF防护(找到自己的点赞文章)
想找到一篇前几天在博客这边点赞的文章,愣是没找到入口,发现api/blog/get-vl可以获得某一篇博客自己是否点赞, 但是用restles测试发现总是返回false信息,与实际不符;怀疑是不是由于_csrf保护导致的就查了查csrf保护相关的机制;
在目标页面console里直接执行ajax请求就可以获得正确的结果,
感觉不是csrf导致的;
找到自己的所有点赞主要步骤分两步:
登录博客之后,在console里执行下面的代码获取到所有的blogid,其中2788是博客总页数,可以在首页看到
var apiRoot = 'https://bbs.huaweicloud.com/api/blog/info'; var sumContent = ''; var getarray = []; var blogObject = { }; blogObject.page = 1;//默认从第一页开始 blogObject.category = "all";//文章类别 blogObject.tag = "";//选择标签 blogObject.defaultUrl = "//static.huaweicloud.com"; blogObject.bbsimg = "https://bbs.huaweicloud.com"; for(var i=1;i<=1394;++i){ blogObject.page = i; getarray.push($.ajax({ type: "post", data: blogObject, dataType: "json", url: apiRoot, success: function (data) { sumContent += data.content; } })); } var getarray1 = []; $.when.apply($, getarray).done(function() { for(var i=1395;i<=2788;++i){ blogObject.page = i; getarray1.push($.ajax({ type: "post", data: blogObject, dataType: "json", url: apiRoot, success: function (data) { sumContent += data.content; } })); } });
2.第二步,等第一步的请求完成之后,遍历所有blogid查询自己是否点赞
sumContent.match(RegExp('blogid="[^"]+"','g')).forEach(function(item, index){ eval(item); var s = {}; s._csrf = getAinfo(); s.blogId = blogid; $.ajax({ type: "post", url: 'https://bbs.huaweicloud.com/api/blog/get-vl', data: s, async: false, dataType: "json", success: function (data) { if(data.is_vote){ console.log('#'+blogid); } } }); });
当然上述的过程可能显得过于长了,尤其是第二步为了保证csrf过程使用了同步请求,可以考虑从自己的历史纪录先过滤出来自博客的链接,再使用第二步判断;或者对第一得到的结果,过滤出其中点赞数大于0的,再进行第二步;此外,由于第二步遍历时间过长,过程中登录可能失效,导致后续请求失败;https://bbs.huaweicloud.com/blogs/加上获取的blogid就是目标地址;
查询记录:
https://www.cnblogs.com/digdeep/p/4703298.html
https://segmentfault.com/a/1190000007932293
https://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html
https://bbs.huaweicloud.com/blogs/137394
https://bbs.huaweicloud.com/blogs/137380
https://bbs.huaweicloud.com/blogs/127451
- 点赞
- 收藏
- 关注作者
评论(0)