cmd1 分析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <stdio.h> #include <string.h> int filter (char * cmd) { int r=0 ; r += strstr (cmd, "flag" )!=0 ; r += strstr (cmd, "sh" )!=0 ; r += strstr (cmd, "tmp" )!=0 ; return r; } int main (int argc, char * argv[], char ** envp) { putenv("PATH=/thankyouverymuch" ); if (filter(argv[1 ])) return 0 ; system( argv[1 ] ); return 0 ; }
程序很短,首先重写了PATH变量,然后对我们的参数进行检测,通过即可执行
需要注意的是重写变量后我们执行命令需要直接执行文件,例如不能直接 cat,需要/bin/cat
exp 那我们只需要绕过过滤就可以了,例如
cmd2 分析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <stdio.h> #include <string.h> int filter (char * cmd) { int r=0 ; r += strstr (cmd, "=" )!=0 ; r += strstr (cmd, "PATH" )!=0 ; r += strstr (cmd, "export" )!=0 ; r += strstr (cmd, "/" )!=0 ; r += strstr (cmd, "`" )!=0 ; r += strstr (cmd, "flag" )!=0 ; return r; } extern char ** environ;void delete_env () { char ** p; for (p=environ; *p; p++) memset (*p, 0 , strlen (*p)); } int main (int argc, char * argv[], char ** envp) { delete_env(); putenv("PATH=/no_command_execution_until_you_become_a_hacker" ); if (filter(argv[1 ])) return 0 ; printf ("%s\n" , argv[1 ]); system( argv[1 ] ); return 0 ; }
这里把系统变量全清了,同时加了一堆过滤,思考了半天没找着办法,主要是把/给过滤了,网上一搜发现骚操作还不少
进入根目录,用$(pwd)来代替/
使用ascii码\\57
来代替
使用command -p
来绕过
command -p 使用 PATH 环境变量的缺省值执行命令搜索;查找所有命令 PATH缺省值:export PATH=/usr/local/sbin/:/usr/local/bin:/sbin:/bin:/usr/bin:/root/bin
exp