《Web 安全入门|XSS 漏洞原理、CSP 策略与 HttpOnly 防护实践》

本文系作者在网络安全渗透测试领域的学习与实践总结,仅作为技术参考资料,文中观点难免存在局限,恳请读者批评指正。

漏洞测试须在合法授权环境进行,可使用自己搭建的靶场或获书面授权的目标系统,否则将担法律责任。

阅读文章请遵守本文《法律与责任声明》

CSP

主要防护的是js脚本文件的加载

内容安全策略是一种可信白名单机制,来限制网站中是否可以包含某来源内容。

该制度明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单,

它的实现和执行全部由浏览器完成,开发者只需提供配置。

举例:

禁止加载外域代码,防止复杂的攻击逻辑。

禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。

禁止内联脚本执行

禁止未授权的脚本执行

实验:

1、设置任何域JS加载

当网站被注入脚本后

这个配置等同于没有做防护

2、设置本地域JS加载

只允许当前域名加载

注意,按ctrl+f5强制刷新网页或者重启浏览器更换浏览器,不然有缓存干扰

此处假设这个x.js文件不在本域

完全没有反应,没有执行脚本文件

可以看到加载js出错了

我们可以看一下控制台的报错

完整中文翻译

加载脚本 http://xxxxxxxxxxx/x.js 违反了内容安全策略(CSP) 指令:script-src 'self'

请注意:script-src-elem 未被显式设置,因此系统回退使用 script-src 作为替代规则。

该操作已被拦截。

(错误来源:csp.php 文件第 1 行)

当我将脚本src地址换成加载本地域名下面的js脚本后

正常弹窗

那如何看目标网站使用的是哪种防护,我们可以看请求响应包

绕过方式:文件上传JS绕过

假设某网站是能够上传脚本的,那么我上传后那么这个脚本就是在本地目录下了就能够加载了

注意:正常有文件上传功能不算漏洞,有文件上传功能并且能够直接上传后门才叫漏洞

3、设置本地域JS外加限制目录

连本地的js文件都不能直接加载了,限制了加载目录

绕过方式:

绕过利用条件1:目录有302跳转绕过

什么叫302跳转,有的网站会搞一些类似容错,当我们访问该网站页面丢失,不存在或者短暂性移走时就会自动跳转到某页面

我们访问某网站后可以根据其特征来判断是否存在重定向,有重定向的话就可以借助来绕过限制

比如

靶场中有302跳转


然后我需修改脚本

绕过利用条件2:文件上传JS(注意:上传到网站指定可加载目录)

http_only防护

专门做cookie防护

一个可以在设置Cookie时使用的标记;当一个Cookie被标记为HttpOnly时,JavaScript无法访问该Cookie,只能通过HTTP(或HTTPS)协议传输。

这一特性有助于防止跨站脚本攻击(XSS),因为攻击者无法通过JavaScript代码窃取存储在 HttpOnly Cookie中的敏感信息。

实验:

同样我们可以通过判断请求和响应来看使用了哪种防护,有两种情况

1、开启HttpOnly时XSS窃取Cookie的加载情况

2、未开启HttpOnly时XSS窃取Cookie的加载情况

先看第一种情况

此处都是ture表示都启用了防护

这里利用脚本输出cookie

上面都没有获取到

然后我们关闭一个

两个防护都关掉

我们还可以再借助某平台来尝试获取

先把cookie防护开了,人家平台准备好后模拟受害者访问触发脚本

然后在平台这边就能看到上线,不过因为我们设置了防护的原因并没有获取到cookie

WAF或代码Filter

除了以上两种配置方式外还可以通过防护软件或者代码层面来防护

这两个也是比较常见的,一般采用人工或者工具两种方式

1、人工分析

黑盒XSS手工分析:

页面中显示的数据找可控的

利用可控地方发送JS代码去看执行加载情况

成功执行即XSS,不能成功就看语句输出的地方显示(过滤)

根据显示分析为什么不能执行(实体化,符号括起来,关键字被删除等)

演示:

此处我们使用某靶场

1、无任何过滤
复制代码
<xxxxx>alert()</xxxxxx>
2、实体化 输入框没有

进入第二关

然后我们在第二关可以看源码用到了实例化限制,这个就是代码类的限制

复制代码
尝试<xxxxxxxxxx>alert(1)</xxxxxx>

被实例化


但我们发现这个输入框里面并没有被实例化

然后我们就借助这个输入框让其闭合然后触发脚本

复制代码
"> <xxxxx>alert()</xxxx> <"


被拼接进去形成闭合触发脚本

我们实战中可以看源码就能知道是不是被实例化了

比如在页面源代码中又看到了输入框的那个标签发现输入框的这个标签里面的内容没有被实例化.

3、全部实体化 利用标签事件 单引号闭合

用前两种方法都不行

按照第二关的方法来发现两个地方都被实例化

那么此处我们就可以利用这个标签形成标签事件

复制代码
' onmouseover=alert() //


然后鼠标移动到输入框

其实此处不只是这种注入语句,还有很多。

4、全部实体化 利用标签事件 双引号闭合

第四关和第三个类似

5、事件关键字过滤 利用其他标签调用 双引号闭合

和第三第四关类似,有一点小区别,给事件过滤了

复制代码
"> <a href=javascript:alert()>xxx</a> <"

点击xxx弹窗

6、利用大小写未正则匹配

这个我们可以看源码,搞了大小写过滤


但是过滤的并不好,所以能绕过(在实战中肯定是严谨的)

复制代码
"> <sCrxxxxx>alert()</sCrxxxx> <"
7、利用双写绕过匹配

我们输入正常的

