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 可控
- 参数值可控 1 和 www.baidu.com 可控
- 整体可控,但是要突破过滤
我们遇到命令执行,需要首先判断 可控位置 ,然后针对性的绕过
参数值可控
代码很简单,就是一个列目录,我么好传入一个参数 dir ,如果没有传入,则默认执行ls,现在传入其他命令来看看获取 敏感信息
但是要注意的是,在 linux 下两个命令放在一起要用特殊的符号来分割,如
- && 并列执行,短路
URL编码为 %26%26
- || 前后两条命令有一个执行成功就可以
URL编码为 %7c%7c
- ; 独立的两条命令执行
URL编码为 %3b
这个例子可以使用
1 |
|
这个Payload来获取敏感信息
命令可控
下一个例子
代码里多了一句 “ >/dev/null 2>&1”
只需要记住这个就是不给回显就好了
使用刚才说的 命令分割符号 来构建Payload
%09 代替空格
1 |
|
整体可控
1、黑名单过滤
(1)代替过滤的情况
这个属于直男型过滤,认为我只要吧关键字替换为空,那么就安全了
绕过也很简单,双写绕过即可,不如替换cat字符串为空,
所以可以直接提交 ccatat ,替换后,就变成 cat 了
虽然简单,但是实战中经常遇到。
利用条件也是仅仅替换为空,如果替换为其它字符串,大概率就走不通了,不如替换为 ABCcctata 替换后为 cABCat, 命令就会出错
(2)过滤特殊字符串(例如flag)的请况
当我们要读取 falg 时,遇到过滤了 flag 的关键字,我们可以使用通配符绕过。
通配符我们只需要掌握两个符号即可 问号? 和 星号*
* 星号表示任意长度的字符,最常见的一条命令处理多个文件
比如:批量 删除、移动