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) 则是用来去掉第一个井号