前言
今天是代码审计部分的一个技巧补充!前些阵子做了sql注入回顾篇系列!今天开启php代码审计系列!
今天内容主要是CTF中命令注入及绕过的一些技巧!以及构成RCE的一些情景!
正文
在详细介绍命令注入之前,有一点需要注意:命令注入与远程代码执行不同。他们的区别在于,远程代码执行实际上是调用服务器网站代码进行执行,而命令注入则是调用操作系统命令进行执行。 虽然最终效果都会在目标机器执行操,但是他们还是有区别的,基于这个区别,我们如何找到并利用方式也是有所不同的!
代码执行 代码执行的几种方式
${}执行代码 eval assert preg_replace create_function() array_map() call_user_func()/call_user_func_array() array_filter() usort(),uasort()
${}
执行代码
方法:${php代码}
${phpinfo()};
eval()
执行代码
eval('echo 2;');
assert()
普通调用
//?a=phpinfo()<?php assert($_POST['a']);?>
assert
函数支持动态调用
//?a=phpinfo() <?php $a = 'assert'; $a($_POST['a']); ?<i style="color:transparent">本#文来源gaodai$ma#com搞$$代**码网$</i><button>搞代gaodaima码</button>>
php官方在php7中更改了assert
函数。在php7.0.29之后的版本不支持动态调用。
以上两种调用方法在php7.0.29版本之前都测试成功,7.0.29版本之后又动态调用的方法无法成功。
在7.0.29版本之后发现的奇怪的一点
<?php //?a=phpinfo() $a = 'assert'; $a($_POST['a']); ?> //phpinfo()无法执行成功
<?php $a = 'assert'; $a(phpinfo()); ?> //成功执行phpinfo()
preg_replace()
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
preg_replace 执行一个正则表达式的搜索和替换。
执行代码需要使用/e
修饰符。如果不使用/e
修饰符,代码则不会执行
$a = 'phpinfo()'; $b = preg_replace("/abc/e",$b,'abcd');
create_function()
说明
string create_function ( string $args , string $code )
该函数用来创建匿名函数。
这个函数的实现大概是这样的
$b = create_function('$name','echo $name;'); //实现 function niming($name){ echo $name; } $b(yang); niming('yang');
第二个参数是执行代码的地方,将payload放在第二个参数的位置,然后调用该函数就可以执行payload了。
执行代码
$a = 'phpinfo();'; $b = create_function(" ",$a); $b();
上面这种方法是最直接的,接下来看一点有趣的。
自己写的小示例
$id=$_GET['id']; $code = 'echo $name. '.'的编号是'.$id.'; '; $b = create_function('$name',$code); //实现 function niming($name){ echo $name."编号".$id; } $b('sd');