「学习笔记」RCE基础
操作系统连接符
;: 使多个命令按顺序执行,所有命令都会执行。&: 使命令在后台执行,可以同时执行多条命令。&&: 前面的命令执行成功时才执行后面的命令。|: 将前面命令的输出作为后一个命令的输入,前后命令都会执行,但只会显示后面命令的执行结果。||: 只要有命令执行成功就停止。
空格过滤绕过
- 大括号。
{cat,flag.txt}; $IFS代替空格。$IFS、${IFS}、$IFS$9- 重定向字符。
<,<>
cat<flag.php相当于 flag.php 不再是我们用键盘输入的了,而是一个字符串输入进cat中。<>的功能本质是靠<实现的。
%09,%20。
文件名过滤绕过
?,*: 通配符绕过,?在 Linux 系统里可以进行代替字母,仅代表单个字符串,但此字符串必须存在。*在 Linux 系统里可以进行模糊匹配,可以代替任何字符串。- 单引号、双引号绕过:
'',""在 Linux 中代表空。 - 反斜线绕过:把特殊字符去掉功能性,单纯表现为字符串。
- 特殊变量:
$1到$9,$@和$*等,输出为空。 - 内联执行:自定义字符串再拼接起来。
#a=f;d=ag;c=l;cat $a$l$d.txt - 利用 Linux 中的环境变量绕过。
echo f${PATH:5:1}${PATH:8:1}${PATH:66:1}${PATH:93:1}h${PATH:93:1}
# ${PATH:5:1} 使用 PATH 中第 5 个字符,只显示一个。
文件读取命令过滤
tac: 反向显示,从最后一行往前开始显示。more: 一页一页的显示档案内容。less: 与more类似。tail: 查看末尾几行。nl: 显示的时候,顺便输出行号。od: 以二进制的方式读取档案内容。xxd: 读取二进制文件。sort: 主要用于排序文件。uniq: 报告或删除文件中重复的行。file -f: 报错出具体内容。grep: 在文本中查找指定字符串。
编码绕过
绕过原理
命令编码后的字符串 \(\underset{绕过过滤}{\longrightarrow}\) 目标服务器 \(\underset{解码读取命令}{\longrightarrow}\) 执行命令
- base64 编码
- base32 编码
- HEX 编码 xxd:二进制显示和处理文件工具
- shellcode 编码(\(16\) 进制机器编码)
常用函数
system
system(string $command, int &$return_var = ?)
command: 执行 command 参数所指定的命令,并输出执行结果。
如果提供 return_var 参数,则外部命令执行后的返回状态将会被设置到此变量中。
exec
exec(string $command, array &$output = ?, int &$return_var = ?)
command: 要执行的命令,单独使用时只有最后一行结果,且不会回显。
output: 用命令执行的输出填充此数组,每行输出填充数组中的一个元素,即逐行填充数组。
借用 print_r 输出结果。
passthru
passthru(string $command, int &$return_var = ?)
command: 要执行的命令。
输出二进制数据,并且需要直接传送到浏览器。
shell_exec
shell_exec(string $command)
command: 要执行的命令。
环境执行命令,并且将完整的输出以字符串的方式返回,功能等同于反引号。
借用 echo、print 等输出结果。
popen
popen(string $cmd, string $mode)
cmd: 要执行的命令。
mode: 模式,r 表示阅读,w 表示写入。
fgets 获取内容 -> print_r 输出内容。
proc_open
proc_open($cmd, $descriptor_spec, $pipes, $cwd, $env_vars, $options)
descriptor_spec: 定义数组的内容。
pipes: 调用数组的内容。
pcntl_exec
pcntl_exec(string $path, $args = ?, array$envs = ?)
path: 必须是可执行二进制文件路径或一个在文件第一行指定了一个可执行文件路径头的脚本。
args: 是一个要传递给程序的参数的字符串数组。
envs: 是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value 格式的,key 代表要传递的环境变量的名称,value 代表该环境变量的值。
在当前进程空间执行制定程序。
程序的链接
静态链接:在程序运行前将要用到的库函数链接成一个完整的可执行程序。
装入时的动态链接:在装入内存时,边装入边链接。
运行时的动态链接:在程序执行过程中需要时才对它进行链接。
类似于工具,你去朋友家修电脑,静态链接是你带着工具箱去,动态链接是你空手去,用朋友家的工具箱,装入时的动态链接,是你提前列好要用什么,到了朋友家,在修理前先跟朋友要来,而运行时的动态链接是你在修理时缺啥要啥。
LD_PRELOAD
修改库文件,影响程序运行时的链接,定义在程序运行前优先加载的动态链接库,可覆盖正常的函数库。
就像工具,可以用自己更好的,也可以给别人用坏的(注入恶意程序)
长度绕过
相关命令
>: 用来创建文件,同时覆盖文本中原来的内容。echo benben > a,将echo输出的字符串输入到 a 文件中。>>: 追加内容。echo benben >> a,在原本文件内容后面追加 "benben"。\: 在没有写完的命令后面加\,可以将一条命令写在多行。ls -t: 将文件名按照时间顺序,由近及远。(只能精确到秒)ls -t>x: 创建文件 x,并把ls - t执行结果写入文件 x 中sh: shell 命令语言解释器,执行命令从标准输入读取或从一个文件中读取。dir: 与ls类似,按列输出,不换行。dir*: 将第一个文件的文件名当做命令来执行。$(dir*)rev: 可以反转文件每一行的内容。
长度绕过方式
写出期望执行的命令。
> 创建很短的文件名。
ls -t 按时间顺序列出文件名,按行储存。
\ 连接换行命令。
sh 从文件中读取命令。
当长度卡得很紧时,可以将内容一点一点先写进文件里,还可以用 *,rev,dir 等凑出命令。

浙公网安备 33010602011771号