复制代码
"> <a href=javascript:alert()>xxx</a> <"

发现里面内容变少了,这就是因为加了双写内容匹配

里面使用了单个过滤

此处不够严谨只是单次过滤,假如我们写一个scrscriptipt然后此处会过滤中间的script那么剩下的又正好组成了script,所以要严谨的会需要采用多重过滤

复制代码
"> <a hrehreff=javascrscriptipt:alert()>x</a> <"


但此处假设当它过滤后把script变成了x导致不会凑巧形成script


这就需要找其它方法

8、利用Unicode编码

我们就需要使用编码工具

「标准 HTML 实体 Unicode(十六进制)」


9、利用Unicode编码(内容检测)
复制代码
&#x006a&#x0061&#x0076&#x0061&#x0073&#x0063&#x0072&#x0069&#x0070&#x0074&#x003a&#x0061&#x006c&#x0065&#x0072&#x0074&#x0028&#x0029;('http://')

会对Unicode编码的内容检查,需要在里面添加内容绕过

10、隐藏属性触发闭合
复制代码
<xxxx>alert('xss')</xxxx>&t_sort=" type="text" onclick="alert('xss')

利用浏览器对非法 HTML 实体的容错解析,用&+ 无效属性名&t_sort,把原本被转义、无法执行的<script>恶意代码,"骗" 浏览器重新解析成带onclick事件的可执行 HTML 标签,从而在用户交互时触发alert('xss')这类恶意脚本,实现代码执行。

拆成 3 步,讲明白

  1. 正常情况:后端会拦恶意代码

如果用户直接输入<xxxx>alert('xss')</xxxxx>,后端会做防护:

  • 要么把<转成&lt;,让代码变成纯文本,浏览器不会执行
  • 要么直接过滤<xxxx>标签,让脚本失效
  1. 攻击的关键:用&骗浏览器

攻击者在后面加了&t_sort=" type="text" onclick="alert('xss')

  • &是 HTML 实体的开头,浏览器会尝试解析&t_sort,但这不是合法实体,就会把&保留,把t_sort当成一个不存在的属性
  • 这个操作相当于强行打破了后端的转义 / 过滤上下文,让浏览器重新解析后面的内容
  1. 最终效果:浏览器把代码 "脑补" 成正常标签

浏览器会把整段代码,自动补全成一个完整的输入框标签:

复制代码
<input t_sort="" type="text" onclick="alert('xss')">
  • t_sort是无效属性,浏览器直接忽略
  • type="text"让它变成一个正常的输入框
  • onclick="alert('xss')"变成了点击事件,用户一点页面,就会执行弹窗,攻击成功
11-20

后面还有关卡大家可以先自己去尝试尝试!

2、工具项目

可以借助ai工具,利用大模型绕过防护

在这里插入图片描述

我们可以添加到我们的插件中




此处有四个大模型可用

然后使用apikey放到bp就可以使用了

然后我们抓个包

就比如这个

抓到后发送到插件

然后我们在要注入的地方标注<xss>

然后保存模板,ai分析

然后就会跑出来各种

此处因为要注意的是这个<xss>所要标注的地方要搞对

然后再手工分析,注入即可

还有一个这个不是使用ai,是老牌的一个xss检测工具

可用看一下官方的安装教程使用教程去使用

然后-u加上地址即可(注意地址是有注入点参数的地址)

结语 | 技术之路,与你同行

每一篇文章都是一次沉淀,感谢你的阅读。技术没有捷径,唯有不断积累、不断输出。期待下次继续与你分享更多实战经验,一起前行。

《法律与责任声明》

本内容仅用于网络安全漏洞的技术研究、学习与交流。

一、合法性要求

  • 严格遵守《中华人民共和国网络安全法》及相关法律法规,严禁将所学技术用于非法活动,如未经授权的攻击、窃取信息等。例如,不得对未授权的真实生产环境网站做漏洞测试。
  • 漏洞测试须在合法授权环境进行,可使用自己搭建的靶场或获书面授权的目标系统,否则将担法律责任。

二、风险与责任

  • 若因参考本内容对第三方造成损失,本人不承担法律责任,使用者自行担责。

三、传播限制

  • 禁止将本内容用于恶意传播,如制作恶意教程、培训非法黑客组织,应维护良好网络安全环境。
  • 发现有人利用本内容非法活动,应及时举报。

四、版权声明

本文为本人独立创作,有完整知识产权。未经书面许可,任何单位或个人不得转载、复制或以其他方式使用,违者依法追责。

阅读并使用本文章内容即表示同意声明条款

相关推荐
UXbot2 小时前
2026年AI全链路产品开发工具对比:5款从创意到上线一站式平台深度解析
前端·ui·kotlin·软件构建·swift·原型模式
一拳不是超人2 小时前
前端工程师也要懂的服务器部署知识:从 Nginx 到 CI/CD
服务器·前端
Nova_AI2 小时前
009、AI安全与可信:合规、治理与新兴市场
人工智能·安全
AlkaidSTART2 小时前
TanStack Query 技术指南:异步状态管理核心实践
前端·react.js
加勒比之杰克2 小时前
从阻塞 IO 到 epoll:把 Linux 网络 IO 一次讲透
linux·网络·windows·select·多路转接·epoll·poll
一名优秀的码农2 小时前
vulhub系列-62-dcoffeaddicts(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
种花家的强总2 小时前
前端项目开发/维护中降低成本的方式之一:降低耦合度
前端
Dynadot_tech2 小时前
完成注册的域名可以做什么?
网络·域名·dynadot·网站域名
有代理ip2 小时前
动态IP的安全性优化:策略升级与隐私保护实战指南
网络·网络协议·tcp/ip