XSS

XSS

什么是XSS?

跨站脚本(Cross-Site Scripting,XSS)是一种经常出现在 Web 应用程序中的计算机安全漏洞,是由于 Web 应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码(通常包括 HTML 代码和客户端 Javascript 脚本)注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取 Cookie 资料窃取、会话劫持、钓鱼欺骗等各种攻击。

XSS产生的原因

XSS 攻击就是将非法的 JavaScript、VBscript 等脚本注入到用户浏览的网页上执行,而 Web 浏览器本身的设计是不安全的,它只负责解释和执行 JavaScript 等脚本语言,而不会判断代码本身是否对用户有害。

XSS的分类

反射型跨站脚本

持久型跨站脚本

反射型跨站脚本

反射型跨站脚本(Reflected Cross-site Scripting)也称作非持久型、参数型跨站脚本。

反射型 XSS 的利用一般是攻击者通过特定手法(比如利用电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者单击这些专门设计的链接的时候,恶意 JavaScript 代码会直接在受害者主机上的浏览器执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。

常见形式

1、主要用于将恶意脚本附加到 URL 地址的参数中,例如:

http://www.test.com/search.php?key="><script>alert("XSS")</script>

http://www.test.com/help.shtml?query=%3Cscript%3Ealert%281%29%3C/script%3E

http://www.test.com/logout.asp?out=1&url=javascript:alert(document.cookie)

诱使受害者点击链接,恶意的JavaScript代码直接在受害者的主机上的浏览器执行。

反射型 XSS 的危害往往不如持久型 XSS,因为恶意代码暴露在 URL 参数中,并且时刻要求用户单击方可触发,稍微有点安全意识的用户可以轻易看穿该链接是不可信任的。如此一来,反射型 XSS 的攻击成本要比持久型 XSS 高得多。但恶意url暴露的问题可以通过各种编码转换解决。

>%22%27><img%20src%3d%22javascript:alert(%27XSS%27)%22>>"'><img%20src%3D%26%23x6a;%26%23x61;%26%23x76;%26%23x61;%26%23x73;%26%23x63;%26%23x72;%26%23x69;%26%23x70;%26%23x74;%26%23x3a;alert(%26quot;XSS%26quot;)>AK%22%20style%3D%22background:url(javascript:alert(%27XSS%27))%22%20OS%22%22%2Balert(%27XSS

持久型跨站脚本

此类 XSS 不需要用户单击特定 URL 就能执行跨站脚本,攻击者事先将恶意 JavaScript 代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意 JavaScript 代码的页面就会执行恶意代码。

XSS的简单发掘

此处实例比较简单,更多发掘和测试XSS的技术后续补充。

1、对网站的输入框、URL参数处进行测试。

a7d9491700444bf8c1de8f0189842e4

查看源代码

说明确实存在XSS漏洞

2、在测试XSS的过程中,我们需要尝试各种XSS输入,如果有一份待测试的XSS语句列表会便利许多。

XSS 语句列表罗列了各种各样的 XSS 代码,这些 XSS 代码在不同的浏览器、不同的应用场景、不同的环境下均有跨站触发的可能。通常,此类列表被称为 Cheat Sheet,即我们平时所指的备忘单。

Cross-Site Scripting (XSS) Cheat Sheet - 2023 Edition | Web Security Academy (portswigger.net)

绕过XSS-filter

为了防御跨站脚本攻击,会在 Web 应用中设计一个 XSS Filter,即跨站脚本过滤器,用于分析用户提交的输入,并消除潜在的跨站脚本攻击、恶意的 HTML 或简单的 HTML 格式错误等。

1、<>标注的html/javascript

<script>shellcode</script>

因此XSS-Filter首先过滤和转义的是<>或<script>等字符

2、利用html标签属性值执行XSS

Javascript:[code]伪代码协议

<table background="javascript:alert(/xss/)"></table>

补充:尽管一些网页可能对尖括号进行了过滤,但仍然可以接受JavaScript伪代码,这是因为JavaScript伪代码并不依赖于尖括号以及其他特殊字符。

即使尖括号被过滤,浏览器仍然会将background属性的值作为JavaScript代码进行解析和执行,而不是作为普通的字符串。

3、空格回车Tab

< img src="javas cript:alert(/xss/)" width=100>使用【tab】添加空格

< img src="javas

cript:alert(/xss/)" width=100>回车

4、对标签属性值转码

根据 HTML 的属性值支持 ASCII 码的特性,把 XSS 代码:

< img src="javascript:alert('XSS');">

替换成:

< img src="javascrip&#116&#58alert(/XSS/);" >

对应 ASCII 码表可以看出,t 的 ASCII 码值为 116,用「&#116」表示;:则表示为&#58,所以原本的 javascript:alert('XSS');转码后变成:javascrip&#116&#58alert(“XSS”)

5、产生自己的事件

< img src="#" onerror=alert(/xss/)>

6、利用CSS跨站剖析

使用 CSS 样式表执行 JavaScript 具有隐蔽、灵活多变等特点

缺点:各浏览器之间不能通用,甚者可能同一浏览器不同版本之间都不能通用。

  • Experssiom

<div style="background-image:url(javascript:alert('XSS'))">

< img src="#" style="xss:expression(alert(/XSS/));"><style>

body {background-image: url("javascript:alert('XSS')");}

</style>

  • 使用link标签引用CSS
  • @import导入

7、扰乱过滤规则

大小写

大小写混淆

单引号

/

不同全角字符

/**/

\0

转码

根据不同的web浏览器对javascript的解释以及对CSS的解释

资料来源:

7cce53f226a12437b0bb2f3b88921bf

XSS通关小游戏:欢迎来到level1 (ctf8.com)

posted @ 2023-10-11 14:14  ahdbv  阅读(78)  评论(0编辑  收藏  举报