XSS 又称CSS(Cross Site Scripting)或跨站脚本攻击,攻击者在网页中插入由JavaScript编写的恶意代码,当用户浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。
test
xss
xss
xss
xss
标签定义 HTML 页面中的图像。
标签定义声音,比如音乐或其他音频流。
这个需要借助url编码来实现绕过
原代码:
DIV
经过url编码:
DIV<%2fdiv>
object标签
data 协议使用方法:data:资源类型;编码,内容
这个需要借助 data 伪协议和 base64 编码来实现绕过
script标签
p标签
xss
xss
xss
xss
input标签
标签规定了用户可以在其中输入数据的输入字段。
onfocus 事件在对象获得焦点时发生
input 标签的 autofocus 属性规定当页面加载时 元素应该自动获得焦点。可以通过autofocus属性自动执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发
details标签
标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭 元素时触发:
select标签
form标签
body标签
标签定义文档的主体。
四、xss 常见绕过
编码绕过
浏览器对 XSS 代码的解析顺序为:HTML解码 —— URL解码 —— JS解码(只支持UNICODE),所以编码顺序就要反着来
关于转码和编码直接用chatgpt就可以了,都可以进行转化;对于已经编码的东西要转化为字符串,也可以用python脚本:直接print就可以了
print("\u0061\u006c\u0065\u0072\u0074(1)")
1.html 实体编码
当可控点为单个标签属性时,可以使用 html 实体编码。
test
2. url 编码
当注入点存在 href 或者 src 属性时,可以使用 url 编码。
test
test
Payload
test
test
注:url 解析过程中,不能对协议类型进行任何的编码操作,所以 javascript: 协议头需要保留。
test
test
可以二次编码
test
test
3. js 编码(unicode编码)
只能解析有效标识符和字符串,想括号这些解析完是不能被是识别执行的
js 编码策略:
①“” 加上三个八进制数字,如果个数不够,前面补0,例如 “<” 编码为 “\074”
②“\x” 加上两个十六进制数字,如果个数不够,前面补0,例如 “<” 编码为 “\x3c”
③“\u” 加上四个十六进制数字,如果个数不够,前面补0,例如 “<” 编码为 “\u003c”
Payload
Unicode 编码
4.八进制和十六进制
编码使用时需要 eval、setTimeout等函数传递变量,并且可以对整个传递参数进行编码。例如 eval(“alert(1)”),可以对 “alert(1)” 整个进行八进制、十六进制或者 Unicode 编码(双引号不参与)。
setTimeout() 是属于 window 的方法,该方法用于在指定的毫秒数后调用函数或计算表达式。
语法:setTimeout(要执行的代码, 等待的毫秒数)
setTimeout(JavaScript 函数, 等待的毫秒数)
alert(1)=\x61\x6C\x65\x72\x74\x28\x31\x29
=\141\154\145\162\164\050\061\051
=\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029
1.
2.
3.
1.
2.
3.
5. 混合编码
test
Payload
test
html 编码
test
Unicode 编码
test
注:Unicode 编码不能对括号使用
url 编码
test
由于浏览器对 xss 代码的解析过程是:html解析 —— url解析 —— js解析,所以可以编码方式进行组合绕过。
1.源代码
test
2.对alert进行JS编码(unicode编码)
test
3.对href标签中的\u0061\u006c\u0065\u0072\u0074进行URL编码
test
4.对href标签中的javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)进行HTML编码:
test
注:href、src等加载url的属性可以使用三种混合编码,on事件可以使用html实体编码和js编码混合,但url编码在on事件中不会解析。
6.base64 编码
base64 编码通常需要使用到 data 伪协议。
data 协议使用方法:data:资源类型;编码,内容
base64编码内容为
PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4=
通常与 base64 编码配合 data 协议的标签有 :
1.object
2.href
test
#(新版浏览器不支持)
3.iframe
4.embed
atob 函数
atob() 方法用于解码使用 base-64 编码的字符串。
语法:window.atob(encodedStr)(encodedStr: 必需,是一个通过 btoa() 方法编码的字符串)
1.test
2.test
3.test
4.
5.
6.
7. ascii 编码
ascii 编码一般配合String.fromCharCode使用。
alert(1)
十进制:97, 108, 101, 114, 116, 40, 49, 41
十六进制:0x61, 0x6C, 0x65, 0x72, 0x74, 0x28, 0x31, 0x29
十进制
test
十六进制
test
空格过滤绕过
A位置可填充 /,/123/,%09,%0A,%0C,%0D,%20 B位置可填充 %09,%0A,%0C,%0D,%20 C位置可填充 %0B,/**/,如果加了双引号,则可以填充 %09,%0A,%0C,%0D,%20 D位置可填充 %09,%0A,%0C,%0D,%20,//,>
圆括号过滤绕过
1. 反引号替换
2. throw 绕过
单引号过滤绕过
1. 斜杠替换
2. 反引号替换
alert 过滤绕过
1. prompt 替换
2. confirm 替换
3. console.log 替换
4. document.write 替换
5. base64 绕过
关键词置空绕过
1. 大小写绕过
2. 嵌套绕过
ript>alert(/xss/) ript>
函数拼接
1. eval
2. top
3. window
4. self
5. parent
6. frames
#(1)必须放在后面拼接,否则在dvwa中执行不了
7. 常用函数
赋值拼接
火狐IE专属
拆分法
当 Web 应用程序对目标用户的输入长度进行了限制时,这时无法注入较长的xss攻击向量,但是特定情况下,这种限制可以通过拆分法注入的方式进行绕过。
")'
通过上面的拆分法可以拼凑出下面完整的攻击向量:
document.write(“”)
绕过 waf 拦截
安全狗
http://www.safedog.cn/index/privateSolutionIndex.html?tab=2
http://www.safedog.cn/index/privateSolutionIndex.html?tab=2
D盾
http://www.d99net.net/News.asp?id=126
http://www.d99net.net/News.asp?id=126
云锁+奇安信 waf
http://www.yunsuo.com.cn/ht/dynamic/20190903/259.html?id=1
http://www.yunsuo.com.cn/ht/dynamic/20190903/259.html?id=1