什么是XSS攻击,攻击类型​,如何防御?

12月 01, 202438 mins read

XSS(跨站脚本)攻击是一种常见的网络安全漏洞,攻击者通过在网页中注入恶意脚本,操纵用户浏览器执行非授权的操作。如用户信息泄露、会话劫持和网页篡改等。为了有效防御XSS攻击,网站管理员应采取措施,如对用户输入进行严格的验证和过滤、使用内容安全策略(CSP)、编码输出内容以及定期测试Web应用程序的安全性。增强对XSS攻击的认识和防护,可以保护用户信息安全,提升网站的整体安全性。

f222FC6EFCESsc6

什么是XSS攻击?

XSS(Cross-Site Scripting)简称为:CSS,中文俗称跨站脚本攻击,由于CSS与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,跨站脚本攻击缩写为XSS),它是一种网站应用程序的安全漏洞注入攻击。攻击者通过在网页中插入恶意脚本(通常是JavaScript代码),来窃取用户信息、劫持账户或进行其他恶意行动。
XSS攻击类型分为:反射型(非持久型)XSS、存储型(持久型)XSS、DOM型XSS、通用型XSS、突变型XSS。常见的三种如下

存储型 XSS(Stored XSS)攻击者将恶意代码存储到目标网站的数据库中,当其他用户浏览相关页面时,恶意代码会从服务器上返回并在用户的浏览器中执行。
反射型 XSS(Reflected XSS)攻击者通过构造带有恶意代码的URL,并诱导用户点击该链接,服务器接收到请求后,将恶意代码反射回用户的浏览器并执行。
DOM 型 XSS(DOM-based XSS)攻击者利用网页的 DOM(文档对象模型)结构漏洞,修改了网页的内容,使得恶意代码被执行。

一:存储型 XSS:
存储型 XSS 的原理是攻击者将恶意脚本注入到目标网站的数据库中,然后当其他用户访问该网站时,恶意脚本会从数据库中取出并在用户浏览器中执行。
存储型 XSS 常针对社区论坛或者web邮箱类型网站,不需要特别的技术,黑客只需要提交XSS漏洞代码到用户能访问的地方,包括贴子,评论,留言板,电子邮件等地方,只要用户访问被感染的网页,就自动执行了操作。
存储型XSS示例:

<!-- 攻击者输入的恶意代码 -->
<script>alert('您的cookie是:' + document.cookie);</script>

如黑客在评论区等输入上述这段代码。当其他用户查看包含这段代码的页面时,浏览器会执行它,导致用户的cookie被泄露。如果是其他恶意脚本,黑客可以通过漏洞进一步攻击,达成攻击的目的。

漏洞成因:
存储型XSS漏洞的成因与反射型的根源类似,不同的是恶意代码会被保存在服务器中,导致其它用户(前端)和管理员(前后端)在访问资源时执行了恶意代码,用户访问服务器-跨站链接-返回跨站代码。

存储型 XSS攻击示意图CDN5.COM

存储型 XSS攻击的危害性较大,因为恶意脚本会被长期存储在目标网站的数据库中,影响所有访问该网站的用户。为了防止存储型 XSS攻击,开发者应该对用户输入进行有效的过滤和转义,以确保恶意脚本无法被存储并执行。同时,使用Content Security Policy策略和输出编码等技术增强网站的安全性。

二、反射型 XSS(Reflected XSS):
反射型 XSS 利用了应用程序对用户输入的不恰当处理或输出过程中的漏洞。攻击者利用自己精心设计的URL诱导用户访问,一旦用户访问了带有恶意脚本的url,那么浏览器就会执行,有的会弹出一个警报框,显示 "XSS",即为攻击成功。
举例来说,当一个网站的代码中包含类似下面的语句

<?php echo "<p>xss hello,$_GET['xss']</p>"; ?>

如果未做防范XSS,用户名设为 <script>alert("XSS")</script> 则会执行预设好的JavaScript代码。

