【网络安全】XSS跨站脚本漏洞

1 XSS漏洞原理解析

XSS跨站脚本攻击(Cross Site Scripting,简称为XSS) 是一种针对web网站安全的漏洞攻击技术,恶意攻击者利用网站程序对用户输入过滤不足,在网站中插入对用户有影响的恶意脚本代码(通常是js或html等脚本代码),当用户使用浏览器打开浏览该网页时,恶意代码就会在用户浏览器上执行,从而盗取用户cookie,黑掉网页,导航到恶意网站。

看起来XSS漏洞主要是攻击用户,属于客户端攻击,跟网站服务器的安全并没有直接关系,但是别忘了web网站的管理后台的用户也属于被攻击的用户之一,而管理员用户往往拥有很高的管理权限,可以对网站的后台数据库进行操作。这意味着XSS漏洞可以通过管理员作为“跳板”来达到攻击服务器的目的。

2 XSS攻击类型

XSS攻击主要有三种:

  • 反射型XSS
  • 存储型XSS
  • DOM型XSS

以上几种XSS攻击中,存储型XSS的危害是最大的,要高于反射型和DOM型。

3 反射型XSS

其实XSS漏洞大致可分为两种类型:持久型非持久型,反射型XSS就属于非持久型XSS,具有一次性攻击。

反射型XSS攻击:恶意攻击者通过电子邮件或站内信等方式欺骗诱导用户点击包含XSS代码的恶意URL链接,当用户访问该链接时服务器就会接收到目标用户请求并处理,然后服务器会把带有XSS代码的数据发送给用户的浏览器,浏览器解析了这段XSS代码后就会触发XSS漏洞。

反射型XSS代码通常是存在于URL中,攻击者需要通过欺骗或加密形式将存在恶意代码的连接发送给用户,只有在用户点击后才能触发反射型XSS攻击。

3.1 分析反射型XSS

最常见的反射型XSS就是web网站的搜索框,来看一个简单的反射型XSS漏洞,测试网址为:http://www.test1.com/search.php,输入php进行搜索:
在这里插入图片描述
在搜索框正常里正常输入php搜索,后台会把所有跟php相关的留言展示出来。
在搜索栏中输入:<script>alert("123")</script> ,页面返回结果如下:

浏览器并没有搜索出对应的内容,而是把输入的这段代码当做JS脚本执行了,JS函数alert执行在浏览器弹窗。

分析反射型XSS漏洞代码,search.php文件内容:

<?php
/**
 * Created by TEST
 */
require "./lib/init.php";
header("Content-type:text/html;charset=utf-8");
session_start();
 
if(empty($_GET))
{
    echo "搜索信息为空";
    header('Location: index.php');
}else{
 
    if(isset($_GET["search"])){
 
        $search  = trim($_GET["search"]);
        $sql_comment = "select * from comment where text like '%$search%' order by comment_id";
        $commentSQL = new MySql();
        $commentData = $commentSQL->getAll($sql_comment);
 
        require "./view/search.html";
    }else{
        echo "搜索信息为空!操作失败";
        header("Refresh:3;url=index.php");
    }
}

search.html页面:

search.php文件中的PHP代码通过GET获取search参数中的值,然后通过echo函数输出<script>alert("123")</script>到html页面中,而<script>标签中的代码是可以在html页面中执行的,起作用就是在浏览器中进行弹窗。从这个例子中可以看到反射型XSS的攻击是一次性的,并且XSS攻击代码不会存储,这也是为什么反射型XSS是非持久型的原因。

使用htmlentities函数对搜索框中的内容进行过滤:
在这里插入图片描述
htmlentities函数把用户输入XSS代码当做普通文本内容给过滤掉了,而不是当做JS代码执行。反射型XSS漏洞本质上就是利用了网站对于用户输入的数据过滤不严格,导致用户输入的数据中存在的恶意代码被浏览器直接执行。

4 存储型XSS

前面说过XSS漏洞分为两种:持久型和非持久型。存储型XSS是属于持久型的,其危害程度也是最大的。

