X-Requested-With导致CSRF失败
在漫漫渗透之路中,眼前一亮的发现一个站。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失败的更多相关文章
- 记一次因证书问题导致请求失败问题SSLHandshakeException
记一次因证书问题导致请求失败问题SSLHandshakeException 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/10989813.html 最近接一外 ...
- "错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法
[详细报错如下]: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致 ...
- VS2012 asp.net mvc 4 运行项目提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败"
创建mvc4 应用程序发布,运行出错.出现未经授权: 服务器配置导致登录失败.请验证您是否有权基于您提供的凭,后来找得解决方法: 打开点站的web.confg文件,将: <authorizati ...
- IIS7部署项目时提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法
这个错误的定位:你的站点使用了Forms验证,而且在部署在生产环境的时候,设置错误,或者注释了. 解决方法如下: 1.检查Forms配置是否屏蔽. 2.有权限访问的资源是否已经开发. 基本就围绕以上两 ...
- 同一个tomcat部署多个项目导致启动失败
内容描述在同一个tomcat部署多个打包成war包的项目导致启动失败,报错如下: 报错信息Error starting ApplicationContext. To display the condi ...
- idea在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误
在maven打包时运行Test测试, 导致打包失败, 乱七八糟的错误 在maven projects中图标toggle'skip Tests' Mode //宏杰帮助 网上案例:https://blo ...
- swap空间不够导致安装失败解决方法
在安装Oracle的时候,可能因为我们分配的swap空间不够导致安装失败.处理步骤如下: SWAP空间为2G [root@linux01 oracle]# free total ...
- ubuntu SDL2 安装时依赖文件导致安装失败
今天打算学习littlev GUI,使用Ubuntu来实现仿真,然后在安装SDL2的时候,始终因为依赖关系导致安装失败,我尝试手动去安装那些有依赖关系的包发现根本不可行,然后我百度上也没有找到合适的法 ...
- VMware workstation 非正常关机导致开机失败,解决方法
问题:VMware workstation 非正常关机导致开机失败!如下图:
随机推荐
- mysql 找不到或无法加载已注册的 .Net Framework Data Provider和Unable to find the requested .Net Framework Data Provider. It may not be installed解决
需要安装 mysql-connector-net-6.7.4.msi 在C盘安装mysql的位置找到三个DLL,复制到Bin文件夹下 在Web.config文件中添加对应配置: <system. ...
- Node.js之操作Mongodb
// mongoose 链接 var mongoose = require('mongoose'); var db = mongoose.createConnection('mongodb://127 ...
- EF跨库查询,DataBaseFirst下的解决方案
出于各种原因,有时需要跨数据库访问某些数据表,有同学已经给出了解决方案,比如 http://blog.csdn.net/hanjun0612/article/details/50475800 已经解 ...
- vs2010中 js的intellisense(智能提示) 和 Snippets(代码块)
关于智能提示vs2008和vs2010都是很强大了!但是很多我们知道但是也没有怎么合理应用,真是可惜了啊,如果合理用起来那么会提高我们的开发效率和减少出错几率哦,如果没有智能提示,我想我会疯的. 因为 ...
- Redis性能测试Redis-benchmark
Redis-benchmark是官方自带的Redis性能测试工具 测试Redis在你的系统及你的配置下的读写性能 redis-benchmark可以模拟N个机器,同时发送M个请求 redis-benc ...
- GitHub 二次验证收不到短信咋办?
身在天朝,用了国外的代码托管服务,会有些烦恼的. 网速慢就不说了,如果启用了二次验证,短信收不到那就悲催了. 之前的都能收到短信的,突然间尝试了很多天都不行,联系github的客服,几次的答复如下: ...
- [原]unity3d ios平台内存优化(一)
关于内存优化,人云亦云 各有己见.本文将通过设置Strpping Level ,减少内存使用. 先看三幅图: 1.没做任何优化,默认选项 2.设置Stripping level 为 Use micro ...
- MTK 精简ROM
PhaseBeam.apk--------------------------------------动态壁纸光之韵律(可删) Phone.apk--------------------------- ...
- C#中AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的区别
// 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.G ...
- VMWare------安装时出现无法将值写入注册表项
安装时提示详情: 无法打开注册表项UNKNOWN\Components\...请确认你是否有足够的权限访问该注册表项,或者与技术支持人员联系. 解决方法: 关掉360安全卫士等软件再安装