漏洞成因
存储型XSS漏洞的成因与反射型的根源类似,不同的是恶意代码会被保存在服务器中,导致其它用户(前端)和管理员(前后端)在访问资源时执行了恶意代码,用户访问服务器-跨站链接-返回跨站代码。

反射型 XSS攻击流程图cdn5

主要场景有以下几种:

将不可信数据插入到HTML标签之间时;
div, p, td;
将不可信数据插入到HTML属性里时;
<div width=$INPUT></div>
将不可信数据插入到script里时;
<script>varmessage ="$input";</script>
还有插入到Style属性里的情况,同样具有一定的危害性;
<span ></span>
将不可信数据插入到HTML URL里时
<a href="[http://www.aaa.com?param=](http://www.bbb.com/?param=) $INPUT"></a>

反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor(chrome内置的XSS保护)、NoScript等防御手段的影响较大,所以它的危害性较存储型要小。

三:DOM 型 XSS(DOM-based XSS):

通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS,它是一种利用了前端页面中存在的漏洞,表示HTML文档结构的对象模型,攻击者能够在 DOM 中插入恶意代码,它可以通过 JavaScript 来操作和修改。利用步骤和反射型很类似,但是唯一的区别就是,构造的URL参数不用发送到服务器端,可以达到绕过WAF、躲避服务端的检测效果。

代码示例:

<html><head><title>DOM Based XSS Demo</title><script>function xsstest(){var str = document.getElementById("input").value;document.getElementById("output").innerHTML = "<imgsrc='"+str+"'></img>";}</script></head><body><div id="output"></div><input type=text id="input" size=50 value="" /><input type=button value="submit" onclick="xsstest()" /></body></html>

FFF22XC20241202005304什么是XSS攻击,攻击类型​,如何防御?

这里是通过js脚本生成了一个超链接,还声称了innerhtml

输入任意字符串:

什么是XSS攻击,攻击类型​,如何防御?
访问链接:

23236CFMKFA4455DOM 型 XSS(DOM-based XSS)

利用手法:输入  javascript:alert(1)

什么是XSS攻击,攻击类型​,如何防御?

在实例代码中通过js操作用户输入的字符串,并制作了一个超链接,会被浏览器进行解析。

XSS攻击的危害

  • 窃取敏感信息:攻击者可以通过注入恶意脚本,窃取用户的敏感信息,如用户名、密码、Cookie等。这些信息可以用来冒充用户身份进行恶意操作。
  • 劫持会话:攻击者通过窃取用户的会话令牌或Cookie,能够劫持用户的会话,实施未经授权的操作,如修改账户信息、发表言论等。
  • 篡改网页内容:攻击者可以通过注入恶意脚本,修改网页上的内容,向用户展示虚假信息、欺骗性的广告、恶意链接等,影响用户的体验和信任。
  • 钓鱼攻击:攻击者可以伪造合法网站,诱使用户输入敏感信息,如银行账户密码、信用卡信息等,从而实施钓鱼攻击。
  • 恶意操作:攻击者可以在用户浏览器中执行恶意脚本,例如发起DDoS攻击、改变用户设置、执行未授权操作等,从而对用户和网站造成实际损害。
  • 信任破坏:如果用户发现网站存在XSS漏洞,可能会对该网站产生质疑并失去信任,导致用户流失。
  • 传播恶意代码:攻击者可以利用XSS漏洞传播恶意软件、病毒或恶意脚本,进一步扩大攻击范围。
  • 破坏隐私:用户的隐私可能会被泄露,从而导致个人、财务等方面的损失。

XSS 攻击的预防

XSS 攻击有两大要素:

1. 攻击者提交恶意代码。
2. 浏览器执行恶意代码。

