CTF_第五节-PHP命令执行

一、什么是命令执行

上一章,已经知道了一个危险函数 system 现在我们来深入掌握一下 CTF 中的命令执行。
CTF 中,命令执行一般是指目标服务器上的命令执行,也就是远程命令执行。

英文缩写为 RCE ,可以理解为

  • Remote Command Exec
  • Remote Cond Exec

这里有两种情况可以是Command执行,比如利用 systeminfo 命令查看系统信息,这里的 systeminfo 就是系统的Command,也就是code,代表的是直接执行我们传入的代码。


二、PHP中的Command Exec函数

在PHP中,官方有下面6种函数可以执行系统命令

  • system
  • passthru
  • exec
  • shell_exec
  • popen
  • pcntl_exec
  • 执行运算符 `(反引号) 就是 shell_exec 的简写

这些函数的共同特点技师可以执行系统命令,只是返回值、参数个数、参数位置不同而已。
这里所说的系统命令,和php所在的服务器的操作系统密切相关。
windows 服务器上,我们可以执行windows系统命令或者程序名称,例如calc、bat、vab等等。
Linux/Unix服务器上,我们可以执行Linux系统命令,例如cat、cp、nc等等。


三、PHP的命令执行利用

PHP的命令执行,我们默认讨论的是服务器操作系统为Linux下的情况。

比如 ping -c 1 www.baidu.com

在命令执行有下面集中可能

  • 命令可控,比如可以控制 ping 这个字符串
  • 参数可控 -c 可控
  • 参数值可控 1www.baidu.com 可控
  • 整体可控,但是要突破过滤

我们遇到命令执行,需要首先判断 可控位置 ,然后针对性的绕过

参数值可控

代码很简单,就是一个列目录,我么好传入一个参数 dir ,如果没有传入,则默认执行ls,现在传入其他命令来看看获取 敏感信息

但是要注意的是,在 linux 下两个命令放在一起要用特殊的符号来分割,如

  • && 并列执行,短路 URL编码为 %26%26
  • || 前后两条命令有一个执行成功就可以 URL编码为 %7c%7c
  • ; 独立的两条命令执行 URL编码为 %3b

这个例子可以使用

1
2
POST
?/dir=;cat flag.php

这个Payload来获取敏感信息

命令可控

下一个例子

代码里多了一句 “ >/dev/null 2>&1”
只需要记住这个就是不给回显就好了

使用刚才说的 命令分割符号 来构建Payload
%09 代替空格

1
2
POST
cmd=tac%09flag.php;whoami

整体可控

1、黑名单过滤

(1)代替过滤的情况

这个属于直男型过滤,认为我只要吧关键字替换为空,那么就安全了
绕过也很简单,双写绕过即可,不如替换cat字符串为空,
所以可以直接提交 ccatat ,替换后,就变成 cat
虽然简单,但是实战中经常遇到。
利用条件也是仅仅替换为空,如果替换为其它字符串,大概率就走不通了,不如替换为 ABCcctata 替换后为 cABCat, 命令就会出错

(2)过滤特殊字符串(例如flag)的请况

当我们要读取 falg 时,遇到过滤了 flag 的关键字,我们可以使用通配符绕过。
通配符我们只需要掌握两个符号即可 问号?星号*

* 星号表示任意长度的字符,最常见的一条命令处理多个文件
比如:批量 删除、移动

2、符号过滤


四、长度限制下的命令执行

7字符长度命令执行

(1)web命令可写

(2)web命令不可写

5字符长度命令执行

(1)环境有dir

(2)环境没有dir

4字符长度命令执行

(1)环境有dir

(2)环境无dir

(3)环境无dir且不出网


总结


CTF_第五节-PHP命令执行
https://lzw2004.github.io/2024/05/28/5/
作者
小志
发布于
2024年5月28日
更新于
2024年6月4日
许可协议