渗透测试时,需要注意浏览器选项
渗透测试时,需要注意浏览器选项
From ChaMd5安全团队核心成员 tyomcat
渗透测试人员寻找漏洞,总是包括跨站脚本(XSS)攻击。最近,我观察到一个不寻常的XSS相关案例,学到一些新的东西。
XSS相关的测试过程中,我们插入“<script>alert(1)</script>”payload作为一个GET请求的参数和执行这个命令在Internet Explorer 11。我们希望看到我们的“恶意”警报,但浏览器返回“网页无法找到”,使我们认为我们的命令失败。接下来我们跑在Firefox的命令,看到1个不同的响应,xss执行成功 “alert box 1”。
不同浏览器的响应相同的HTTP返回代码。 当我在Burp代理服务里研究了请求/响应信息,我看到了“HTTP / 1.1 400错误请求“和我们插入的XSS payload在响应信息里。这表明该命令应该在任何时候工作。
在burp的实际响应页面中。 显然相同的响应HTTP代码在浏览器里有差异。经过进一步的调查发现Internet Explorer的高级功能“Show friendly HTTP error messages”:
IE的网络选项
选中此功能(默认值)时,Internet Explorer将显示其自己友好的错误消息,而不是Web服务器的页面响应。 在我们的XSS攻击尝试中,Internet Explorer 忽略了Web服务器的错误请求响应(注入的XSS payload会在响应的信息中弹窗)而显示自己的消息。通过只看这个反应,在我们的测试中,我们可以错过了一个严重的问题。 我们不选中此选项,重新启动浏览器,并运行相同的恶意网址。这一次,我们看到成功执行的响应与警报框
在IE中禁用了“friendly error message”功能后,XSS成功执行。
还有其他一些特定的浏览器设置/依赖,在渗透测试中需要注意: 使用XSS过滤器(IE):启用此选项时,浏览器识别的响应潜在的攻击(反射脚本),并会自动阻止脚本代码运行。当出现这种情况时,我们会在通知栏中看到一条消息,该网页被修改以保护您的隐私和安全。禁用此选项在安全领域而渗透测试:
IE的XSS过滤器选项
开发商在浏览器中使用XSS过滤器时,也可以选择设置自定义的XSS保护响应头。 你下一次渗透测试,看一看这些浏览器选项。他们可以帮助你取得更大的成功。
##X-XSS-Protection
HTTP X-XSS-Protection 响应头是Internet Explorer、Chrome和Safari的一个特性,停止页面加载他们检测到的反射跨站脚本(XSS)攻击。当网站实施了强大的 Content-Security-Policy(禁用内联JavaScript的使用:“unsafe-inline”)后,虽然这些保护很大程度上是不必要的,但他们仍然可以为用户还不支持CSP的旧浏览器提供保护。
Header type Response header Forbidden header name no
###SyntaxEDIT
X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<reporting-uri>
#####0
禁用XSS过滤.
#####1
使用XSS过滤(通常浏览器会默认).如果一个跨站点脚本攻击被检测出来,浏览器就会将网页(消除不安全的部分)
#####1;mode=block
使用XSS过滤。不是将页面”消毒“,而是浏览器会阻止页面渲染,如果检测到攻击。
######1; report=<reporting-URI> (Chromium only)
使用XSS过滤。如果一个跨站点脚本攻击被检测出来,浏览器会对页面”消毒“和报告错误。这是用CSP的URI指令功能发送报告。
####ExampleEDIT
Block pages from loading when they detect reflected XSS attacks:
X-XSS-Protection: 1;mode=block
####PHP
header("X-XSS-Protection: 1; mode=block");
####Apache (.htaccess)
<IfModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" </IfModule>
###SpecificationsEDIT
Not part of any specifications or drafts.
###Browser compatibilityEDIT
- Golang语言社区-文件操作
- MySQL service启动脚本浅析(r12笔记第59天)
- 分享WordPress显示评论者IP的归属地及运营商信息的2种方案
- 解决dos2unix/unix2dos报错,并在家目录下生成u2dtmp*文件问题
- 【前沿】TensorFlow Pytorch Keras代码实现深度学习大神Hinton NIPS2017 Capsule论文
- Nginx通过二级目录(路径)映射不同的反向代理,规避IP+端口访问
- MySQL中批量初始化数据的对比测试(r12笔记第71天)
- Golang语言--包的概念、导入与可见性
- MySQL中的change,modify和自增列的关系(r12笔记第70天)
- Golang 值得注意的地方
- MySQL数值类型在binlog中需要注意的细节(r12笔记第69天)
- WordPress评论滑动/拉链解锁myQaptcha修改为自动提交的方法
- MySQL root用户登录的几个小问题(r12笔记第67天)
- Java实现生产者消费者的两种方式(r12笔记第66天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java——类集框架:Map集合的详解及应用举例
- Java——类集框架:Set集合接口的详解及应用举例
- 如何有效地进行代码 Review?
- Java——对象序列化
- Android——MPAndroidChart折线图/柱状图/饼形图的使用
- Java——对String类型的时间进行加减操作
- Java——枚举基础应用总结(多例设计模式、Enum类、枚举的实际应用)
- Java——Annotation注解基本总结(简介、覆写、过期声明、压制警告)
- JavaWeb——一文快速入门BootStrap(栅格系统、全局CSS样式、组件、插件、基于BootStrap的官网案例实战)
- JavaWeb——XML入门详解(概述、语法、约束、Jsoup解析、Xpath解析)
- JavaWeb——CSS应用实例详解(概述、语法、选择器、属性、用户登录界面实例)
- JavaWeb——JavaScript精讲之事件监听机制与表单校验案例实战
- Java——扩展概念(匿名内部类、包装类、装箱与拆箱、数据类型的转换)
- Java——接口的基本总结(基本定义、使用接口定义标准、工厂设计模式、代理设计模式、抽象类与接口的区别)
- JavaWeb——HTML表单标签详解(input、label、select、textarea)