在漫漫渗透之路中,眼前一亮的发现一个站。Referer字段没有检查,POST参数中的动态token也没有检查,这不是带一波CSRF的节奏嘛。但是遇到一个之前我没遇到的问题导致我CSRF失败,这个问题或许很简单,但是我是一个小白,大牛看到就不要喷我了。

  首先我在Burpsuite当中生成了CSRF的POC,发现不行。经过与原始请求对比发现HEADER中少了一个字段,而这个字段就是CSRF成败与否的关键。下面开始不啰嗦上真正知识点。

  在原来站中这个请求是一个POST的Ajax异步请求。于是在HTTP报文的head头里面就有了这个字段:X-Requested-With: XMLHttpRequest。 服务器明显检查了这个字段,带有的这个字段就会成功,否则就会302重定向到登录页面。于是我构造了一个利用xmlhttprequest 够早了一个POC。

#注释内容(python是最好的语言,至少在我心中如此):

"""

xmlhttprequest带cookie的方案:

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://xxxx.com/demo/b/index.php", true);
xhr.withCredentials = true; //支持跨域发送cookies 

xmlhttprequest设置head头字段:

xhr.setRequestHeader("POWERED-BY-MENGXIANHUI", "Approve");
xhr.setRequestHeader("Content-Type", "application/xml");

""" 

于是我想这样可以了吧,然后就发起了新的Ajax请求准备CSRF,但是在Burp中看到,没有字段。

原因:X-Requested-With: XMLHttpRequest在跨域请求中会被去掉(如果跨域配置允许时候可以带着,看配置)。

然后我手动强制加上了这个字段:

xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

这个时候我发现,原来的报文变成了OPTION包,而不是POST请求报文。

原来这是跨域访问的一种安全检查机制:

首先发起OPTION对目标服务器进行测试,看看这种访问是否安全

在头部字段会出现下面三个

Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-requested-with
Origin: null(跨域Ajax去掉X-Requested-With,带上这个)

当收到服务器端的响应允许后才发送正式POST或者GET请求。

这叫做预检报文,如何不触发预检报文,有三个同时满足的必备条件(三项均成立才行):

1. 只能是Get、Head、Post方法
2. 除了浏览器自己在Http头上加的信息(如Connection、User-Agent),开发者只能加这几个:Accept、Accept-Language、Content-Type……
3. Content-Type只能取这几个值:
  application/x-www-form-urlencoded
  multipart/form-data
  text/plain

或许有相关的解决办法,我后面研究研究继续搞。

X-Requested-With导致CSRF失败的更多相关文章

  1. 记一次因证书问题导致请求失败问题SSLHandshakeException

    记一次因证书问题导致请求失败问题SSLHandshakeException 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10989813.html 最近接一外 ...

  2. "错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法

    [详细报错如下]: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致 ...

  3. VS2012 asp.net mvc 4 运行项目提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败"

    创建mvc4 应用程序发布,运行出错.出现未经授权: 服务器配置导致登录失败.请验证您是否有权基于您提供的凭,后来找得解决方法: 打开点站的web.confg文件,将: <authorizati ...

  4. IIS7部署项目时提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法

    这个错误的定位:你的站点使用了Forms验证,而且在部署在生产环境的时候,设置错误,或者注释了. 解决方法如下: 1.检查Forms配置是否屏蔽. 2.有权限访问的资源是否已经开发. 基本就围绕以上两 ...

  5. 同一个tomcat部署多个项目导致启动失败

    内容描述在同一个tomcat部署多个打包成war包的项目导致启动失败,报错如下: 报错信息Error starting ApplicationContext. To display the condi ...

  6. idea在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误

    在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误 在maven projects中图标toggle'skip Tests' Mode //宏杰帮助 网上案例:https://blo ...

  7. swap空间不够导致安装失败解决方法

    在安装Oracle的时候,可能因为我们分配的swap空间不够导致安装失败.处理步骤如下: SWAP空间为2G [root@linux01 oracle]# free            total  ...

  8. ubuntu SDL2 安装时依赖文件导致安装失败

    今天打算学习littlev GUI,使用Ubuntu来实现仿真,然后在安装SDL2的时候,始终因为依赖关系导致安装失败,我尝试手动去安装那些有依赖关系的包发现根本不可行,然后我百度上也没有找到合适的法 ...

  9. VMware workstation 非正常关机导致开机失败,解决方法

    问题:VMware workstation 非正常关机导致开机失败!如下图:

随机推荐

  1. 关于微博开放平台Oauth2.0接入网站应用

    关于什么是微博开放平台及微博开放平台能做什么,咱就不做搜索引擎的搬运工了 这里直接给个链接介绍:微博开放平台 本文只是抛砖引玉,讲讲微博开放平台的基本用法,适合没接触过开放平台的朋友入门学习,老鸟就略 ...

  2. 移动端网页使用flexible.js加入百度联盟广告样式不一致问题解决

    flexible.js是淘宝推出的一款移动端手机自适应的库,源码内容很简洁,当网页使用了该库之后,页面会在head中加入对应的页面响应式的meta标签. 当使用flexible.js的时候,引入百度联 ...

  3. linux环境中,ssh登录报错,Permission denied, please try again.

    问题描述: 今天早上一个同事反应一个问题,通过ssh登录一台测试机的时候,发现两个账号,都是普通账号,一个账号能够登录, 另外一个账号无法登录.问他之前有做过什么变更吗,提到的就是之前有升级过open ...

  4. ​4种实现多列布局css

    摘要: 多列布局在网站应用中也是经常见到的,今天就分享4中多列布局. display:table <style> .table { width: auto; min-width: 1000 ...

  5. Eclipse Maven 配置setting.xml 的镜像远程仓库

    1.在.m2中新建settings.xml文件 1.window-->Preferences-->Maven-->User Settings 3.点击open file 编辑将远程仓 ...

  6. iOS开发之-- 字符串的操作,去掉某一个字符或者替换成其他字符

    一个简单的操作,记录下: NSString *strUrl = [urlString stringByReplacingOccurrencesOfString:@" " withS ...

  7. Android开发-- The content of the adapter has changed but ListView did not receive a notification - With AsyncTask

    最近在联系开发DaysMatter时遇到一个问题: app中使用ListView来展示所有事件,每次添加完事件后使用下面代码来更新ListView. toDoListView.refreshDrawa ...

  8. 3dmax导出模型使用相对路径读取纹理贴图

    Shift+T快捷键打开“资源跟踪”窗口

  9. 【译】Kafka学习之路

    一直在思考写一些什么东西作为2017年开篇博客.突然看到一篇<Kafka学习之路>的博文,觉得十分应景,于是决定搬来这“他山之石”.虽然对于Kafka博客我一向坚持原创,不过这篇来自Con ...

  10. Python闭包装饰器笔记

    Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...