php命令执行总结

linux基础

常用命令

1
2
3
4
5
6
7
8
9
10
11
pwd:返回当前的工作目录

ls :即英文单词list的缩写,列出指定目录的所有文件名或者文件夹名(默认为当前工作目录下)
-a 显示指定目录下所有子目录与文件,包括隐藏文件
-l 以列表的方式显示文件的详细信息

clear:清屏,clear作用为清除终端上的显示
cd:切换工作目录
mkdir:创建目录
touch:创建文件
rm:删除文件,加上 -r 删除一切,为了防止文件误删,可以在rm后使用-i参数以逐个确认要删除的文件

1
cp:拷贝文件或者目录(注:cp 只能拷贝空文件夹或者文件,若想递归拷贝则使用 -r 选项)

1
2
3
4
5
6
7
mv:剪切或者重命名,用户可以使用mv命令来移动文件或目录,也可以给文件或目录重命名
-f 禁止交互式操作,如有覆盖也不会给出提示
-i 确认交互方式操作,如果mv操作将导致对已存在的目标文件的覆盖,系统会询问是否重写,要求用户回答以避免误覆盖文件
-v 显示移动进度

移动文件 mv xxx.txt 目录
重命名 mv xxx.txt new.txt

PHP相关函数

代码执行类

eval:将字符串内容作为php代码执行

assert:检查一个断言是否为 FALSE,用法与eval类似

create_function:创建一个匿名函数,第一个参数为参数名,第二个参数为函数内容(不过在php7.2后被废弃了)

比如

1
2
3
4
5
create_function('$a','echo "123";')  
相当于
function a($a) {
echo123”;
}

1
2
3
4
5
create_function('$a','echo "123";}echo "666";//') 
相当于
function a($a) {
echo123”;}echo "666";//
}

preg_replace:执行一个正则表达式的搜索和替换

语法:

1
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

如果在构造正则表达式的时候,使用了 /e 修饰符,preg_replace会将replacement 参数当作PHP代码执行

不过在php5.5后/e 修饰符已经被弃用了,在php7.0后不再支持 /e修饰符

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

1
call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )

call_user_func_array:把第一个参数作为回调函数(callback)调用,把参数数组作(param_arr)为回调函数的的参数传入

1
call_user_func_array ( callable $callback , array $param_arr )

命令执行类

exec:执行一个外部程序,但不会输出全部结果,而是返回结果的最后一行

语法:

1
exec ( string $command [, array &$output [, int &$return_var ]] ) : string

passthru:执行外部程序并且显示原始输出,类似exec,但其不返回结果,不用使用echo查看结果

system:执行外部程序,并且显示输出,与passthru基本相同,但system返回结果

shell_exec:通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回(类似于反引号)

xxx反引号包括的内容会被当成系统命令

popen: 打开进程文件指针

语法:

1
popen ( string $command , string $mode )

proc_open:执行一个命令,并且打开用来输入/输出的文件指针

0 表示标准输入,1 表示标准输出,2 表示标准错误

命令执行漏洞绕过

命令操作符

管道操作符 cmd1|cmd2,将cmd1的结果输出给cmd2

&和号操作符 cmd1&cmd2,让命令在后台执行

;分号操作符 cmd1;cmd2,执行多条命令

&&与操作符 cmd1&&cmd2,只有cmd1执行成功后cmd2才会执行

||或操作符 cmd1||cmd2,只有cmd1执行失败cmd2才会执行

空格绕过

字符串连接

IFS(内部域分隔),是shell的内置变量,是一个用于分割字段的字符列表,默认值是空白(包括空格、tab、换行)

使用{}

使用tab

1
?cmd=cat%09/etc/passwd

在读取文件时使用重定向符<>

黑名单关键字绕过

字符串拼接

1
a=c;b=at;c=she;d=ll.php;$a$b ${c}${d}

利用环境变量

1
${SHELLOPTS:3:1}at${IFS}shell.php

使用空变量

1
cat sh${x}ell.php

利用linux通配符?*

使用反斜杠

\在bash中被解释为转义字符,用于去除一个单个字符的特殊意义,它保留了跟随在之后的字符的字面值,除了换行符

使用base64编码

命令执行漏洞防御

(1)对参数进行严格的过滤

(2)设置命令执行函数参数白名单,结合正则表达式来进行白名单限制