1.预防 DOM 型 XSS 攻击 DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。
在使用.innerHTML、.outerHTML、document.write()时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用.textContent、.setAttribute()等。
DOM 中的内联事件监听器,如location、onclick、onerror、onload、onmouseover等, 标签的href属性,JavaScript 的eval()、setTimeout()、setInterval()等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些 API,很容易 产生安全隐患,请务必避免。
2.输入过滤
如果由前端过滤输入,然后提交到后端的话。一旦攻击者绕过前端过滤,直接构造请求,就可以提交恶意代码了。
那么,换一个过滤时机:后端在写入数据库前,对输入进行过滤,然后把“安全的”内容,返回给前端。这样是否可行呢?我们举一个例子,一个正常的用户输入了 5 < 7 这个内容,在写入数据库前,被转义,变成了 5$lt;7。

问题是:在提交阶段,我们并不确定内容要输出到哪里。
这里的“并不确定内容要输出到哪里”有两层含义:
用户的输入内容可能同时提供给前端和客户端,而一旦经过了 escapeHTML(),客户端显示的内容就变成了乱码( 5$lt;7 )。
在前端中,不同的位置所需的编码也不同。当 5$lt;7  作为 HTML 拼接页面时,可以正常显示:5 < 7
所以输入过滤非完全可靠,我们就要通过“防止浏览器执行恶意代码”来防范 XSS,可采用下面的两种方法
3.前端渲染把代码和数据分隔开
在前端渲染中,我们会明确的告诉浏览器:下面要设置的内容是文本(.innerText),还是属性(.setAttribute),还是样式 (.style)等等。浏览器不会被轻易的被欺骗,执行预期外的代码了。
Javascript:可以使用textContent或者innerText的地方,尽量不使用innerHTML;
query:可以使用text()得地方,尽量不使用html();
4.拼接HTML时对其进行转义
如果拼接 HTML 是必要的,就需要采用合适的转义库,对 HTML 模板各处插入点进行充分的转义。
常用的模板引擎,如 doT.js、ejs、FreeMarker等,对于 HTML 转义通常只有一个规则,就是把 & < > " ' / 这几个字符转义掉,确 实能起到一定的 XSS 防护作用,但并不完善:
这里推荐一个前端防止XSS攻击的插件: js-xss的使用和源码解读,Git 3.8K 的Star和60W的周下载量证明了其强大性.

Demo:

封装公共的xss字符过滤方法

/*** xss 转义*/if(!function_exists('xss_encode')){functionxss_encode($string){returnstrip_tags(htmlspecialchars(htmlentities($string, ENT_QUOTES,'UTF-8')));}}/*** xss 反转义*/if(!function_exists('xss_decode')){functionxss_decode($string){returnhtml_entity_decode(htmlspecialchars_decode($string),ENT_QUOTES,'UTF-8');}}

封装了一个全局插件(中间件)

<?phpnamespaceApp\Http\Middleware;useClosure;useIlluminate\Http\Request;/*** xss中间件* Class XSSProtectionMiddleware*@packageApp\Http\Middleware*/classXSSProtectionMiddleware{/*** Handle an incoming request.**@param\Illuminate\Http\Request $request*@param\Closure $next*@returnmixed*/publicfunctionhandle(Request $request, Closure $next){$input = $request->all();array_walk_recursive($input,function(&$input){$input = xss_encode($input);});$request->merge($input);return$next($request);}}
​

在bootstrap下的app.php里面增加认证中间件

// 认证中间件$app->routeMiddleware(['auth'=> App\Http\Middleware\Authenticate::class,'xss'=> App\Http\Middleware\XSSProtectionMiddleware::class,//xss中间件'language'=> App\Http\Middleware\LanguageMiddleware::class,]);

在路由routes下引入xss中间件

/*** 全局接口*/$router->group(['as'=>'guest','middleware'=> ['xss','throttle:20,3','black_list','request_ip_route',],],function()use($router){$router->post('/token','TokenController@getToken');//游客token});

相关阅读: 

网站被攻击怎么办? 

DDOS攻击如何溯源?怎么找到攻击者?

Ref:

https://mp.weixin.qq.com/s/bmD7AMCHkP6AWujlSYKdXw

https://mp.weixin.qq.com/s/u0OlDinAK3SHVioWj_8gvg

图像通讯
图标主要
通讯

订阅我们的时事消息

单击按钮即表示您同意我们的条款和条件