XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
- 1.反射性XSS;
- 2.存储型XSS;
- 3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
- 输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
- 输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
反射型xss(get)
题目如下:
尝试输入最简单的xss代码,作用是让浏览器弹窗,弹窗内容为xss
<script>alert(/xss/)</script>
发现只粘贴进了一部分,没有完全粘贴进去
打开查看器,发现在前端代码里输入框限制了输入长度,最大输入为20个字符
修改maxlength的值,重新输入xss代码,代码执行成功,同时注意到传入的值出现在url中,说明是通过get方式传值的,所以属于get反射型xss
反射性xss(post)
首先是个登录框,尝试xss无果后,用admin 123456登录进去,发现一个和之前一样的输入框。.
输入xss代码后抓包查看,发现传入的是post数据
和之前一样,直接插入xss语句即可,只是使用了post传递值的形式,在url中不可见
存储型xss
题目是一个留言板,存储型xss常见于留言板之类的地方,因为这些地方会将用户输入的数据存储在数据库,如果存在xss,除非删除数据库数据,否则无法清除
输入代码
<script>alert(/xss/)</script>
弹窗成功,然后每刷新一次,都会弹窗,这就是存储型xss的特征
DOM型xss
我们可以把DOM理解为一个一个访问HTML的标准的编程接口。DOM是一个前端的接口,并没有和后端做任何的交互。
输入代码为:
'><img src="#" onmouseover="alert('xss')">
输入后页面出现一个图片,鼠标移动到图片上,就会触发xss
原理我们要打开查看器来分析
这是输入之前的源码,我们随便输入一个123,找到123在代码中的位置
可以看到<a href =“123”>,如果将123换成我们之前输入的pyload,就变成了下面这样:
<a href ="'><img src="#" onmouseover="alert('xss')">"
首先闭合了a标签,然后又写入了一个img标签,接触图片就触发弹窗。
DOM型xss-x
pyload和上面的一样
点击后出现下图的超链接
点击超链接后出现图片
鼠标移动到图片上弹出窗口
原理也和之前差不多,都是闭合前面的标签,再构造一个新的标签
xss盲打
所谓盲打就是插入的内容,不会在前端显示,所以我们不能在前端看到相应的反馈,而是将payload插入到后台,如果后台没有对xss进行过滤,那么后台就会被插入,可以获得管理员的cookie等。
右上角的提示中告诉了我们后台登录地址
输入弱口令 admin 123456
进入后台,直接触发弹窗
xss之过滤
输入普通的代码,弹窗失败,是因为代码中有东西被过滤了
大小写绕过
<ScriPT>alert(/xss/)</ScriPT>
xss之htmlspecialchars
htmlspecialchars会对一些符号编码成HTML编码。从而防止xss注入。
题目使用的是默认类型,仅编码双引号,于是可以采用单引号闭合前面的标签,使用on事件来绕过,输入下面的pyload
'οnclick=‘alert(/xss/)’
出现超链接
点击超链接,弹窗
xss之href输出
这里牵扯到了js伪协议 参考文章:javascript伪协议
简单来说就是:
我们可以在浏览地址栏里输入"javascript:alert(‘JS!’);",点转到后会发现,实际上是把javascript:后面的代码当JavaScript来执行,并将结果值返回给当前页面。
题目如下:
使用js伪协议,构建payload
javascript:alert(1)
点击超链接,触发弹窗
打开查看器查看这部分代码,发现在href标签中,将alert(1)当做js代码执行了
xss之js输出
前面的’<script>是用来闭合掉前面的script标签的,后面在构造一个弹框
构造payload
'</script><script>alert(1)</script>
构造后的代码为,可以看到 '<script>和前面产生了闭合
<script>
$ms=''</script><script>alert(1)</script>';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
本文部分内容参考文章 ,感觉师傅的分享: pikachu靶场练习通关加知识点总结