xss且复现XSS漏洞及分析

一、什么是XSS

XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。

作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的。在XSS攻击中,一般有三个角色参与:攻击者、目标服务器、被攻击者的浏览器。

(一)攻击类型

1.反射型XSS(非持久型XSS)

反射型XSS又称非持久型XSS。之所以称为反射型XSS,是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的:发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。

非持久型 XSS 漏洞攻击的四大特点

① 即时性。不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击,拿到用户隐私数据;

②攻击者需要诱骗点击;

③反馈率低,所以较难发现和响应修复;

④盗取用户敏感保密信息。。

由于反射型XSS通过HTTP的get或post请求就能完成一次攻击,并且需要用户主动点击触发,所以反射型XSS比较隐蔽,难以发现和修复。

2.存储型XSS

存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。

一般存在于 Form 表单提交等交互功能,如发帖留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。

存储型XSS和反射型XSS不同点在于它的恶意代码会永久存储到目标服务器(数据库、内存或文件系统),不需要像反射型XSS用户重新请求时需要再次发送,它一般存在于表单编写的交互代码中。存储型XSS比起反射型XSS,它一般存在于用户受信任的网站中,隐蔽性更高,危害性更大。

3.DOM-based 型XSS攻击

基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。

(二)防御XSS攻击

1. 对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。
2. 对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。
3. 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。
4. 不要使用 Eval来解析并运行不确定的数据或代码,对于 JSON解析请使用 JSON.parse() 方法。
5. 后端接口也应该要做到关键字符过滤的问题。

二、例题

const data = decodeURIComponent(location.hash.substr(1));
const root = document.createElement('div');
root.innerHTML = data; 
 
// 这里模拟了XSS过滤的过程,方法是移除所有属性
for (let el of root.querySelectorAll('*'))//找出所有标签
 {
    let attrs = [];
    for (let attr of el.attributes) {
        attrs.push(attr.name);
    }
    for (let name of attrs) {
        el.removeAttribute(name);
    }
}
 
document.body.appendChild(root); 

注:

①对于innerHTML 属性,几乎所有的元素都有innerHTML属性,它是一个字符串,用来设置或获取位于对象起始和结束标签内的HTML(包括html标签以及里边的内容文字)。

②document.createElement()是在对象中创建一个对象,要与appendChild() 或 insertBefore()方法联合使用。其中,appendChild() 方法在节点的子节点列表末添加新的子节点。insertBefore() 方法在节点的子节点列表任意位置插入新的节点

下面,举例说明document.createElement()的用法。

例1:
        
效果:在标签board中加载一个按钮,属性值为“这是测试加载的小例子”。

③decodeURIComponent

decodeURIComponent() 函数可把字符串作为 URI 组件进行解码

补充:详见http://t.csdn.cn/vOleN

④querySelectorAll() 找出所有匹配的节点并返回数组。

从上代码可以看出,其可以移除掉我们输入标签的所有属性,且innerHTML考虑到安全问题过滤了script

这道题所以这道题使用DOM破坏和CSS来触发XSS比较简单

payload如下:

 

你可能感兴趣的:(xss,安全,web安全)