为什么存储型XSS是持久型的?
通常只要web网站允许用户存储数据的地方都可能存在持久型XSS,特别是网站的安全防护不到位对于用户输入的数据过滤不严格,攻击者提交一段XSS代码后被服务器存储到数据库或其他形式存储起来。当攻击者再次访问该页面时就会触发存储型XSS。跟前面的反射型XSS相比,存储型XSS不需要用户手动去触发,具有更高的隐蔽性,这也是为什么其危害程度远远高于其他类型的XSS漏洞。

4.1 分析存储型XSS

存储型XSS最常见的场景是在论坛的留言区或评论区,博客的内容发布系统等,攻击者将XSS恶意代码直接插入到文章或留言评论中一起被服务器存储在后台,当用户再次浏览该文章留言时,恶意脚本代码就会在他们的浏览器执行。

还是通过一个示例来分析存储型XSS,测试URL为:http://www.test1.com/pub_comment.php

在留言框中输入一段留言:this a test,在留言后面插入一段XSS代码<script>alert("this is a XSS test")</script>,点击留言提交后,当前页面显示了一个弹窗。

页面中的留言只显示了一部分,通过查看当前页面元素发现浏览器在解析html页面时,只将留言中的this a test一部分作为普通文本数据进行输出了,<script>标签里的内容当做JS代码执行了:
在这里插入图片描述
页面中的留言只显示了一部分,通过查看当前页面元素发现浏览器在解析html页面时,只将留言中的this a test一部分作为普通文本数据进行输出了,而<script>标签里的内容当做JS代码执行了:

总结: 存储型XSS之所以也成为持久型XSS,是因为攻击者将XSS代码插入到留言中一起被服务器数据库保存,用户在浏览这条留言时,浏览器不会把XSS代码随着留言一起展示给用户,而是把XSS代码当做正常的JS代码正常执行,所以存储型XSS更加具有隐蔽性。

5 DOM型XSS

DOM全称为Document Object Model,文档对象模型,DOM通常用于在HTML,XML,XHTML中的对象。DOM型XSS其实是一种基于DOM文档对象模型的反射型XSS,它不需要于服务器交互,DOM型XSS只发生在浏览器客户端处理数据的时候。

DOM型XSS通常是由攻击者构造一个隐藏XSS代码的URL恶意链接,当用户浏览器访问该URL链接时,DOM对象就会处理XSS代码,触发DOM型XSS漏洞。

5.1 分析DOM型XSS

通过DVWA靶机平台来分析DOM型XSS,需要注意的是:DOM型XSS代码只有HTML代码,并不需要和服务器交互:

<div class="vulnerable_code_area">
 
 		<p>Please choose a language:</p>
 
		<form name="XSS" method="GET">
			<select name="default">
				<script>
					if (document.location.href.indexOf("default=") >= 0) {
						var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
						document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
						document.write("<option value='' disabled='disabled'>----</option>");
					}
					    
					document.write("<option value='English'>English</option>");
					document.write("<option value='French'>French</option>");
					document.write("<option value='Spanish'>Spanish</option>");
					document.write("<option value='German'>German</option>");
				</script>
			</select>
			<input type="submit" value="Select" />
		</form>
	</div>

当点击“选择”按钮时,就会执行<script>标签中的代码,这是一个DOM操作,通过document对象获取href属性判断URL(http://www.dvwa.com/vulnerabilities/xss_d/)中“default=”字符串出现的位置,如果default有默认值,那么if判断结果是大于0的,接着就截取“default=”后面的值并且替换到option框中。

值得注意的是if判断语句里对于用户输入的数据并没有做任何的安全过滤,而是直接替换,这可能会产生DOM型XSS。


在“default=”字符串后面添加XSS代码:<script>alert("XSS TEST")</script>,然后回车,页面弹窗说明是存在DOM型XSS的。

参考资料

《Web安全深度剖析》
《Web安全攻防:渗透测试实战指南》
《XSS跨站脚本漏洞精讲/原理/绕过/防御》
《PHP网站漏洞挖掘从入门到精通》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值