提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
XSS漏洞大家都不陌生,作为最常见的网络安全漏洞之一,随便打开一个搜索网站,都可以找到非常多关于XSS的定义分类以及讲解,但是对于刚开始学习的网络安全小白比如说我来说,总是看了很多但是还一知半解,所以写这篇文章的目的是希望可以用更易于理解的方式来理解到底什么是XSS(当然也是可信考试需要)。XSS(跨站脚本攻击),那么什么是跨站脚本呢?我理解的跨站就是浏览器运行不是本网页的内容,脚本就是JS代码,所以就是网站被注入恶意的脚本了,但是浏览器还傻傻的执行了,就构成了跨站脚本攻击。
一、XSS分类
XSS分为DOM型,反射型和存储型,下面我用几个例子形象地解释一下几种XSS都是什么意思
1.DOM型
要想知道什么是DOM型XSS首先要知道什么是DOM。DOM是和BOM相对的两个概念,DOM全拼为Document Object Model(文档对象模型),JS中通过DOM来对HTML文档进行操作,大家都知道我们平时看到的网页实际上就是由一个个的标签组成的,我们操作标签的时候就是在操作DOM。再通俗点说整个你能操作的区域(红色框框)就是DOM而绿色框框里不能操作的区域就是BOM(个人理解)
图一
理解了什么是DOM接下来可以看一个DVWA中简单级别的DOM型XSS的例子,下面这个网页只有一个很简单的功能就是可以选择语言,假如我们选择English,这个请求参数就会被拼接在在get请求的URL中发送给后端,然后返回的页面就是语言处Endgish被选中了(如下图所示)
那这里的请求的参数既然是我们可以控制的,那假如我们不是选择下拉框里的选项,而是手动在URL处写入一段恶意的JS代码呢?构造拼接在default后面进行一个请求
可以看到页面有弹窗,这说明我i们的JS代码被了浏览器执行了,F12打开控制台查看源代码,可以看到前端有一部分代码是这样的
<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>
可见这段代码的逻辑就是找到URL中defalut后面的内容然后进行一个拼接,然后渲染就成了我们看到的样子。所以说在这个例子中,我们发起请求携带的参数,后端并没有把我们请求的参数放到里面或者做一个处理。后端做的纯纯只是把页面给我们返回回来,返回之后由前端JS的这段代码操作DOM节点。在JS操作的过程中恶意的JS代码也被浏览器执行了,这个过程中,不管是正确返回回来的English还是错误返回的JS恶意代码,都没有经过后端处理。所以这种漏洞称为DOM型XSS,“DOM型XSS不经过后端”的意思也不是和后端没有交互,而是因为参数由前端处理从而触发的XSS。
2.反射型
一个存在反射型XSS的后端代码如下:
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
这段代码使用了模板变量取到name,会把GET请求的name参数直接放在pre标签中,并且没有做任何过滤就返回给前端,name框写入1,返回的数据也的确是Hello 1
构造,网页有弹窗,JS语句被浏览器执行了。
从上面这个例子可以看出触发XSS是因为后端没有对用户输入做任何过滤,把传输的参数直接无脑放在了Hello的后面,如果用户输入的是一段恶意的JS代码也将会被原封不动的返回给前端,返回之后被浏览器执行了就构成了反射型XSS,这种情况和上面一种不同的是他经过了后端的处理之后返回给前端的,只不过后端没做严格的过滤所以JS代码返回前端之后又被浏览器执行了。
3.存储型
这种攻击多见于论坛、博客和留言板。攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器的后端数据库中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到触发。
当用户发表评论之后,这些数据会被存储到数据库中,任何人再次访问和子女和个页面的时候都还是可以看到这些评论,那假如评论一条含有恶意代码的语句,当别人再去访问评论的时候都将会触发存储型XSS。构造和上面相同的payload会触发弹窗,并且关闭弹窗后切换到别的页面再次访问这个评论的页面还是会产生弹窗,课件恶意代码被存进了数据库里,可以造成长久的危害
存储型XSS同样经过了后端,只不过恶意的代码被存储到数据库之中,不是一次性的,将会对任何访问该页面的用户都发起攻击,因此危害更大。
二、XSS可能的注入点,在靶场中可能出现的防御与绕过
1.可能的注入点
1.找数据包的提交点:可能是get请求的URL里面可能是post包里面的字段也可能是某些搜索框。。。这些场景都属于数据包的提交点,可以考虑反射型和存储型,构造payload试试,因为对于反射型和存储型来说都要经过后端,至于后端拿到数据包之后是解析还是过滤还是要不要入库的操作都由后端完成,然后处理完了之后再返回给前端。
2.从XSS漏洞归根结底就是恶意的JS代码被执行了,寻找JS代码可以在哪里被执行的角度出发:首先肯定是script标签里,然后可能是标签的属性,然后就是富文本框,然后可以看看代码规范方面有没有使用模板格式获取变量之类的。。。
3.其他方法:比如在某个输入框或者拦截到的数据包中写入payload或者输入一段文字看返回的页面是否会原样显示那段文字,或者给输入的文字打上标签比如a标签看返回的是不是带有标签的,如果没有也说明这个地方被渲染了,就可能存在XSS
2.常见的防御与绕过手段
1) 初级版:过滤script标签
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
这个例子中过滤规则只是简单地script标签会替换为空这个时候我们可以采取
Action one:双写绕过<sc< script>ript>alert(“x”);</ script>
Action two:大小写绕过< sCrIPt>alert(“x”);</ sCrIpT>
Action three:写在标签属性中等等。。。。。
都可以绕过过滤,触发XSS
2)进阶版:过滤一切形式的script标签
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
这个规则中使用正则表达式,过滤了任何形式的script标签,这个时候我们可以采取将恶意的JS写在标签的属性中
Action:写在标签属性里构造payload:<img src=0 οnerrοr=alert(“xss”)> 也可以触发XSS
3)终极版:把一些特殊字符&、”、 ’、<、>等转换没有任何特殊含义的为 HTML 实体
用这种方法可以防止浏览器将插入的参数作为HTML元素。我们插入的语句并不会被执行,而是会被当成普通的文字,也就没有触发XSS的可能啦
4)其他:白名单黑名单,限制标签属性,URL编码,给cookie设置HTTP only属性等(仅做了解了,还没接触过)
总结
例如:以上就是今天要讲的内容,本文仅仅简单介绍了出血XSS的一些心得,希望可以带给浏览这篇文章的人一点帮助。