企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
# 计动态函数执行与匿名函数执行 一:动态函数执行: 函数与函数之间的调用,可能会造成的漏洞。 ``` <pre class="calibre10">``` <span class="token5">function</span> <span class="token4">a</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token2">"a"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">function</span> <span class="token4">b</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token2">"b"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token5">function</span> <span class="token4">c</span><span class="token3">(</span>$param<span class="token3">)</span><span class="token3">{</span> echo <span class="token2">"c"</span><span class="token3">;</span> $<span class="token4">param</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token4">c</span><span class="token3">(</span>$<span class="token4">_GET</span><span class="token3">(</span><span class="token2">'c'</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>localhost<span class="token1">?</span>c<span class="token1">=</span>a <span class="token">//容易执行敏感的系统函数</span> http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>localhost<span class="token1">?</span>c<span class="token1">=</span>phpinfo ``` ``` 二:匿名函数执行: 匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定 名称的函数。最经常用作回调函数(callback)参数的值。 create\_function 创建匿名函数(PHP 7.2.0被废弃) create\_function()函数会在内部执行 eval() 在代码审计中,主要用来查找项目中的代码注入和回调后门的情况 例子 ``` <pre class="calibre10">``` <span class="token4">error_reporting</span><span class="token3">(</span><span class="token6">0</span><span class="token3">)</span><span class="token3">;</span> $sort_by <span class="token1">=</span> $_GET<span class="token3">[</span><span class="token2">'sort_by'</span><span class="token3">]</span><span class="token3">;</span> $sorter <span class="token1">=</span> <span class="token2">'strnatcasecmp'</span><span class="token3">;</span> $databases<span class="token1">=</span><span class="token4">array</span><span class="token3">(</span><span class="token2">'1234'</span><span class="token3">,</span><span class="token2">'4321'</span><span class="token3">)</span><span class="token3">;</span> $sort_function <span class="token1">=</span> <span class="token2">' return 1 * '</span> <span class="token3">.</span> $sorter <span class="token3">.</span> <span class="token2">'($a["'</span> <span class="token3">.</span> $sort_by <span class="token3">.</span> <span class="token2">'"], $b["'</span> <span class="token3">.</span> $sort_by <span class="token3">.</span> <span class="token2">'"]);'</span><span class="token3">;</span> <span class="token4">usort</span><span class="token3">(</span>$databases<span class="token3">,</span> <span class="token4">create_function</span><span class="token3">(</span><span class="token2">'$a, $b'</span><span class="token3">,</span> $sort_function<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token1">?</span><span class="token1">></span> ``` ``` ``` <pre class="calibre10">``` http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>localhost<span class="token1">/</span>test<span class="token1">/</span><span class="token6">1.</span>php<span class="token1">?</span>sort_by<span class="token1">=</span>'"<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span><span class="token3">}</span><span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">/* </span> ``` ``` 还原实际的组合过程: ``` <pre class="calibre10">``` $sort_function <span class="token1">=</span> <span class="token2">' return 1 * '</span> <span class="token3">.</span> $sorter <span class="token3">.</span> <span class="token2">'($a["'</span> <span class="token3">.</span> $sort_by '"<span class="token3">]</span><span class="token3">)</span><span class="token3">;</span><span class="token3">}</span><span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">/* </span> ``` ``` 匿名函数实际的执行: ``` <pre class="calibre10">``` <span class="token5">function</span> <span class="token4">niming</span><span class="token3">(</span>$a<span class="token3">,</span>$b<span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> <span class="token6">1</span> <span class="token1">*</span> <span class="token2">' . $sorter . '</span><span class="token3">(</span>$a<span class="token3">[</span><span class="token2">"' . $sort_by '"</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span><span class="token3">}</span><span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">/* } </span> ``` ``` 回车换行整理一下: ``` <pre class="calibre10">``` <span class="token5">function</span> <span class="token4">niming</span><span class="token3">(</span>$a<span class="token3">,</span>$b<span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> <span class="token6">1</span> <span class="token1">*</span> <span class="token2">' . $sorter . '</span><span class="token3">(</span>$a<span class="token3">[</span><span class="token2">"' . $sort_by '"</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">/* } </span> ``` ``` ### 案例 2 `2.php` ``` <pre class="calibre10">``` <span class="token1"><</span><span class="token1">?</span>php $c<span class="token1">=</span>$_GET<span class="token3">[</span><span class="token2">'c'</span><span class="token3">]</span><span class="token3">;</span> $lambda<span class="token1">=</span><span class="token4">create_function</span><span class="token3">(</span><span class="token2">'$a,$b'</span><span class="token3">,</span><span class="token2">"return (strlen($a)-strlen($b)+"</span> <span class="token3">.</span> <span class="token2">"strlen($c));"</span><span class="token3">)</span><span class="token3">;</span> $array<span class="token1">=</span><span class="token4">array</span><span class="token3">(</span><span class="token2">'reall long string here,boy'</span><span class="token3">,</span><span class="token2">'this'</span><span class="token3">,</span><span class="token2">'midding lenth'</span><span class="token3">,</span><span class="token2">'larget'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">usort</span><span class="token3">(</span>$array<span class="token3">,</span>$lambda<span class="token3">)</span><span class="token3">;</span> <span class="token4">print_r</span><span class="token3">(</span>$array<span class="token3">)</span><span class="token3">;</span> <span class="token1">?</span><span class="token1">></span> ``` ``` `payload`的构造: ``` <pre class="calibre10">``` http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>localhost<span class="token1">/</span>test<span class="token1">/</span><span class="token6">2.</span>php<span class="token1">?</span>c<span class="token1">=</span><span class="token6">1</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span><span class="token3">}</span><span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">/* </span> ``` ``` 还原实际的组合过程: ``` <pre class="calibre10">``` $lambda<span class="token1">=</span><span class="token4">create_function</span><span class="token3">(</span><span class="token2">'$a,$b'</span><span class="token3">,</span><span class="token2">"return (strlen($a)-strlen($b)+"</span> <span class="token3">.</span> <span class="token2">"strlen(1));}phpinfo();/*));"</span><span class="token3">)</span><span class="token3">;</span> ``` ``` 匿名函数实际的执行: ``` <pre class="calibre10">``` <span class="token5">function</span> <span class="token4">ft</span><span class="token3">(</span>$a<span class="token3">,</span>$b<span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> <span class="token3">(</span><span class="token4">strlen</span><span class="token3">(</span>$a<span class="token3">)</span><span class="token1">-</span><span class="token4">strlen</span><span class="token3">(</span>$b<span class="token3">)</span><span class="token1">+</span><span class="token2">" . "</span><span class="token4">strlen</span><span class="token3">(</span><span class="token6">1</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span><span class="token3">}</span><span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">/*)); } </span> ``` ``` 回车换行整理一下: ``` <pre class="calibre10">``` <span class="token5">function</span> <span class="token4">ft</span><span class="token3">(</span>$a<span class="token3">,</span>$b<span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> <span class="token3">(</span><span class="token4">strlen</span><span class="token3">(</span>$a<span class="token3">)</span><span class="token1">-</span><span class="token4">strlen</span><span class="token3">(</span>$b<span class="token3">)</span><span class="token1">+</span><span class="token2">" . "</span><span class="token4">strlen</span><span class="token3">(</span><span class="token6">1</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">/*)); } </span> ``` ``` ``` <pre class="calibre10">``` $id<span class="token1">=</span>$_GET<span class="token3">[</span><span class="token2">'id'</span><span class="token3">]</span><span class="token3">;</span> <span class="token">//$c();</span> $lambda<span class="token1">=</span><span class="token4">create_function</span><span class="token3">(</span><span class="token2">'$a,$b'</span><span class="token3">,</span><span class="token2">'return ( strlen($a) - strlen($b)+'</span><span class="token3">.</span><span class="token2">"strlen($id) );"</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$lambda<span class="token3">)</span><span class="token3">;</span> $arr<span class="token1">=</span><span class="token4">array</span><span class="token3">(</span><span class="token2">'reall long string here,body'</span><span class="token3">,</span><span class="token2">'this'</span><span class="token3">,</span><span class="token2">'midding length'</span><span class="token3">,</span><span class="token2">'larget'</span><span class="token3">)</span><span class="token3">;</span> <span class="token4">usort</span><span class="token3">(</span>$arr<span class="token3">,</span>$lambda<span class="token3">)</span><span class="token3">;</span> <span class="token4">print_r</span><span class="token3">(</span>$arr<span class="token3">)</span><span class="token3">;</span> <span class="token">//http://www.test.com/audit/test.php?id=1</span> <span class="token">//相当于</span> <span class="token5">function</span> <span class="token4">lambda</span><span class="token3">(</span>$a<span class="token3">,</span>$b<span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> <span class="token3">(</span> <span class="token4">strlen</span><span class="token3">(</span>$a<span class="token3">)</span> <span class="token1">-</span> <span class="token4">strlen</span><span class="token3">(</span>$b<span class="token3">)</span><span class="token1">+</span><span class="token4">strlen</span><span class="token3">(</span><span class="token6">1</span><span class="token3">)</span> <span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//http://www.test.com/audit/test.php?id=1));}phpinfo();/*</span> <span class="token">//相当于</span> <span class="token5">function</span> <span class="token4">lambda</span><span class="token3">(</span>$a<span class="token3">,</span>$b<span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> <span class="token3">(</span> <span class="token4">strlen</span><span class="token3">(</span>$a<span class="token3">)</span> <span class="token1">-</span> <span class="token4">strlen</span><span class="token3">(</span>$b<span class="token3">)</span><span class="token1">+</span><span class="token4">strlen</span><span class="token3">(</span><span class="token6">1</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span><span class="token3">}</span><span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token1">/</span><span class="token1">*</span> <span class="token3">)</span> <span class="token3">}</span> ``` ``` ![](https://img.kancloud.cn/91/79/9179123d33d6aa0abfc33190c98a223b_1014x477.png) 上面的换成单行注释就不会报错 ``` <pre class="calibre10">``` http<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>www<span class="token3">.</span>test<span class="token3">.</span>com<span class="token1">/</span>audit<span class="token1">/</span>test<span class="token3">.</span>php<span class="token1">?</span>id<span class="token1">=</span><span class="token6">1</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span><span class="token3">}</span><span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">//</span> 可知:最后结果是 <span class="token5">function</span> <span class="token4">lambda</span><span class="token3">(</span>$a<span class="token3">,</span>$b<span class="token3">)</span><span class="token3">{</span> <span class="token5">return</span> <span class="token3">(</span> <span class="token4">strlen</span><span class="token3">(</span>$a<span class="token3">)</span> <span class="token1">-</span> <span class="token4">strlen</span><span class="token3">(</span>$b<span class="token3">)</span><span class="token1">+</span><span class="token4">strlen</span><span class="token3">(</span><span class="token6">1</span><span class="token3">)</span><span class="token3">)</span><span class="token3">;</span><span class="token3">}</span><span class="token4">phpinfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span><span class="token">// )}</span> ``` ``` 总结:create\_function和eval最好别用,至少用户不能决定输出的内容