目录

Web安全之命令执行漏洞


1. 命令执行漏洞介绍

当应用程序调用了可执行系统命令的函数,且攻击者可控制参数时,攻击者就可以将恶意的系统命令拼接到正常的命令中,从而在服务端执行任意命令,形成命令执行漏洞。

除了命令执行漏洞,代码执行漏洞也能达到命令执行漏洞的效果,两者的区别在于,命令执行是直接执行操作系统的命令,而代码执行是间接的通过执行当前程序语言的代码,调用可执行系统命令的函数,达到命令执行的效果。


2. 基础知识

  • 各个系统的常用命令

  • 连接符的使用

    • &:在Windows中,代表顺序执行每条命令,无论前面命令执行是否成功。在Linux中,代表将当前命令以后台执行

      1
      2
      3
      4
      5
      6
      
      # Windows
      whoami & dir			# 前一条命令执行成功,接着执行第二条命令
      command & dir			# 前一条命令执行失败,依然执行第二条命令
      
      # Linux
      ping 127.0.0.1 & ls		# ping命令将在后台执行
      
    • &&:顺序执行每条命令,当前面命令执行失败时停止执行后续的命令

      1
      2
      3
      4
      5
      6
      7
      
      # Windows
      whoami && dir			# 前一条命令执行成功,接着执行第二条命令
      command && dir			# 前一条命令执行失败,停止执行第二条命令
      
      # Linux
      whoami && ls			# 前一条命令执行成功,接着执行第二条命令
      test_command && ls		# 前一条命令执行失败,停止执行第二条命令
      
    • |:管道符,将前面命令的输出结果传递到后面命令中进行处理。

      1
      2
      3
      4
      5
      6
      
      # Windows
      dir | find ".exe"		# 找到dir结果中所有以.exe结尾的
      
      # Linux
      ls | cat				# 将ls的结果用cat打印出来
      ls /etc/ | grep apache	# 找到/etc/下所有包含apache的文件或目录
      
    • ||:顺序执行每条命令,当前面命令执行成功时停止执行后续的命令

      1
      2
      3
      4
      5
      6
      7
      
      # Windows
      whoami || dir			# 前一条命令执行成功,停止执行第二条命令
      command || dir			# 前一条命令执行失败,继续执行第二条命令
      
      # Linux
      whoami && ls			# 前一条命令执行成功,停止执行第二条命令
      test_command && ls		# 前一条命令执行失败,继续执行第二条命令
      
    • ;:在Linux下,代表顺序执行每条命令,无论前面命令执行是否成功,与**&**在Windows下的作用一样。但在Windows中,该符号用来隔离多个目标的。

      1
      2
      3
      4
      5
      6
      7
      
      # Linux
      whoami;ls			# 前一条命令执行成功,继续执行第二条命令
      test_command;ls		# 前一条命令执行失败,依然执行第二条命令
            
      # Windows
      dir c:\;d:\;e:\;	# 当路径都正确时,输出他们的文件信息
      dir c:\;d:\;p:\;	# 当某一个路径不正确时,输出错误信息
      

3. PHP命令执行(待测试)

常用的命令执行函数

  • system()

  • exec()

  • passthru()

  • shell_exec()

  • 反引号 ``

  • ob_start()

  • popen()

  • proc_open()

  • pcntl_exec()


4. 绕过

  • 当看不到回显时,利用> command.txt命令将输出内容写入文件,然后再访问command.txt查看输出内容。

  • 在Windows下,如果目标系统使用黑名单限制执行的命令,可以利用;分号绕过。例如;whoami


5. 防御

  • 尽量不使用可执行系统命令的函数

  • 对参数进行严格的检查、过滤、转义

  • 使用白名单限制可执行的命令

  • 禁止不需要的的危险函数,可在php的配置文件中设置disable_functions