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网站漏洞挖掘从入门到精通》