XSS 原理

XSS 原理

跨站脚本(Cross-Site Scripting)是针对 web 应用程序的漏洞。拥有 XSS 漏洞的 WEB 应用业务流程为:

  • 【 P 】:用户发送给网站一些数据 P
  • 【 R = P + X 】:服务器接收 P ,并拼接响应信息 R = P + X
  • 【 R 】:浏览器接收响应信息,并执行 R

在正常使用中,也许业务没有问题。但用户发送的 P 中含有可被浏览器执行的数据时,便出现了问题。

假设有 用户 A,用户 B。他们进行了以下操作:

  • 【 P 】:用户 B 构建了可执行的数据 P ,并发送给用户 A
  • 【 P 】:用户 A 将 P 发送给网站
  • 【 R = P + X 】:服务器接收 P ,并拼接响应信息 R = P + X
  • 【 R 】:用户 A 的浏览器接收响应信息,并执行 R

这时用户 A 的浏览器便执行了 用户 B 书写的代码。如果代码含有恶意操作,用户 A 将因为网站漏洞付出代价。

XSS 的分类

XSS 在利用时,也有多种不同的方式。它们被分为:

  • 反射型
  • 存储型
  • DOM 型

反射型 XSS

这个便是最为经典的 XSS。它的流程基本与原理一致:

  • 【 url = D + P 】:攻击者构造一个 url = D + P 链接。D 为正常 url,P 就是可执行代码。
  • 【 url 】:正常用户使用这个 url 访问服务器。
  • 【 R = P + X 】:服务器接收到 url 中的 P ,并构造响应信息 R = P + X
  • 【 R 】:正常用户的浏览器接收响应信息,执行 R

存储型 XSS

这类 XSS 的危害远比反射型要大。因为可执行代码被存储进服务器,任何访问服务器的用户都将执行 XSS 代码。

  • 【 S = D + P 】:攻击者将代码 P ,上传服务器的一个页面中。
  • 【 url 】:其他用户访问这个页面。
  • 【 S = D + P 】:服务器将存储的 S 作为响应信息返回。
  • 【 S 】:用户浏览器执行 S。

DOM 型 XSS

DOM 型最大的特点是可执行代码没有经过服务器,因此一旦出现,难以防御。

  • 【 url = D + P 】:攻击者构建 url = http://192.168.64.2/dom_xss.html#alert(1) 其中 P=#alert(1)
  • 【 url = D 】:用户使用 url 访问服务器,浏览器会真正发送的 url = D。同时 P 被浏览器保存备用
  • 【 R 】:服务器返回页面 R
  • 【 R 执行 P 】:浏览器利用返回的页面 R 执行 P

可以看出这是很特殊的状态,用户提交的 url 没有完整的交给服务器。以至于恶意代码逃过服务器的检测。

同时页面中含有以下代码运行 url 中的脚本:

<script>
	eval(location.hash.substr(1));
</script>

location.hash 将返回 url 中的 #alert(1)
substr(1) 则是用来去掉第一个井号
原文地址:https://www.cnblogs.com/shiwai/p/14170533.html