XSS漏洞类型解析和学习
漏洞介绍
定义
XSS
本名Cross-Site Scripting
跨站脚本,是攻击者将恶意JavaScript
脚本植入服务器而形成对访问者的攻击。
攻击流程
- 攻击者通过评论区一类的存储点,将写好的
JavaScript
脚本写入服务器。 - 服务器存储后,在用户访问页面时,携带恶意脚本返回给用户。
- 此时恶意代码被执行,用户的信息将会发送到攻击者的服务器,完成攻击。
漏洞详解
原理
- 使用页面元素,比如
<script>JavaScript-Code</script>
包含恶意代码植入,若没有相应的防护,该代码作为呈现部分加入到页面上(评论区),很可能被识别为合法的页面元素执行。
攻击方式
- 攻击方式主要有以下三种:
- 使用
document.cookie
发送用户的cookie
,攻击者可以用来无账号密码登入用户账号。 - 使用
addEventListener
记录键盘输入,其中可能记录密码等秘密信息。 - 构造虚假
DOM
树,插入虚假登录表单,诱骗用户进入自己构造的钓鱼网站。
- 使用
常用语句
- 打印信息
- 发送
cookie
- 页面跳转
- 绕过过滤
onerror(
event
)图片或者视频加载出错时,执行事件event
。
eval
()可以执行Unicode
转义后的语句。
- 鼠标动作执行
onmousemove(
event
)指针在该区域移动时执行事件event
。onmouseover(
event
)指针覆盖该区域时执行事件event
。
- 手动闭合
当插入的语句出现在变量或者其他位置,为了保证语句执行,需要先闭合前一个语句。
漏洞复现
攻击环境
- 根据网上的分类,找到一个比较好的博客,参考图如下。
- 三种分类方法并不是相互冲突的,可以进行组合,为了条理清晰,这里分开介绍(统一使用
JSXSS
)。 - 这里分别使用
DVWA
的DOM
、Reflected
、Stored
展开演示。
DOM
介绍
- 每个页面都有自己的
DOM
树,通过修改DOM
树使得恶意脚本被执行。 DOM
即Document Object Model
文档对象模型,所以后面代码主要注重前端。
Low
代码
- 前端
- 后端
审计
- 前端将
GET
上传的default
参数加入到<select>
元素的选项卡中,每当页面被呈现时,恶意代码就可以运行。 - 后端没有做任何防护,意思就是随便注。
document.location.href.indexOf(str)
返回字符串str
第一个字符的下标。
document.location.href.substring(start, end)
构造下标从start
到end
的子串。
攻击
Medium
代码
审计
- 前端代码没变(之后也应该不变),后端增加了对
<script
的过滤。 - 这里可以使用没有被屏蔽的标签进行注入。
攻击
- 将
<option>
和<select>
标签闭合,保证img
标签可以插入。 Payload
如下
代码
审计
- 设置白名单,只有规定的几种选项可以输入。
- 若不在白名单内,默认设置为
English
。
攻击
防御
代码
审计
- 之前的恶意代码之所以能够运行就是因为在呈现页面元素时,将
URL
中已经编好码的参数使用decodeURI()
解码,解码后的代码才可以执行。 - 前端不解码直接呈现参数
lang
,导致恶意代码编码后无法被解析。
Reflected
介绍
- 攻击者构造恶意链接诱骗受害者点击,受害者点击后便触发恶意代码运行,完成攻击。
Low
代码
审计
- 前端负责输入,后端接收到
name
参数后没有防范措施,直接打印在屏幕上。
攻击
- 直接输入
XSS
语句即可。
Medium
代码
审计
- 使用
str_replace()
函数,将<script>
过滤后打印。
攻击
- 借用
str_replace
的过滤机制,<script>
被替换为空字符串,构造Payload
。
High
代码
审计
- 使用正则表达式过滤法,杜绝了构造
<script>
的方法。 - 黑名单太过单一,可以使用其他标签进行注入。
攻击
- 使用
<img>
元素,Payload
如下。
防御
代码
审计
htmlspecialchars( string
$string
, int$flags
= ENT_COMPAT | ENT_HTML401 , string$encoding
= ini_get("default_charset") , bool$double_encode
=true
) : string将特殊字符转换为HTML
实体。
Stored
介绍
- 攻击者将恶意代码上传到服务器端存储(如评论区),每当服务器展示时,恶意代码都会运行。
Low
代码
审计
- 对
name
和message
参数进行修剪,去除多余字符。 - 在前端页面对
name
的大小限制为10
个字符,对message
限制为50
个字符。 - 使用
stripslashes()
函数对message
进行转义字符过滤,预防SQL
注入。
trim( string
$str
, string$character_mask
= " \t\n\r\0\x0B" ) : string除去以下特殊字符。
字符 意义 " " 空格 "\t" 制表符 "\n" 换行符 "\r" 回车符 "\0" 空字节符 "\x0B" 垂直制表符
攻击
name
限制太大,只能从message
下手,并且没有任何XSS
防御手段,直接键入XSS
语句即可。
Medium
代码
审计
- 使用
addslashes()
函数对message
中的某些字符进行过滤。 - 使用
strip_tags()
函数去除标签。 - 对
name
中的<script>
标签进行屏蔽。
strip_tags( string
$str
, string$allowable_tags
= ? ) : string从字符串str
中去除HTML
和PHP
标签。addslashes( string
$str
) : string在字符串str
中的单引号('
)、双引号("
)、反斜线(\
)与NUL
(null
字符)前,加上反斜线(\
)转义。
攻击
message
这个注入点被完全屏蔽了,但是name
只是简单过滤,于是从name
下手。- 前端对
name
限制了文本长度,打开F12
修改前端限制。 - 使用
name
作为注入点,对<script>
的屏蔽构造Payload
。
High
代码
审计
- 知道
Medium
会放过name
注入后,对<script>
进行了正则表达式的完全屏蔽。
攻击
- 屏蔽了
<script>
标签后,使用其他标签注入XSS
语句即可。
防御
代码
审计
- 日常
check token
。 - 在
Medium
的基础上,对name
施加同message
一样的过滤,使得注入点消失。 - 使用
PDO
机制预防SQL
注入。
__EOF__

本文链接:https://www.cnblogs.com/cheuhxg/p/14473150.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix